Release 策略与渐进发布:semver、蓝绿、金丝雀与回滚
0. 元信息
- 主题路径:
docs/topics/ci-cd-and-release/subtopics/release-strategies-and-rollout/README.md - 主分类:工程技术
- 辅助分类:安全与可靠性
- 适合对象:已经能跑通 CI pipeline,想把发布变成「可回滚、可灰度」的开发者
- 建议周期:5~8 天,每天 1.5~2 小时
- 前置知识:pipeline-and-automation
- 最终目标:能独立选择发布策略、写 Argo Rollouts canary / blue-green 步骤、配 AnalysisTemplate 指标门控、设计 feature flag 切换与回滚预案
1. 学习路线
semver + conventional commits + release-please
→ tag、release branch、changelog
→ 蓝绿 / 滚动 / 金丝雀策略对比
→ Argo Rollouts Canary 步骤 + AnalysisTemplate
→ Flagger metric provider
→ feature flag(LaunchDarkly / Unleash / OpenFeature)
→ 回滚预案:revert / switch / abort
2. 阶段周数分配
精简子主题不固定周数。按概念、正常路径、失败路径、综合实验四段推进,共 5~8 天。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1 | semver、MAJOR.MINOR.PATCH、prerelease、build metadata | bump 脚本 | 1.2.3-rc.1 与 1.2.3+build.4 不污染语义 |
| 2 | conventional commits、release-please / semantic-release | 自动 changelog | feat / fix / BREAKING CHANGE 自动分节 |
| 3 | git tag、release branch、cherry-pick、monorepo versioning | 一个稳定 release branch | tag 命名一致,旧 patch 不进新 minor |
| 4 | 蓝绿、滚动、金丝雀、爆炸半径、回滚时长 | 策略对比表 | 能说出每种策略的回滚代价 |
| 5 | Argo Rollouts Canary、trafficSplit、pause、abort | canary 步骤 YAML | 写 setWeight + pause 步骤并解释 |
| 6 | AnalysisTemplate、AnalysisRun、metric provider、threshold | Prometheus 指标门控 | 错误率 > 5% 自动 abort |
| 7 | Flagger、Istio / NGINX / App Mesh metric providers | Flagger Canary | 对照 Argo Rollouts 的轻量选择 |
| 8 | LaunchDarkly、Unleash、OpenFeature SDK、kill switch | flag 切换 | flag flip 在 1 秒内生效,无 deploy |
| 9 | 回滚预案:revert / blue-green switch / canary abort / feature flag off | 演练记录 + retrospective | 5 分钟内定位上一稳定版本 |
4. 第一周任务
精简子主题省略逐日表。每天只引入一个变量;先跑正常路径,再做四类失败实验。Day 1 必须明确 semver 规则与 release branch 命名。
5. 阶段通用验收
采用父主题 §5;本页额外要求保存策略对比表、canary YAML、AnalysisTemplate、feature flag 配置、回滚演练记录与清理命令。
6. 最终验收
完成 1 份策略对比表、1 段 Argo Rollouts Canary YAML(带 AnalysisTemplate)、1 个 feature flag 集成、至少 4 类失败实验、1 次完整回滚演练,并用 10 分钟解释策略选择与回滚路径。
7. 综合项目
把本页产出合入父主题首选项目:GitHub Actions → GHCR → k8s Argo Rollouts 金丝雀发布全链路。单独交付时,提供 Rollout manifest、AnalysisTemplate、release-please 配置、notes/retrospective.md。
本主题贡献
本主题把 release 当成可灰度可回滚的工程:semver 语义化版本、Argo Rollouts canary 步骤、AnalysisTemplate 指标门控、blue-green 流量切换与 feature flag 部署/发布解耦,5 分钟内能定位上一稳定版本。
职责(3 项)
- 用 semver + Conventional Commits + release-please 自动 bump 与 changelog,能解释
1.2.3-rc.1<1.2.3、1.2.3+build.4build metadata 不污染语义、force-with-lease 签 tag 防覆盖、Monorepo 怎么独立 bump 子包版本; - 设计 Argo Rollouts Canary 步骤(
setWeight: 10→pause: 5m→setWeight: 50→pause→setWeight: 100)+ AnalysisTemplate 接 Prometheus 指标(错误率/P99/saturation),能解释 failureThreshold + abort 的门控边界,以及 metric provider 不可达时悄悄跑满 100% 的危险; - 设计 blue-green 切换(旧版本一直保留、
switch即回滚)、canary 回滚(abort / rollback 步骤)、feature flag 切换(flag flip 1 秒生效、无 deploy)三条回滚路径,能解释 deploy vs release 的解耦原则。
交付物(4 项)
- Argo Rollouts Canary YAML(带
trafficRouting、steps、analysis),含setWeight+pause步骤注释; - AnalysisTemplate(错误率 > 5% 自动 abort)+ AnalysisRun 报告,metric provider = Prometheus;
- release-please 配置(Conventional Commits → 自动 PR → 自动 changelog)+ semver bump 脚本;
- feature flag 集成(OpenFeature SDK / LaunchDarkly / Unleash 任一)+ 回滚预案(revert / blue-green switch / canary abort / flag off 五段)。
指标(3 项)
- canary abort 触发率 ≤ 5%(promote 100% 之前出错能自动回滚);
- release rollback MTTR ≤ 5 分钟(git revert / Rollout undo / feature flag off 任一路径);
- feature flag 清理周期 ≤ 30 天(CI 检查无主 flag + 到期日)。
8. 推荐开源资料
Argo Rollouts(Apache-2.0)作渐进发布主线;Flagger(Apache-2.0)作对照;Spinnaker(Apache-2.0)作多云;release-please(Apache-2.0)作版本自动化;semantic-release(MIT)作 JS 生态对照;LaunchDarkly / Unleash 文档作 feature flag;OpenFeature(Apache-2.0)作 vendor-neutral 抽象。复制前核对当前 LICENSE。
9. 学习资料汇聚(v0.3 自包含)
9.1 背景与动机
Release 策略决定爆炸半径与回滚代价。蓝绿:两套环境切换,秒级回滚;滚动:批次替换,零停机但回滚慢;金丝雀:按流量百分比切换,metric-driven 回滚;feature flag:发布与部署解耦,runtime 切换。
Jez Humble 和 David Farley 在《Continuous Delivery》里把「部署与发布解耦」作为关键原则。Eric Ries 在 Lean Startup 里强调小可行发布(MVPS)。今天的 Argo Rollouts、Flagger、Spinnaker 把这些想法工程化。
我们这一节要解决一个具体问题:CI 出可签名制品后,怎么把它安全地送到生产,遇到事故能在 5 分钟内回滚。
9.2 概念地图
flowchart LR
Tag[git tag / release branch] --> Release[release pipeline]
Release --> Strategy{strategy}
Strategy --> BlueGreen[blue-green: switch]
Strategy --> Rolling[rolling: replace batch]
Strategy --> Canary[canary: weight + metric]
Strategy --> Flag[feature flag: runtime]
Canary --> Analysis[AnalysisTemplate]
Analysis --> Metric[Prometheus / Datadog]
Metric --> Decision{pass?}
Decision -- yes --> Promote[promote 100%]
Decision -- no --> Abort[abort / rollback]
Flag -.runtime toggle.-> Promote
Promote --> Observability[DORA / audit]
Abort --> Observability
核心关系:release 决定版本与时机,策略决定流量分配,metric 决定是否继续,feature flag 决定行为可见性。四个维度必须配合。
9.3 基础知识讲解
9.3.1 论文 / 规范
| 资料 | 用法 |
|---|---|
| semver.org 2.0.0 | 语义化版本定义 |
| Conventional Commits 1.0 | commit 类型 → version bump |
| Keep a Changelog 1.1 | changelog 格式 |
| Argo Rollouts spec | Canary / BlueGreen CRD |
| OpenFeature spec | feature flag vendor-neutral 抽象 |
9.3.2 书
| 资料 | 用法 |
|---|---|
| Humble & Farley, Continuous Delivery | 「部署与发布解耦」原则 |
| Forsgren 等, Accelerate | DORA 与渐进发布的统计关联 |
| Ford, Building Evolutionary Architectures | 适应度函数 + canary |
9.3.3 博客 / 文档
| 资料 | 用法 |
|---|---|
| Argo Rollouts 文档 | Canary / BlueGreen / AnalysisTemplate 主线 |
| Flagger 文档 | 对照 Argo Rollouts 的轻量选择 |
| Spinnaker 文档 | 多云 pipeline |
| release-please | Google 出品的版本自动化 |
| semantic-release | JS 生态对照 |
| LaunchDarkly Blog | feature flag 工程实践 |
| Unleash 文档 | 开源 flag 服务 |
| OpenFeature 文档 | vendor-neutral SDK |
9.3.4 人物
| 人物 | 关注点 |
|---|---|
| Jez Humble | 部署与发布解耦 |
| Charity Majors | observability-driven rollout |
| Sam Newman | 微服务与独立可部署性 |
| Adrian Cockcroft | Spinnaker / canary 早期实践 |
9.3.5 方法
| 方法 | 动作 |
|---|---|
| Decouple deploy vs release | 部署靠 canary,发布靠 flag |
| Metric-driven | 错误率 / P99 / saturation 自动门控 |
| Always keep last-good | 蓝绿永远保留旧版本;canary 失败 abort |
| Feature flag lifecycle | flag 必须有到期日,否则技术债 |
| Runbook first | 先写回滚预案,再配发布按钮 |
9.4 经典问题与经典案例
| # | 问题 | 最简答案 |
|---|---|---|
| 1 | semver 1.0.0-rc.1 vs 1.0.0 | prerelease < release,工具按规则排序 |
| 2 | 蓝绿切错版本,回滚反而快 | 旧版本一直保留,点 switch 即回 |
| 3 | 滚动回滚慢 | 滚动是 batch 替换,回滚也要 batch;爆炸半径小但代价高 |
| 4 | canary 指标不达标,没人看 | AnalysisTemplate 接 Prometheus,failureThreshold + abort |
| 5 | feature flag 永远不清理 | 配 expiration date,CI 检查无主 flag |
| 6 | tag 被覆盖 | 用 force-with-lease / signed tag,禁止 force push |
| 7 | release branch 长期不合并 | 每周 rebase + 定期 merge back |
| 8 | canary 跑完 100% 后再出问题 | 留 soak 时间,分批 promote |
| 9 | abort 触发但没人通知 | AnalysisRun 状态接 alertmanager |
| 10 | flag 在客户端不生效 | SDK 缓存 + 长连接 / SSE 推送 |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 部署 vs 发布 | canary 是部署,flag 是发布 | 部署 100% 完成不代表对用户可见 |
| Tag vs digest | mutable vs immutable | 部署用 digest |
| Prerelease 排序 | 1.0.0-rc.1 < 1.0.0 | 用 semver 工具 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 策略选择 | 蓝绿、滚动、金丝雀各有权衡 | 画爆炸半径 × 回滚时长 × 资源开销三维图 |
| metric 选择 | 错误率、P99、饱和度都重要 | 选 2–3 个,业务结果驱动 |
| flag 维度 | 租户、用户、地区、版本 | 与实验平台对齐 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| AnalysisTemplate 写错 | metric provider 不可达 | staging 先跑通,配 dry-run |
| flag SDK 性能 | SDK 调用阻塞 hot path | 本地缓存 + 异步 refresh |
| Spinnaker 复杂度 | pipeline + stage 模型学习曲线陡 | 先 Argo Rollouts 入手 |
| 回滚演练 | production 不敢演练 | chaos drill 在 staging 跑,prod 用 game day |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 发布组织 | 角色 | 状态 / 可访问性 |
|---|---|---|---|
| semver.org | semver.org | 版本规范 | 公开 |
| Conventional Commits | conventionalcommits.org | commit 规范 | 公开 |
| Argo Rollouts | CNCF | 渐进发布 | Apache-2.0,活跃 |
| Flagger | Weaveworks / Flux | 渐进发布 | Apache-2.0,活跃 |
| Spinnaker | OSS | 多云发布 | Apache-2.0,活跃 |
| LaunchDarkly | LaunchDarkly | feature flag SaaS | 商业 |
| Unleash | Unleash | feature flag OSS | Apache-2.0 |
| OpenFeature | CNCF | flag 抽象 | Apache-2.0 |
| release-please | 版本自动化 | Apache-2.0 | |
| semantic-release | semantic-release | 版本自动化 | MIT |
| Keep a Changelog | Olivier Lacan | changelog 规范 | CC BY-SA |
9.6.2 Scope
Argo Rollouts 在 Kubernetes 上提供 canary / blue-green;Flagger 依赖 service mesh(Istio / NGINX)做 metric gating;Spinnaker 是多云发布平台;release-please / semantic-release 自动 bump 与 changelog;feature flag 把发布与部署解耦。
9.6.3 Structure
Argo Rollouts CRD:Rollout(strategy + steps + trafficRouting)、AnalysisTemplate(metrics + thresholds)、AnalysisRun(单次执行)。Flagger CRD:Canary(provider + metrics)。Spinnaker pipeline:stages 序列。feature flag SDK:client + context + variation。
9.6.4 Ecosystem
Argo Rollouts 与 Argo CD 集成;Flagger 集成 Flux / Helm operator;Spinnaker 独立多云;release-please 与 GitHub Actions / release-please-action 集成;OpenFeature 提供 .NET / Go / Java / Node / Python SDK。
9.6.5 Depth Tiers
| 层级 | 可观察能力 |
|---|---|
| L0 | 知道 semver、canary、blue-green、feature flag 是什么 |
| L1 | 能读 Rollout YAML、AnalysisTemplate、flag SDK 示例 |
| L2 | 能写 Canary YAML、配 feature flag SDK |
| L3 | 能从 AnalysisRun 报告解释 abort,设计 metric-driven rollout |
| L4 | 能设计多服务联动 rollout、跨 region canary、flag 实验平台 |
本子主题目标是 L3。
9.6.6 Source
- Argo Rollouts 文档
- Flagger 文档
- Spinnaker 文档
- semver.org
- Conventional Commits
- release-please
- OpenFeature
- 引用版本快照日期:2026-07-30;实作前运行
kubectl version、argocd version。
10. 常见误区
- 把 release branch 当 long-lived;
- tag 不签名 / 允许 force push;
- canary 跑完 100% 才报警;
- metric provider 不可用,悄悄跑满 100%;
- feature flag 没有到期日,技术债堆积;
- flag 切完没清理,半年后没人记得;
- abort 触发但没人接 alert;
- 蓝绿切完不保留旧版本;
- 回滚预案只在文档里,没演练;
- 用
1.0.0但 API 已经破坏兼容; - prerelease 被当 stable 推;
- 滚动升级失败 rollback 不验证。
11. 所有知识点分类(统一规则)
- 编程语言;2. 数据结构与算法;3. 计算机基础;4. 工程技术;5. Web 与后端;6. 前端与客户端;7. 数据与人工智能;8. 项目与职业能力;9. 安全与可靠性。
本计划归属:工程技术 主 + 安全与可靠性 辅。