专业书籍精读 · 持续交付 · 第 15 章
Continuous Delivery · Ch 15 · Jez Humble & David Farley · 2010
你手机上有的 App 每周更新一次,有的一年才更新两次。差别通常不在程序员手快不快,而在这家公司里「放行上线」这件事是怎么办的。《持续交付》前面十四章讲的全是技术——怎么搭自动化流水线、怎么自动跑测试、怎么管环境。最后这一章掉头问了一个更尴尬的问题:技术都会了,为什么公司还是发不快?
想象一家工厂花大价钱装了全自动流水线,却规定每出一批货都要厂长亲自到场、在一张三十页的表上签字。流水线转得再快,出货速度也只等于厂长签字的速度。很多公司就是这个处境:自动化服务器天天在跑,上线仍是一场要凑齐二十个人、挑周六凌晨干的大工程。
传统上线像一场手术:一份几十步的手工清单,一群平时不碰这套系统的人照着做,做错了也没法干净地退回去。更要命的是,负责「别出事」的那些角色——运维、安全、合规——通常直到最后一刻才被叫进来。他们唯一的自保手段就是让流程更重:多几轮签字、多几份文档。于是发布更慢、每次攒的改动更多、风险更大,下次更不敢发——一个越拧越紧的死结。
第一把是尺子。作者把「一家公司离持续交付有多远」拆成六条线分别看:构建、环境与部署、发布与合规、测试、数据、配置。每条线从「乱来」到「持续改进」分五格,你如实在每条线上标一个点,连起来是一条锯齿线。关键不是求总分高,而是看哪条线最靠左,先补那一条——六条一起上,通常一条也补不动。
第二把是换掉审批。书里最反直觉的一句是:想让审计满意,别去加签字,去加自动化。一个签好的字只能证明「有人签过」;而一条完整的流水线能证明更硬的东西——线上跑的这个版本,是哪次代码改动、由哪次构建产出、过了哪些测试、谁在什么时候按的上线键。这本账是机器顺手记下的,想赖也赖不掉。
先别谈「三年内达到最高级」。找到最疼的那条线,改一格,看指标有没有动,再改下一格。风险管理也不是写更厚的文档,而是在对的时间点问对的问题:我们怎么知道这版做完了?谁有权部署?出事回滚要多久?测试环境和生产到底像不像?——这几个问题答不上来,文档写多厚都没用。代价也得说清:这类改造在见效之前通常会先让团队慢上一阵子,新流程要磨合、旧习惯要改,撑不过这段的团队往往半途而废。
挡住持续交付的很少是技术,而是组织里「谁敢放行」这件事。这一章给的两个答案:用一把六条线的尺子找到最短板、一次只补一格;以及把手工签字换成自动留痕的流水线——它才是审计真正想要的那种证据。
想看成熟度网格、证据链示意图与具体选型对比? → 切到精读版
这是《持续交付》全书唯一一章不讲技术的:前十四章把部署流水线(deployment pipeline)造了出来,这一章讲怎么把它推进一个真实组织。它交出三件东西——一张按六个实践域展开的成熟度模型(maturity model)用来定位短板、一条把运维与合规提到最前的项目生命周期、一套把风险管理落成具体提问的清单——并给出全书最反直觉的主张:面对审计与合规,自动化比文档更有说服力。
本章是 Part III「交付生态」的收官,也是全书结尾:上承 Ch13(组件与依赖)、Ch14(版本控制)这些工程细节,把话题从「怎么造」拉回「怎么推行」。它对应现实里最常见的一类处境——一家已经装了 CI 服务器、测试也在自动跑,却仍然一个季度才发一次版的中大型企业。
流水线是技术物件,放行却是组织决定。前十四章的所有实践,最终都要穿过一道非技术的闸门:谁批准、凭什么证据批准、出事谁负责。这一章处理的就是技术实践与组织现实之间的那道落差。
不解决会怎样?书里点到三种典型烂尾:
给个量级锚:传统企业一次「大版本」发布窗口常是 4–8 小时、20 人以上、排在周六凌晨,外带一份几十上百步的手工清单;按本书标准做到位的团队,一次部署是分钟级、由提交自动触发、单人即可。差的是两三个数量级,不可能靠「大家再细心一点」补上。
是什么:一张 6×5 的网格。六个实践域是构建与持续集成、环境与部署、发布管理与合规、测试、数据管理、配置管理;五个级别从低到高是 −1 退化(流程不可重复、被动救火)、0 可重复(有文档、部分自动化)、1 一致(自动化覆盖整个生命周期)、2 可量化管理(流程被度量与控制)、3 优化(持续改进流程本身)。
直觉:它不是给公司打一个总分,而是六张体检单。真实团队几乎从不在一条水平线上——很可能构建已经到了 1 级,而「环境与部署」还在 −1 级:生产环境是历年手工改出来的,没人敢重建。
机制:如实在每条线上标一个点,连成锯齿线,然后从最靠左的那条开始改,一次只推一格。
为什么这样设计:交付能力受最弱环节约束——测试再自动化,只要环境还得手工搭,前置时间仍然按天算。「一次一格」则是为了让每次改进在几周内就能看到指标变化,避免三年规划式的转型。代价很明确:成熟度模型天生招人打分排名,书里自己就警告过——它是找下一步的地图,不是发奖状的成绩单。
本章把一个项目拆成五段:识别 → 立项 → 启动 → 开发与发布 → 运营。真正的主张不在分段本身,而在谁在什么时候在场:传统做法里运维、测试、安全、DBA 是被「交接」到的下游;本章要求他们从立项起就在同一张桌子上,并且在「启动」阶段——一行业务代码都还没写的时候——就把部署流水线和类生产环境先搭起来,让第一个能端到端跑通的「骨架」尽早上线。
为什么:最贵的返工几乎都来自环境差异与非功能需求(容量、安全、可运维性)。这两类问题留到发布前夜才暴露,修它意味着改架构;在启动阶段暴露,往往只是改一个配置。把流水线当作项目的第一个交付物,本质上是把这类风险从项目末尾搬到开头。
本章把风险管理去神秘化:它不是一份风险登记册,而是在固定时点向交付团队提一组具体问题。那组问题大致长这样:
判据很朴素:这些问题答不上来或答案含糊,风险就在那里——文档写多厚都不改变事实。本章还把几类常见交付问题归了因(见下表 2),共同点是:症状都在发布那天爆发,病根都埋在更早的地方。
这是全章最该记住、也最反直觉的一节。审计真正想要的其实是三件事:可追溯(生产上跑的每个制品能回溯到一次提交和一个工单)、不可绕过(没有人能跳过既定流程把东西放上生产)、可复现(环境与配置能被重建)。
传统做法用文档和签字提供这三件事,但一个签好的字只证明「有人签过」:它既说不出线上那个二进制究竟是哪次构建的产物,也拦不住有权限的人绕过流程直接改生产。流水线给的更硬——每个制品带着构建号与提交号、每个阶段的通过记录自动入库、每次生产部署留下「谁、何时、哪个产物」。证据是机器在正常干活时顺手产生的,不是事后补的。
职责分离在这套做法下并没有被取消,而是换了实现方式:不是「开发不许碰生产」,而是没有人能绕过流水线——放行动作变成对流水线上某个按钮的授权,按下去的人、时间、对象全部留痕。书里对 CAB 的批评也落在这里:定期开会、靠几页幻灯片审批一批自己并不熟悉的变更,审批者既没有能力也没有信息去判断技术风险,这道闸门买到的是延迟,不是安全。
表 1 · 四种「放行」模式:谁批、多久、审计拿到什么、代价是什么
| 模式 | 谁放行 | 典型前置时间 | 审计拿到的证据 | 适合 | 代价 |
|---|---|---|---|---|---|
| 全手工 CAB | 委员会,成员多半不熟悉该系统 | 数天–数周(等下一次例会) | 会议纪要与签字页,追溯靠人翻记录 | 变更稀少、系统陈旧、无自动化基础 | 批次被迫变大,风险随之变大;审批者信息不足,形同盖章 |
| CAB + 自动化流水线 | 委员会批准,部署由流水线执行 | 1–7 天 | 完整机器留痕 加 会议记录 | 强监管行业的过渡期 | 拿到了证据却没拿到速度,闸门仍长在人身上 |
| 同行评审 + 自动门禁 (本书主张) | 团队内另一人评审 + 流水线全绿;生产按钮需授权 | 数小时 | 提交、构建、测试、授权、部署全链留痕 | 绝大多数商业软件 | 要求测试套件真的可信;测试烂 = 闸门形同虚设 |
| 持续部署(全自动) | 无人,规则即闸门 | 分钟级 | 同上,外加自动回滚记录 | 能快速回滚的在线服务 | 需要成熟的监控、灰度与自动回滚;不适合装机后难更新的软件 |
表 2 · 四类常见交付问题:症状在发布日,病根在更早的地方
| 问题 | 症状 | 病根 | 第一步该做什么 |
|---|---|---|---|
| 发布不频繁且总出事 | 上线排在周末凌晨,一次 4–8 小时、清单几十步 | 没有类生产环境,部署靠人照清单点 | 先把部署脚本化,再用脚本建出一个环境 |
| 应用质量差 | 缺陷集中在集成与发布前爆发 | 测试没进流水线,反馈来得太晚 | 把最有价值的那批验收测试搬进流水线 |
| 持续集成名存实亡 | 主干经常红灯,一次合并要折腾一周 | 长期分支 + 提交批次太大 | 缩短分支寿命;修红灯优先于写新功能 |
| 配置管理糟糕 | 「在我机器上是好的」,生产参数没人说得清来历 | 环境定义与配置没有入库 | 把配置与环境定义纳入版本库,和代码同源 |
本章 2010 年写下时,这些主张多半还是从项目经验里提炼的断言。2014 年起,DORA(DevOps Research and Assessment)用连续多年的大规模问卷,把其中几条变成了统计结论——这条线后来结集成《Accelerate》(本站已有精读),可以看作本章的实证延长线。
落到今天的工具:GitHub Actions / GitLab CI / Argo CD 里的「环境保护规则 + 必需审批人 + 部署历史」,几乎就是本章那套「授权按钮 + 全链留痕」的工业化实现;SOC 2、ISO 27001 审计中被广泛接受的证据形式,也正是流水线记录而非手工表格。
① 一句话:前十四章造流水线,这一章讲怎么把它推进组织——挡路的通常不是技术,是「谁敢放行」。
② 成熟度模型是 6 个实践域 × 5 个级别(−1 退化 / 0 可重复 / 1 一致 / 2 可量化管理 / 3 优化)的网格,用法是找最短板、一次推一格,不是求总分——交付能力受最弱环节约束。
③ 项目生命周期的要点不在分段,而在运维、测试、安全从立项起就在场;「启动」阶段的第一个交付物应该是流水线与类生产环境。
④ 风险管理 = 在固定时点问具体问题(怎么算做完、谁能部署、回滚要多久、环境是不是脚本生成),答不上来就是风险所在。
⑤ 最反直觉的一条:面对审计,自动化比文档更有说服力——流水线同时给出可追溯、不可绕过、可复现三件证据。
⑥ 职责分离不是「开发不许碰生产」,而是没有人能绕过流水线;CAB 式例会审批买到的常是延迟而非安全。
⑦ 实证:DORA 多年数据显示重量级变更流程无效、精英团队更快且更稳;但转型会先慢一段,且「改进流程」不会自动变成「改进交付」。