分析持续集成

已完成

持续集成是 DevOps 八项功能中的一种。

了解持续集成的必要性

1999 年 9 月 23 日,火星气候轨道飞行器收起了其太阳能电池组,以便在暂时下降到火星上层大气中时,可保护其免受损害。

在成功进入轨道后,这个飞行器预计在之后几年会向地球传送火星的照片。 但不幸的是,飞行器在火星大气层中燃烧起来。

由第三方提供的地面控制软件中出现了一个错误,它在计算值时使用了英制单位,即磅秒。 而由 NASA 构建的软件预期该值采用公制单位,即牛顿秒。 由于这些数值没有得到正确换算,在数百万英里的航程中,飞行器定位的微小差异致了严重的后果。

尽管 NASA 当时的编码标准要求使用公制单位,但质量保证部门没有注意到外部软件使用的是英制单位。 由于文件格式错误和其他错误,计算是手工完成的,而不是使用提供的软件完成的。 这种情况就是需要持续集成的一个例子。

探索持续集成

持续集成是一种“思维方式”和“团队策略”。 除此之外,作者兼演讲者马丁·福勒表示,持续集成是一种软件开发实践,在此过程中团队成员会频繁集成他们的工作,通常每个人至少每天集成一次,从而导致每天发生多次集成。

每个集成都通过自动生成(包括测试)进行验证,以尽快检测到集成错误。

如果操作正确,此方法可通过尽早在过程中发现问题来减少集成问题。

Diagram shows the difference between continuous delivery and continuous deployment. The stages are the same in both cases: code done - unit tests - integrate - acceptance test - deploy to production. For continuous delivery, deployment to production happens manually. For continuous deployment, it's automatic. Continuous integration spans the first three stages for both continuous delivery and continuous deployment.

持续集成的“目标”是

注意

请注意持续集成的目标中是如何纳入持续协作、持续交付和持续质量保证的!

但是,如果没有持续集成,会发生什么? 缺乏持续集成通常会导致:

  • 长开发周期
    • 非编译代码
    • 在任何时候,源代码都可能出错而无法正常工作
    • 代码冻结
  • 生成失败/错误频发
    • 长时存在的分支,造成多日的合并工作
    • 源代码管理中缺少代码
    • 在开发周期后期发现安全漏洞
    • 大量技术债务
    • 无代码或代码覆盖率低
    • 整体质量下降
  • 交流和协作受限
    • 代码未遵循编码标准
    • 没有或很少进行代码评审
    • 开发周期后期才进行测试
    • 大多数情况下,甚或完全是手动操作

集成点是用于改进系统的快速反馈循环。 集成点的执行时间出现偏差时,项目会出现问题。 下面是 Dantar Oosterwal 在《精益计算机》一书中对它们的描述

集成点的主要作用是控制产品的开发。 它们是改进系统的手段。 集成点的执行时间出现偏差时,项目会出现问题。

Dantar Oosterwal,《精益计算机》

© Scaled Agile, Inc.

如果想知道你的团队是否确实在进行持续集成,可借助下面的问题来确认。

  • 是否所有开发人员都执行基于 trunk 的开发?
  • 是否对 trunk 的每一次更改都会启动生成进程?
  • 当生成和测试失败时,团队是否能在几分钟内修复生成?

持续集成的存在与否也会影响性能。 由 Nicole Forsgren、Jez Humble 和 Gene Kim 撰写的《DevOps 科学 - 加速 - 如何构建和扩展高效技术组织》一书中收集和分析的数据显示,当低效执行者进入市场的速度增加时,他们的质量就会下降

但高效执行者可以在提高进入市场速度的同时保持质量。 他们的部署周期较短(且不太复杂),并使用持续集成来快速解决问题,从而提高流程和效率。

2017 高效执行者 中效执行者 低效执行者
部署频率 每天多个 1 周 - 1 个月 1 周 - 1 个月
更改所需的提前期 < 1 小时 1 周 - 1 个月 1 周 - 1 个月
MTTR < 1 小时 < 1 天 1 天 - 1 周
更改失败率 0-15% 0-15% 31-45%