CI/CD 概念,流程,工具以及k8s 现阶段
概念视角
Continuous Integration (CI)

持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
目标:
-
就是让产品可以快速迭代,同时还能保持高质量
预期效果:
-
快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
-
防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
Continuous Delivery (CD)

持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
目标
-
频繁地将软件的新版本,交付给质量团队或者用户,以供评审。
预期效果
-
不管怎么更新,软件是随时随地可以交付的。
Continuous Deployment

持续部署则是在持续交付的基础上,把部署到生产环境的过程自动化。
前提:
能自动化完成测试、构建、部署等步骤。
目标:
代码在任何时刻都是可部署的,可以进入生产阶段。
!!!区分两个CD

流程视角
1、提交
流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。
2、测试(第一轮)
代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
测试有好几种。
单元测试:针对函数或模块的测试
集成测试:针对整体产品的某个功能的测试,又称功能测试
端对端测试:从用户界面直达数据库的全链路测试
第一轮至少要跑单元测试。
3、构建
通过第一轮测试,代码就可以合并进主干,就算可以交付了。
交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。
常用的构建工具如下。
4、测试(第二轮)
构建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时构建步骤也要移到第一轮测试前面。
第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。
需要强调的是,新版本的每一个更新点都必须测试到。如果测试的覆盖率不高,进入后面的部署阶段后,很可能会出现严重的问题。
5、部署
通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包( tar filename.tar * )存档,发到生产服务器。
生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号链接(symlink)指向这个目录,然后重新启动应用。这方面的部署工具有Spinnaker,Ansible,Chef,Puppet等。
6、回滚
一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。
工程学 && 商业视角
-
代码越早push出去,用户能越早用到,快就是商业价值;
-
用户越早用到就越早反馈,团队越早得到反馈,好坏都是有价值的输入;
-
用户不反馈,说明我们做了用户不想要的东西(通过用例跟踪)或者marketing没做好,能帮助产品市场人员调整策略;
-
代码库存越是积压,就越得不到生产检验,积压越多,代码间交叉感染的概率越大,下个release的复杂度和风险越高;
-
代码库存越多,workflow的包袱越重,管理成本越大,说敏捷越可笑。
Devops


CI/CD tools example:




CI/CD/CD tool practice advice
-
on your requirements,
-
on the techstack you have and
-
on how you handle your daily workflow.
CI/CD in kubernetes Example:
Rancher CI/CD pipeline:
组件构成
-
Jenkins:管道的构建引擎。
-
Docker Registry:开箱即用,构建发布步骤的默认目标是内部Docker仓库。但是,您可以进行配置以推送到远程仓库。内部Docker Registry只能从群集节点访问,用户无法直接访问。镜像不会在管道的生命周期之后持久存在,并且只应在管道运行中使用。如果您需要在管道运行之外访问您的镜像,请推送到外部仓库。
-
Minio:Minio存储用于存储管道执行的日志。
Others:支持多 code source(Github/Gitlab/SVN…)
ps: 最近CNCF成立了CDF(持续交付基金会)有兴趣可以关注
浙公网安备 33010602011771号