CI/CD 概念,流程,工具以及k8s 现阶段

概念视角

Continuous Integration (CI)

 

持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。

目标:

  • 就是让产品可以快速迭代,同时还能保持高质量

预期效果:

  • 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。

  • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

 

Continuous Delivery (CD)

持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。

目标

  • 频繁地将软件的新版本,交付给质量团队或者用户,以供评审。

预期效果

  • 不管怎么更新,软件是随时随地可以交付的。

 

Continuous Deployment

 

持续部署则是在持续交付的基础上,把部署到生产环境的过程自动化。

 

前提:

能自动化完成测试、构建、部署等步骤。

目标:

代码在任何时刻都是可部署的,可以进入生产阶段。

 

 

!!!区分两个CD

流程视角

1、提交

流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。

2、测试(第一轮)

代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。

测试有好几种。

单元测试:针对函数或模块的测试

集成测试:针对整体产品的某个功能的测试,又称功能测试

端对端测试:从用户界面直达数据库的全链路测试

第一轮至少要跑单元测试。

3、构建

通过第一轮测试,代码就可以合并进主干,就算可以交付了。

交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。

常用的构建工具如下。

Jenkins

Travis

Codeship

Strider

4、测试(第二轮)

构建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时构建步骤也要移到第一轮测试前面。

第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。

需要强调的是,新版本的每一个更新点都必须测试到。如果测试的覆盖率不高,进入后面的部署阶段后,很可能会出现严重的问题。

5、部署

通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包( tar filename.tar * )存档,发到生产服务器。

生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号链接(symlink)指向这个目录,然后重新启动应用。这方面的部署工具有SpinnakerAnsibleChefPuppet等。

6、回滚

一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。

工程学 && 商业视角

  • 代码越早push出去,用户能越早用到,快就是商业价值;

  • 用户越早用到就越早反馈,团队越早得到反馈,好坏都是有价值的输入;

  • 用户不反馈,说明我们做了用户不想要的东西(通过用例跟踪)或者marketing没做好,能帮助产品市场人员调整策略;

  • 代码库存越是积压,就越得不到生产检验,积压越多,代码间交叉感染的概率越大,下个release的复杂度和风险越高;

  • 代码库存越多,workflow的包袱越重,管理成本越大,说敏捷越可笑。

 

 

Devops

 

 

CI/CD tools example:

Travis CI

 

Jenkins

 

Spinnaker

 

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:

GitOps

Rancher CI/CD pipeline:

https://github.com/anypm/anypm-kubernetes-tutorials-series/blob/master/Building-an-auto-CI-CD-Pipeline-with-Kubernetes-Rancher.md

 

组件构成

  • Jenkins:管道的构建引擎。

  • Docker Registry:开箱即用,构建发布步骤的默认目标是内部Docker仓库。但是,您可以进行配置以推送到远程仓库。内部Docker Registry只能从群集节点访问,用户无法直接访问。镜像不会在管道的生命周期之后持久存在,并且只应在管道运行中使用。如果您需要在管道运行之外访问您的镜像,请推送到外部仓库。

  • Minio:Minio存储用于存储管道执行的日志。

 

Others:支持多 code source(Github/Gitlab/SVN…)

 

ps: 最近CNCF成立了CDF(持续交付基金会)有兴趣可以关注

posted on 2019-05-20 14:33  世道小侠  阅读(1418)  评论(0)    收藏  举报

导航