工程实践

面向频繁发布团队的发布管理流程:七个步骤与关键指标

阅读约 1 分钟

发布管理流程,是把一项变更从”已合并”带到”已在生产环境运行,并且向受影响的人解释清楚”的一整套步骤。对于经常发布的团队来说,它归结为七个步骤:规划范围、隔离变更、构建与测试、审批、部署与验证、沟通,以及复盘。每个步骤都需要一位具名的负责人和一条退出标准,否则它就会悄悄地不再发生。

本指南假设团队有 5 到 50 名工程师,每周或每天部署,并且希望流程不要碍事。

步骤负责人退出标准
1. 规划范围产品负责人或技术负责人本次发布包含的变更清单已写下,有风险的内容已标出
2. 分支或开关负责这项变更的工程师工作在一个短生命周期的分支上或藏在开关之后,让主干始终可发布
3. 构建与测试CI,作者在故障时待命即将发布的那个确切提交上,流水线全绿
4. 审批评审者,有风险的变更再加发布经理评审完成,回滚路径已明确,通过或不通过的决定已记录
5. 部署与验证发布经理或值班工程师已部署,冒烟检查通过,错误率和延迟与发布前的基线一致
6. 沟通理解这项变更的人,由不理解的人来编辑发布说明已发布在用户阅读的地方,支持和销售已被告知
7. 复盘发布经理指标已查看,出过的问题都有负责人和修复方案

什么是发布管理流程?

它是一项变更触达用户所经过的、可重复的路径:范围、构建、测试、审批、部署、验证、公告,以及回顾。把它写下来的意义在于,每一次发布都走同一条路径,所以一个正在休假的人、一位新员工,或者凌晨两点的值班工程师,都可以直接执行,而不必去问别人它是怎么运作的。

发布管理有哪些不同类型?

实践中有三种类型:持续部署、定期发布,以及受监管的变更管理。它们的区别在于发布之前要做多少事,以及有多少是自动化的。持续部署会发布每一项已合并的变更,定期发布把变更批量打包成一趟班车,而受监管的变更管理则增加了正式的审批和审计记录。

持续部署定期发布受监管或 ITIL 变更管理
发布单元一个已合并的 pull request一个批次,每周或每两周一份变更申请
范围步骤隐含在合并之中,合并就是范围发布规划会议带风险评级的变更记录
审批代码评审加自动化检查发布经理为整个批次签字变更咨询委员会或被委派的审批人
风险控制功能开关、金丝雀发布、快速回滚预发布环境浸泡、候选版本书面的回退方案、维护窗口
典型节奏每天多次每周到每月由变更日历决定
薄弱环节没有人告诉用户发生了什么变化大批次会掩盖是哪项变更搞坏了东西流程耗时远超变更本身

大多数团队是混合的。一个 SaaS 产品可能持续部署,而它的移动应用按每周一趟班车发布,审计人员关心的那个支付服务,则遵循正式的变更记录。按服务来选择类型,而不是按公司。当变更只是逐步暴露时,发布和公告就成了两个独立的事件,这正是 feature flag 发布说明所讨论的情形。

发布经理的职责是什么?

发布经理负责一项变更到达生产环境所经过的路径。他们维护发布日历,判断一项变更是否就绪,执行或监督部署,做出回滚的决定,确保用户被告知,并在事后主持复盘。

发布之前,他们确认范围,并检查每一项有风险的变更都有回滚路径。发布期间,他们执行部署检查清单,盯住生产指标最初的几分钟,并尽早决定回滚。发布之后,他们确认说明已经发出,并记录流程中需要修正的地方。

在小团队里,让这个角色每周轮换,并把检查清单写好,这样就没有人需要依赖口口相传的经验。一个包含许多独立发布的软件包的 monorepo,通常每个软件包都需要一位发布负责人,否则这个角色就会变成瓶颈。

发布管理的关键 KPI 有哪些?

追踪 DORA 的软件交付指标,再加上你自己的一项:用户被告知所需的时间。DORA 的研究确定了五项指标,分为吞吐量(变更前置时间、部署频率、失败部署恢复时间)和不稳定性(变更失败率、部署返工率)两类。

