持续交付2.0 持续集成
适合谁:开发工程师、技术负责人、持续集成实践者
读完能拿到:一套持续集成的完整实践框架,掌握六步提交法的纪律要求,理解速度与质量的权衡原则,以及持续优化的方法论
一、引言:持续集成是交付能力的"发动机"
乔梁在第九章开宗明义地指出:持续集成是持续交付的发动机。如果说部署流水线是持续交付的"高速公路",那么持续集成就是在这条路上奔跑的"引擎"------它决定了你的交付速度有多快、质量有多稳。
持续集成(Continuous Integration, CI)不是什么新概念------早在20世纪80年代,微软Office团队就开始使用"每日构建"(Daily Build)。但乔梁在书中的贡献在于,他将持续集成从一种工程实践升华为团队协作纪律 ,提出了"六步提交法"这套可操作的规范,并深入探讨了持续集成中最核心的矛盾------速度与质量的权衡 。

关键认知:持续集成不是工具问题,而是纪律问题。再强大的CI工具,如果团队不遵守提交纪律,也发挥不出应有的效果。
二、持续集成的本质:快速发现集成问题
2.1 什么是持续集成?
持续集成是一种软件开发实践,团队成员频繁地将他们的工作成果集成到共享代码库中(通常每人每天至少提交一次),每次提交后自动触发包含自动化验证集的构建任务,以便尽早发现集成问题。
持续集成的核心目标有三个:
- 尽早发现集成错误:代码集成越早,定位问题成本越低
- 保持主干始终可构建:主干(main/master)永远是健康的、可发布的
- 缩短反馈周期:开发者从提交到知道结果,越快越好
2.2 持续集成vs每日构建
| 维度 | 每日构建(Daily Build) | 持续集成(CI) |
|---|---|---|
| 集成频率 | 每天一次 | 每次提交都触发 |
| 反馈速度 | 第二天才知道昨晚的问题 | 几分钟内就知道 |
| 构建环境 | 可能不干净 | 必须是干净的独立环境 |
| 测试范围 | 通常是冒烟测试 | 完整的自动化验证集 |
| 失败处理 | 等到第二天修复 | 立即修复或回滚 |
关键认知 :每日构建是持续集成的前身,两者最大的区别在于反馈速度。持续集成追求的是"分钟级反馈",而不是"天级反馈"。
三、六步提交法:持续集成的纪律保障
乔梁在第九章提出的最大亮点之一,就是六步提交法 。这不是一套工具配置指南,而是一套团队行为规范------任何与代码相关的操作,都应该按照这六个步骤来执行。
3.1 六步提交法详解
第一步:检出最近成功的代码
工程师开始工作时(例如工作日早上刚开工),首先要从集成构建服务器上检出最近一次成功构建的代码。这一步的关键在于:
- 不要基于自己昨天的代码继续开发------昨天的代码可能已经过时
- 检出的代码必须是已知可构建、可测试的基线
- 确保你从正确的起点开始工作
为什么重要:这避免了"在我的机器上是好的"这类问题。如果你基于过时的代码开发,当你提交时很可能会因为与其他人的变更冲突而失败。
第二步:个人构建
在本地环境中,对自己开发的代码进行编译、链接、打包,并运行个人级别的自动化测试(通常是单元测试和代码扫描)。这一步的关键在于:
- 个人构建必须在干净的环境中进行(最好是独立虚拟机或容器)
- 确保你的代码独立可构建,不依赖其他人的未完成代码
- 运行完整的个人测试套件,不仅仅是你修改的部分
为什么重要:个人构建是提交前的最后一道防线。如果个人构建都通不过,根本没有资格提交到共享代码库。
第三步:提交
将完成的代码提交到共享版本控制系统。这一步的关键纪律包括:
- 每次提交应该是一个完整的任务------不要提交半成品
- 小步提交------不要攒几天的代码一次性提交
- 提交前确保个人构建通过------这是硬性纪律
- 关注代码规范和静态扫描------动静态扫描应在提交前完成
为什么重要:频繁的、小粒度的提交让集成问题更容易定位。如果攒了一周才提交一次,出了问题很难知道是哪天的代码导致的。
第四步:构建验证
代码提交后,自动化构建系统会在干净的构建环境中重新检出代码,执行完整的构建和测试流程。这一步的关键在于:
- 构建环境必须干净且受控------不能使用开发人员的本地环境
- 执行与个人构建相同的内容,确保提交是完整且无质量问题的
- 构建时间应控制在10分钟以内------过长的构建时间会打击开发者的积极性
为什么重要:构建验证是集成质量的第一道闸门。它确保提交的代码在独立环境中也能正确构建和测试。
第五步:验证
构建成功后,自动执行更全面的测试(集成测试、系统测试、性能测试等),验证代码的功能和质量。这一步的关键在于:
- 测试应该是自动化的,不需要人工干预
- 测试覆盖应该渐进式加深------从单元测试到集成测试到系统测试
- 测试结果应该及时反馈给开发者
为什么重要:构建成功不代表功能正确。验证阶段确保代码不仅在技术上可构建,而且在功能上满足需求。
第六步:部署
验证通过后,将制品部署到预发布环境或生产环境(取决于你的发布策略)。这一步的关键在于:
- 部署应该是自动化的,不是手动的
- 部署过程应该可回滚------出现问题可以快速恢复
- 部署后应该持续监测------确保部署后的系统运行正常
为什么重要:部署是持续集成的最终目标------产出可交付的软件制品。如果部署环节出问题,前面的所有努力都白费了。

