CI-持续集成 ( Continuous integration)

互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成

说白了,持续集成就是软件发布的一套标准流程,遵循这套流程,可以让产品可以快速迭代,同时还能保持高质量。
达成频繁地(一天多次)将代码集成到主干的,并能够快速发现错误的效果。
好处:

  1. 快速发现错误。
  2. 防止分支大幅偏离主干。

核心措施-自动化测试:它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

CD-持续交付 (Continuous delivery)

持续交付指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。

CD-持续部署 ( Continuous deployment)

持续部署是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。

CI / CD 实现流程

简单的说,就是在本地更改代码—>git push推送到代码托管—>⾃动安装依赖,打包测试部署等(开发环境⼀般 ⾃动,⽣产环境⼀般是需要⼿动点击按钮上线)
如下图所示:
image.png

  1. 代码提交
    • 开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)
  2. 测试(第一轮)
    • 代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
    • 测试有好几种:
      • 单元测试:针对函数或模块的测试
      • 集成测试:针对整体产品的某个功能的测试,又称功能测试
      • 端对端测试:从用户界面直达数据库的全链路测试 第一轮至少要跑单元测试。
  3. 构建 通过第一轮测试,代码就可以合并进主干,就算可以交付了。交付后,就先进行构建(build)。 常用构建工具如下:
    • Jenkins - 开源
    • Travis - 开源
    • Codeship - 对于开源项目可以免费使用
    • Strider - 对于开源项目可以免费使用 它们都会将构建和测试,在一次运行中执行完成。
  4. 测试(第二轮) 第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。
    • 第二轮更全面,是第一轮的补充——也防止开发者不按规范提交代码(还记得git commit -n参数吗?)
  5. 部署 通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。 生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号链接(symlink)指向这个目录,然后重新启动应用。 这方面的部署工具有
    • docker
    • Ansible
    • Chef
    • Puppet