DORA 的指南用平实的语言定义了它们(dora.dev, software delivery metrics):

KPI它衡量什么需要留意什么
变更前置时间从版本控制中提交,到部署到生产环境的时间数字上升通常意味着评审或审批中出现了排队
部署频率你多久部署一次,或两次部署之间的时间频率下降意味着批次在变大
失败部署恢复时间从一次需要立即介入的部署中恢复所需的时间回滚和告警方面的问题会在这里显现
变更失败率需要回滚或热修复的部署所占的比例批次过大或测试不足时会上升
部署返工率因生产事故而产生的计划外部署所占的比例说明修复发布的速度快过了吸取教训的速度
用户被告知所需的时间从生产部署到发布面向用户的说明的分钟数需要自己测量,没有任何框架会提供它

较早的资料列出四项关键指标,并把恢复称为”恢复服务时间”。当前的指南使用上面这五项。

同一份指南还提醒不要把这些指标当作目标。设定诸如”到年底所有服务每天部署多次”这样的目标,会诱使团队去操纵数字,而且这些指标应该按应用或服务来解读,而不是在整个公司范围内混在一起。它为改善所有这些指标给出的实用建议,是缩小每次变更的规模,因为更小的变更更容易评审,更容易通过流水线,也更容易恢复。

发布沟通在发布管理流程中处于什么位置?

它是第六步,和其他每一步一样,有负责人,也有退出标准:说明已发布在用户阅读的地方,内部团队已被告知。团队最常跳过的就是这一步,因为部署工具在代码上线的那一刻就报告成功了。

让这一步按时完成,最省事的办法是在变更合并时就写好条目,而不是等发布时才写。pull request 里已经有标题、作者、关联的 issue 和上下文。据此生成的草稿是拿来编辑的,而不是一周之后凭记忆去写。这正是体验日志自动化背后的思路:在合并时生成草稿,留给人批准,然后从同一个来源发布到各处。Changeloop 就是这样工作的,它用 AI 从已合并的 pull request 起草条目,并在任何内容发布之前留给人批准。

有两种变体值得提前计划。支持和销售需要一份与客户不同的说明,这就是内部发布说明的用途。由事故驱动的发布来不及走正常的起草流程,所以要备好一份简短的模板,如紧急发布说明所述。发布说明模板为面向客户的版本提供了一个起步的形状。

如何让流程保持轻量?

把机器能检查的每一条退出标准都自动化,把人留给需要判断的事情。流水线全绿、仪表盘上的部署标记,以及每个已合并 pull request 对应的一条体验日志草稿,都是可以检查的。回滚方案是否可信,或者说明对客户来说是否说得通,则需要人来判断。

要检验这个流程,挑上个月的一次发布,问问团队之外的人,是否仅凭书面记录,就能说出发布了什么、谁批准的、怎样验证的,以及用户是什么时候被告知的。任何缺口,都是你下一个要改进的地方。

FAQ

发布管理和变更管理有什么区别? 发布管理让一组变更得以构建、测试、部署和公告。变更管理(按 ITIL 的含义)则是围绕每项变更的审批和风险流程。经常发布的团队,会把审批并入代码评审和自动化检查。

我们应该多久发布一次? 在你的测试和回滚路径允许的范围内越频繁越好,对许多 Web 团队来说是每天或更多。DORA 的建议是缩小每次变更的规模,因为小的变更更容易评审和恢复。

小团队需要发布经理吗? 他们需要这些职责,但不一定需要这个头衔。让工程师轮流担任这个角色,给轮值的人一份书面的检查清单,并确保七个步骤中的每一步都有人负责。

发布检查清单应该包含什么? 范围已确认,发布的那个提交上流水线全绿,回滚路径已明确,审批已记录,部署后做冒烟检查,指标与基线对比,发布说明已发布,支持已被告知,并安排好复盘。控制在一页之内。


本文的技术内容未经独立审核。如有错误,请告诉我们,我们会更正。

changeloop 相关页面: 开发者文档, 发布说明模板

changeloop
打造闭环 changelog 的团队。用户提出需求,你的团队交付,提出需求的人得知结果。