3.2 六步提交法的核心纪律
| 纪律 | 说明 | 违反后果 |
|---|---|---|
| 小步提交 | 每次提交是一个完整的、小的变更 | 集成问题难以定位,冲突频发 |
| 完整代码 | 提交前确保个人构建通过 | 污染主干,影响团队所有人 |
| 不影响已有功能 | 提交不得破坏现有功能 | 回归测试失败,信任度下降 |
| 关注代码规范 | 动静态扫描是必经之路 | 代码质量持续恶化 |
| 10分钟构建 | 提交构建应在10分钟内完成 | 反馈延迟,开发者失去耐心 |
| 失败立即修复 | 10分钟内修复失败,否则回滚 | 主干污染,阻塞团队 |
关键认知 :六步提交法不是"建议",而是纪律。纪律不是束缚,而是团队高效协作的保障。
四、速度与质量的权衡:持续集成的核心矛盾
持续集成面临的最大挑战,是速度与质量的权衡。跑得快(缩短构建时间)和跑得好(充分测试)之间存在天然张力。
4.1 速度优先 vs 质量优先
速度优先策略:
- 缩短构建时间(10分钟以内)
- 减少测试范围(只跑核心测试)
- 快速反馈,快速迭代
- 风险:可能遗漏边缘场景的bug
质量优先策略:
- 完整的测试覆盖
- 深度的静态分析和代码扫描
- 严格的性能和安全测试
- 风险:构建时间长,反馈延迟
乔梁的观点很明确:持续集成应该在保证基本质量的前提下,追求最快的速度。这不是二选一,而是要建立分层的质量保障体系。

4.2 分层测试策略
| 层级 | 测试类型 | 执行频率 | 预计耗时 | 目的 |
|---|---|---|---|---|
| L1 | 个人构建+单元测试 | 每次提交 | <1分钟 | 快速发现个人代码问题 |
| L2 | 集成测试 | 每次构建验证 | 1-5分钟 | 发现模块间集成问题 |
| L3 | 系统测试 | 每日多次 | 5-10分钟 | 验证端到端功能 |
| L4 | 性能/安全测试 | 每日/每周 | 10-30分钟 | 非功能性质量保障 |
关键认知 :不是所有测试都应该在每次提交时运行。分层策略的核心思想是------快速失败的测试先跑,耗时的测试后跑。

