ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
[TOC] > [参考:阮一峰](http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html) ## 概述 ### 1. 持续集成 - 持续集成指的是,频繁地(一天多次)将代码集成到主干 - 核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成 与持续集成相关的,还有两个概念,分别是持续交付和持续部署。 ### 2. 持续交付 持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段 它强调的是,不管怎么更新,软件是随时随地可以交付的 ### 3. 持续部署 持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。 持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。 ## 流程 ![](https://img.kancloud.cn/e1/ae/e1ae39ea80c19c3d91459fa1200336fd_1080x427.png) ![](https://img.kancloud.cn/b0/3b/b03bc5ae5de238948d92fb53989b54a6_929x300.png) ### 1. 提交 流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。 ### 2. 测试(第一轮) 代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试 测试有好几种: 1. 单元测试:针对函数或模块的测试 2. 集成测试:针对整体产品的某个功能的测试,又称功能测试 3. 端对端测试:从用户界面直达数据库的全链路测试 第一轮至少要跑单元测试 ### 3. 构建 交付后,就先进行构建(build),再进入第二轮测试。 所谓**构建**,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等 <br/> 常用的构建工具如下: * [Jenkins](http://jenkins-ci.org/) * [Travis](https://travis-ci.com/) * [Codeship](https://www.codeship.io/) * [Strider](http://stridercd.com/) Jenkins和Strider是开源软件,Travis和Codeship对于开源项目可以免费使用 ### 4. 测试(第二轮) 第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑 ### 5. 部署 - 通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact),将这个版本的所有文件打包存档,发到生产服务器 - 生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号链接(symlink)指向这个目录,然后重新启动应用 这方面的部署工具有[Ansible](http://www.ansible.com/),[Chef](https://www.chef.io/chef/),[Puppet](https://puppetlabs.com/) ### 6. 回滚 一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是**修改一下符号链接**,指向上一个版本的目录 ## CI 的流程实践 CI 主要把关的是代码活动,一般有两个触发点: 1. 代码合入主干前,触发 CI 测试,目的是校验本次合入是否符合质量预期,如果不符合,那么不准代码合入主干; 2. 代码合入主干后,触发 CI 测试,目的是校验最新的主干分支是否符合质量预期; ### Pre-Merge 触发过程 1. 开发代码递交 Merge Request ( github 上习惯叫做 PR,gitlab 上习惯叫做 MR ) 2. MR 自动触发 CI 构建事件 3. 运行 静态检查,Merge 检查,单元测试,冒烟测试,集成测试,全部通过之后,代码才允许 Merge 合入主干分支; 4. 进行下一步软件活动 ### Post-Merge 触发过程 1. 管理员审核 Merge Request 通过,代码合入主干,触发 Post-Merge 事件; 2. CI 平台收到事件,自动进行 CI 构建; 3. 构建完成,进行下一步软件活动;