相信大家以前应该接触过持续集成(Continuous integration)持续交付(continuous delivery)持续发布(continuous deployment)的概念,下面我们来说说三者的差异以及团队如何入手 CI/CD。
作者:猫神。
开发者尽量时时刻刻合并开发分支至主干分支。避免直到发布日才开始合并,掉入集成地狱。无论何时新分支集成至项目,持续集成可以自动化测试持续验证应用是否正常。
持续交付是持续集成的扩展,可以保证稳定的发布产品新特性。这意味着基于自动化测试,你可以也可以一键自动化发布。理论上,持续交付可以决定是按天,按周,按双周发布产品。如果确实希望能够享受持续交付的好处,那么应该尽快发布到新产品中。一旦出现问题时能尽早排除。
持续部署是持续交付的下一步。通过这一步,每个新特性都自动的部署到产品中。但是如果出现未通过的测试用例将会终止自动部署。持续部署可以加速用户反馈新特性,避免发布日带来的压力。开发可以着力于开发系统,开发结束后几分钟就可以触达到用户。
CI/CD 具体是个什么样的流程呢,如下图所示,差异仅在于是否自动部署。
现在开发都讲究投入产出比,那么 CI/CD 具体需要做些什么呢?
投入:
产出:
投入:
产出:
投入:
产出:
如果开发的是一个新项目,暂时还没有任何用户,那么每次提交代码后发布将会特别简单,可以随时随地发布。一旦产品开始开发后,就需要提高测试文化,并确保在构建应用程序时增加代码覆盖率。当您准备好面向用户发布时,您将有一个非常好的连续部署过程,在该过程中,所有新的更改都将在自动发布到生产环境之前进行测试。
如果正在开发的是一个老系统,就需要放慢节奏,开始打造持续集成&持续交付。首先可以完成一些简单可自动化执行的单元测试,不需要考虑复杂的端到端的测试。另外,应该尽快尝试自动化部署,搭建可以自动化部署的临时环境。因为自动化部署,可以让开发者去优化测试用例,而不是停下来联调发布。一旦开始按日发布产品,我们可以考虑持续部署,但一定要保证团队已经准备好这种方式,文档 & 售后支持 & 市场。这些步骤都需要加入到新产品发布节奏中,因为和用户直接打交道的是他们。
为了获得 CI 的所有好处,每次代码变更后,我们需要自动运行测试用例。我们需要在每个分支运行测试用例,而不是仅仅在主干分支。这样可以最快速的找到问题,最小化问题影响面。在初始阶段并不需要实现所有的测试类型。一开始可以以单元测试入手,随着时间扩展覆盖面。
并不是所有的测试都是对等的,实际运行中可以做些取舍。
单元测试实现起来既快成本又低,因为它们主要是对小代码块进行检查。另一方面,UI 测试实施起来很复杂,运行起来很慢,因为它们通常需要启动一个完整的环境以及多个服务来模拟浏览器或移动行为。因此,实际情况可能希望限制复杂的 UI 测试的数量,并依赖基础上良好的单元测试来快速构建,并尽快获得开发人员的反馈。
要采用持续集成,您需要对推回到主分支的每个变更运行测试。要做到这一点,您需要有一个服务来监视您的存储库,并听取对代码库的新推送。您可以从企业预置型解决方案和云端解决方案中进行选择。您需要考虑以下因素来选择服务器:
自动化测试是 CI 的关键,但同时也需要团队成员接受 CI 文化,并不是心血来潮晒两天鱼,并且需要保证编译畅通无阻。QA 可以帮助团队建设测试文化。他们不再需要手动测试应用程序的琐碎功能,现在他们可以投入更多的时间来提供支持开发人员的工具,并帮助他们采用正确的测试策略。一旦开始采用持续集成,QA 工程师将能够专注于使用更好的工具和数据集促进测试,并帮助开发人员提高编写更好代码的能力。
以上文章主要是说明团队实现 CI/CD 的取舍和可行性步骤。下面来说说希望 CI/CD 给笔者团队带来什么样的变化。目前笔者团队已经实现前端项目发布编译工程化,采用的是基于 webpack 的自建工具云构建模式。但现在面临的问题是 1. 交互的系统比较多,交互系统提供的接入源变更后,需要人工通知其他系统手动触发编译,而且每次手动编译都需要在本地切换到指定分支,然后手动触发云构建,2. 多人协作,分支拆分较细,需要手动合并分支,触发编译。整个流程冗长,而且中间存在人力沟通成本,容易产生沟通误差。所以首先希望解决的是 CI 自动化,当依赖变更后或者分支合并后,自动集成,自动编译。当然生产环境暂时还不敢瞎搞,但大部分重复编译的工作量主要集中在预发环境,所以手动部署生产环境的成本还是可以接受的。CI 自动化之前,需要提供系统之间交互的单元测试用例,每次 CI 后自动运行单元测试用例,最好能打通 QA 的测试用例,进行回归测试。流程对比如下:
可以看出引入CI后,我们的成本是需要搭建CI服务器,新增单元测试、打通回归测试案例,但前者可以加快系统编译效率,后者可以进一步的提升代码质量,减少回归测试时间,这些成本都是可以接受的。市面上已有很多开源持续集成工具,例如我们熟悉的Jenkins,还有TeamCity、Travis CI、GO CD、Bamboo、Gitlab CI、CircleCI……等等等等。目前还在继续调研中,这片文章应该会有第二篇,说说后续的实践和CD。