4.3 构建时间优化的实践技巧
- 并行化:能同时执行的测试任务一定要并行,不要串行
- 缓存:缓存依赖包、编译中间产物,减少重复工作
- 增量构建:只重新构建和测试受影响的模块
- 测试分级:核心测试先跑,边缘测试后跑
- 环境优化:使用SSD、更快的CPU、容器化构建环境
实战经验:Google的Bazel构建系统通过增量构建和分布式缓存,将大型项目的构建时间从数小时缩短到几分钟。
五、持续集成的持续优化
持续集成不是一次性配置,而是一个持续优化的过程。乔梁强调了几个关键的优化方向。
5.1 构建失败的处理纪律
当构建验证失败时,团队应该遵循以下纪律:
- 立即通知:构建失败后,相关开发者应在第一时间收到通知
- 10分钟修复原则:如果能在10分钟内修复,立即修复
- 否则回滚:如果不能快速修复,回滚引起失败的代码
- 禁止覆盖:提交构建失败后,禁止团队成员提交新代码,也不许其他人检出该代码
- 根本原因分析:修复后必须进行根因分析,防止同类问题再次发生
关键认知 :构建失败不是"小问题",而是最高优先级的事件。主干的健康高于一切。
5.2 持续优化的关键指标
| 指标 | 说明 | 目标值 |
|---|---|---|
| 构建频率 | 每天成功构建的次数 | >50次 |
| 平均构建时间 | 从提交到构建完成的时间 | <10分钟 |
| 构建成功率 | 成功构建占总构建的比例 | >95% |
| 平均修复时间 | 从构建失败到修复完成的时间 | <10分钟 |
| 测试覆盖率 | 自动化测试覆盖的代码比例 | >80% |
5.3 持续优化的心态
持续集成优化的核心心态是:消除一切浪费。
- 等待构建结果 = 浪费
- 修复集成问题 = 浪费
- 手动部署 = 浪费
- 重复测试 = 浪费
关键认知:持续优化的本质,是让团队把精力花在创造价值的地方,而不是花在修复问题的地方。
六、业务落地:行动计划
6.1 如果你还没有持续集成
- 搭建最小可用CI:选择一个CI工具(Jenkins/GitLab CI/GitHub Actions),配置最基本的构建和测试流程
- 建立主干分支:选定一个主干分支,所有人都从这里开发
- 制定提交纪律:团队约定六步提交法,严格执行
- 设定构建时限:确保构建时间在10分钟以内
6.2 如果你已经有持续集成
- 审计构建时间:测量当前构建的各个环节耗时,找出瓶颈
- 优化测试策略:确保分层测试策略到位,快速测试先跑
- 监控构建指标:建立构建频率、成功率、修复时间等指标的看板
- 培养修复文化:构建失败时,团队第一反应是修复而不是绕过
6.3 如果你正在优化持续集成
- 引入并行化:将串行的测试任务改为并行执行
- 实施增量构建:只重新构建和测试受影响的模块
- 加强代码扫描:将静态分析和安全扫描纳入提交前检查
- 建立反馈机制:确保开发者能在几分钟内收到构建结果
七、总结复盘
核心收获
- 持续集成是持续交付的发动机------它决定了交付的速度和质量
- 六步提交法是团队纪律------检出→个人构建→提交→构建验证→验证→部署,每一步都不能跳过
- 速度与质量不是二选一------通过分层测试策略,在快速反馈和充分验证之间取得平衡
- 构建失败是最高优先级事件------10分钟修复原则和回滚纪律是主干健康的关键保障
- 持续优化永无止境------消除一切浪费,让团队专注于创造价值
自我提问
- 我的团队是否遵循了六步提交法?有没有人跳过个人构建直接提交?
- 我们的构建时间是多少分钟?能否控制在10分钟以内?
- 当构建失败时,团队的第一反应是什么?是立即修复还是继续提交?
- 我们的测试是否分层?快速测试和耗时测试是否合理分配?
- 我们是否在持续优化构建流程?还是已经停滞不前?
延伸阅读
- Martin Fowler, "Continuous Integration" ------ CI概念的奠基之作
- Jez Humble, 《持续交付》------持续交付1.0的经典之作
- Google Engineering Practices Documentation ------ 谷歌的CI实践
- 《DevOps之十倍速原则》------乔梁关于持续集成的深度分享
附录:核心概念速查表
| 概念 | 一句话解释 |
|---|---|
| 持续集成 | 团队成员频繁提交代码,每次提交自动触发构建和测试 |
| 六步提交法 | 检出→个人构建→提交→构建验证→验证→部署的团队行为规范 |
| 主干分支 | 所有集成的中心代码仓库,必须始终保持可构建状态 |
| 构建验证 | 在干净环境中重新执行构建和测试,确保提交质量 |
| 分层测试 | 按速度和质量要求分层执行测试的策略 |
| 10分钟修复 | 构建失败后10分钟内修复,否则回滚的纪律 |
| 增量构建 | 只重新构建和测试受影响的模块,缩短构建时间 |
| 快速失败 | 先跑快速测试,快速发现问题,节省时间 |
最后一句话:持续集成不是配置一个CI工具就结束了------它是团队每天的纪律实践。六步提交法看似简单,但真正做到"每次提交都完整、每次失败都修复"却需要极大的自律。从今天开始,审视你的团队:你们是在持续集成,还是只是在"偶尔构建"?真正的持续集成,体现在每一次提交的质量承诺上。

