第18章|CD 总览:从“发布”到“交付”的系统工程

CI 负责回答“这段变化对不对”,CD 负责回答“这段变化怎么安全地到达用户”。 这一章我们把 CD 拆成一个可运行的系统:制品晋级环境与配置发布策略审批与审计回滚与止损

Core idea

CD 的主语是“制品”,不是“代码”

  • 同一个制品跨环境晋级(promote),而不是每个环境重新构建
  • 每次交付都能追溯:谁、何时、把哪个制品交付到哪
  • 失败可回滚:回滚到上一个已知好版本(known-good)
Guardrails

速度与稳定的“可管理权衡”

  • 用发布策略拆风险:蓝绿/金丝雀/滚动/灰度
  • 用门禁控风险:审批、策略、自动判定(指标)
  • 用止损救风险:自动回滚、冻结发布、降级
What you can do

画出你的交付路径并“钉死”变量

  • 明确环境拓扑:dev/staging/prod(或更多层)
  • 明确变量归属:config vs secret vs feature flag
  • 明确证据链:制品、变更、审批、发布标记、观测指标

1. 先把名词说清楚:Deploy、Release、Delivery 的边界

你会经常听到“我们已经有 CD 了(因为能部署)”。这句话通常只对了一半。

一个判断题:如果生产环境出了问题,你只能“再发一次试试”,而不是“回滚到上一个已知好版本”,那你有部署自动化,但 CD 系统还不完整。

2. CD 的骨架:制品晋级(Promotion)

把“交付”做稳,最关键的一步是:同一份制品沿环境晋级。否则每个环境重新构建,相当于每次都在投骰子:你交付的究竟是哪个版本?

2.1 为什么晋级很重要?

  1. 可重现:staging 验证过的,就是 prod 会拿到的。
  2. 可追溯:制品 digest / SBOM / provenance 一路跟随。
  3. 可回滚:回滚不需要重新构建,只需要切换引用。

2.2 晋级需要的“门”

制品晋级:同一份制品跨环境推进 关键:build once → promote many · 每一步都有证据链 Build Source → Artifact compile · test · package Sign & SBOM digest · provenance · policy Publish to registry image registry / artifact store key: digest, not tag Promote dev fast feedback staging prod-like verify prod risk-managed Gates Quality gate tests · scans · signatures Change gate approvals · window · audit Data gate metrics · canary · rollback 证据链:digest · config version · approver · rollout id · release marker
图 1:CD 的骨架是“制品晋级”。构建一次,跨环境推进;每一步都有门禁与证据链,才能做到可回滚、可审计。

3. 环境不是“几套机器”,而是风险模型

许多团队的环境设计是“历史自然长出来的”:dev、test、pre、prod……名字很多,但边界不清。 在 CD 里,环境设计的核心是:把风险拆开,把权限拆开,把变量钉死

3.1 环境要回答的三个问题

  1. 这套环境验证什么?(功能、性能、安全、兼容、回归、容量……)
  2. 它与生产有多像?(数据、依赖、网络策略、配额、拓扑)
  3. 谁能改它?(权限边界、审批、审计、紧急通道)
实用经验:staging 不必“完全等于生产”,但它必须在“会出问题的维度”上足够像生产,例如同样的依赖、同样的网络出口、同样的限流/鉴权策略。

4. CD 的“变量管理”:config vs secret vs feature flag

CD 经常失败不是因为“部署脚本写错”,而是因为变量混在一起:配置、机密、开关、版本兼容没有被系统化管理。 一旦它们搅在一起,你就会遇到典型灾难:回滚镜像但配置没回滚开关开错导致事故机密泄露无法追溯

变量交付矩阵:谁变化、怎么追溯、怎么回滚 把变量从“混合汤”变成“可控部件” Type Versioning Delivery Rollback Config 非敏感参数:超时、阈值、端点、限流 Git 版本化 / 配置中心版本 / hash 随部署注入 / 拉取式同步 / 模板渲染 回滚到上一个 config 版本 Secret 敏感凭证:数据库、云 API、签名 key 轮换记录 / 版本号 / 审计日志 短期凭证(OIDC)/ 动态注入 / 最小权限 吊销/轮换(不是“回滚”) Feature flag 用户侧生效控制:灰度、A/B、紧急开关 策略版本 / 受众规则 / 审批记录 运行时评估 / SDK 拉取 / 管理台变更 快速关闭(秒级止损) 关键原则:配置可回滚,机密可吊销/轮换,开关可瞬时止损 —— 三者别混。
图 2:变量交付矩阵。CD 里真正难的是“让变量可控”:版本化、审计、回滚/吊销与快速止损各有方法。

5. 发布策略与门禁:把风险拆开,而不是赌运气

CD 的“策略”是把一次大的风险,拆成很多个小风险,并且每一步都能观测、能止损。你会在后续章节深入蓝绿/金丝雀/灰度, 这里先把发布策略放在一张“控制面”视角上理解。

CD 控制面:门禁、观测与止损 从“人盯着发布”走向“系统帮你管理风险” Automation level manual auto-judged Gate:审批与策略 谁能发?发到哪?需要几位批准? policy-as-code · RBAC · audit Observe:发布标记 release marker 连接“版本”和“指标” latency · error rate · saturation Mitigate:自动止损 回滚、暂停扩大、降级、冻结发布 阈值 + 保护窗口 + 人工接管 Progressive rollout 1% 10% 50% 100% 每一步都要“看指标再继续”
图 3:CD 控制面视角。门禁让“谁能发”可控,观测让“发得怎么样”可见,止损让“出事怎么收”自动化。

6. CD 的最小成熟度模型(从 0 到 1 的路线)

  1. Level 0:能手动部署(但不可回滚/不可追溯)。
  2. Level 1:部署自动化 + 制品可追溯(tag/digest/版本号)。
  3. Level 2:制品晋级 + 门禁 + 审计(审批、策略、变更窗口)。
  4. Level 3:渐进发布 + 指标判定 + 自动止损(回滚/冻结/降级)。
  5. Level 4:GitOps/声明式交付 + 策略即代码 + 多团队治理(规模化)。
现实建议:不要一上来就追求“最炫的工具”。先把“制品晋级 + 可回滚 + 可审计”做到稳定,这三件事能显著抬升交付上限。
← 上一章:CI 的可观测性 下一章:部署基础(环境、配置、机密、开关) →