阮一峰:什么是持续集成?互联网软件的开发和发布已经形成了一套标准流程,其中最重要的部分就是持续集成(CI)。本文简要介绍了持续集成的概念和实践。1、持续集成的概念是指频繁(一天多次)将代码集成到主干中。它有两个主要优点。(1)快速查找错误。每完成一点更新,就集成到主干中,可以快速发现错误,更容易定位错误。(2)防止枝条大大偏离主干。如果不经常集成,不断更新主干,会导致以后集成难度加大,甚至难以集成。持续集成的目的是让产品在保持高质量的同时快速迭代。其核心措施是代码在集成到主干之前必须通过自动化测试。只要单个测试用例失败,就无法集成。MartinFowler说,“持续集成并没有消除错误,而是让它们很容易被发现和改正。”与持续集成相关,有两个概念,即持续交付和持续部署。2.持续交付持续交付(Continuousdelivery)是指将软件的新版本频繁交付给质量团队或用户审查。如果审核通过,代码就会投入生产。持续交付可以看作是持续集成的下一步。它强调无论如何更新,软件都可以随时随地交付。3、持续部署持续部署(continuousdeployment)是持续交付的下一步,意思是代码通过review后,自动部署到生产环境。持续部署的目标是代码在任何时候都可以部署并准备好投入生产。持续部署的前提是自动化测试、构建和部署的步骤。它和持续交付的区别可以参考下图。(图片来源)4.流程根据持续集成的设计,从代码提交到生产的整个流程有以下几个步骤。4.1提交流程的第一步是开发者将代码提交到代码仓库。所有后续步骤都从提交本机代码开始。4.2测试(第一轮)代码仓库配置了commit操作的钩子。只要将代码提交或合并到主干中,就会运行自动化测试。有几种类型的测试。单元测试:针对功能或模块的测试集成测试:针对产品整体的某个功能进行测试,也称为功能测试端到端测试:从用户界面到数据库的全链路测试第一轮必须在最少的单元测试。4.3第一轮测试通过后,即可将代码合并到主干中,即可交付。交付后,先构建(build),然后进入第二轮测试。所谓构建,是指将源代码转化为实际可以运行的代码,如安装依赖、配置各种资源(样式表、JS脚本、图片)等。常用的构建工具如下。JenkinsTravisCodeshipStriderJenkins和Strider都是开源软件,Travis和Codeship对于开源项目都是免费的。他们都在一次运行中构建和测试。4.4测试(第二轮)施工完成后,将进行第二轮测试。如果第一轮已经考完所有考试内容,第二轮可以省略。当然,此时也应该将构建步骤移到第一轮测试之前。第二轮是综合测试。单元测试和集成测试都将运行。如果可能,还将进行端到端测试。所有的测试都以自动化为主,少数不能自动化的测试用例必须手动运行。需要强调的是,新版本的每一个更新点都要进行测试。如果测试的覆盖率不高,进入后期部署阶段后很可能会出现严重的问题。4.5部署已通过二轮测试,目前代码为可直接部署的版本(工件)。将这个版本的所有文件归档(tarfilename.tar*)并发送到生产服务器。生产服务器将文件打包,解压到本地目录,将运行路径符号链接指向该目录,然后重启应用程序。这方面的部署工具有Ansible、Chef、Puppet等。4.6回滚当前版本一旦出现问题,需要回滚到上一版本的构建结果。最简单的方法是修改符号链接指向上一版本的目录。5.参考链接GergelyNemeth,Node.js应用程序Codeship的持续部署,持续集成要点(完)
