Deep Research: [5] 持续交付(Continuous Delivery):把发布做成可回滚的流水线¶
- Source: https://martinfowler.com/books/continuousDelivery.html
- Note: ../notes/ref-005-continuous-delivery.md
- Snapshot: ../sources/md/martinfowler-com-books-continuousdelivery-html-7b817f9cdde9.md
TL;DR¶
持续交付(Continuous Delivery, CD)不仅仅是自动化部署脚本,而是建立一条从代码提交到生产环境的自动化流水线,通过频繁、小批量的发布和快速反馈循环,让软件发布成为一种低风险、可重复、甚至无聊的日常活动。
核心观点¶
- 部署流水线(Deployment Pipeline):这是 CD 的核心模式。每一次代码提交都会触发一系列自动化的构建、测试和部署步骤。流水线是发布的唯一途径,确保所有变更都经过相同的验证标准。
- 发布是业务决定,部署是技术行为:通过按需发布将部署动作(技术风险)与发布动作(业务影响)解耦。软件应随时处于可发布状态。
- 质量内建与左移:反馈越早越便宜。在流水线早期(提交阶段)拦截大部分错误,而不是依赖后期的手动测试(QA)。
- 配置即代码:不仅是源代码,基础设施配置、数据库脚本、部署逻辑都必须版本化管理。没有任何变更是通过 SSH 登录服务器手动完成的。
- 小批量交付:通过减少每次发布的变更量(Batch Size),降低出错概率,并加速故障定位与回滚。
- 每个人都对交付负责:消除开发只管写代码,运维只管部署的隔阂(DevOps 的前身),开发人员需为代码在生产环境的运行状态负责。
可落地做法¶
1. 面向工程(Engineering)¶
- 构建脚本化:使用 Make/Gradle/npm 等工具将构建、测试、打包命令标准化,确保在本地和 CI 服务器上运行结果一致。
- 建立提交阶段(Commit Stage):配置 CI 任务,确保每次 Push 都在 5-10 分钟内运行完单元测试和静态检查。若失败,优先级最高修复。
- 蓝绿/金丝雀部署:利用云原生设施,实现无停机部署。确保新版本部署失败时,流量能瞬间切回旧版本。
2. 面向产品(Product)¶
- 拆分需求:将大功能拆解为可独立上线的小 Story,配合特性开关(Feature Toggles)实现暗部署(代码已上线但用户不可见)。
- 定义完成:只有代码在生产环境运行且业务指标正常,才算Done。
3. 面向评测/QA(Evaluation)¶
- 自动化回归:将手动测试用例转化为自动化测试脚本(E2E),纳入流水线。
- 分层测试策略:大量单元测试(快)、适量集成测试、少量 UI 测试(慢、脆),避免倒金字塔结构。
检查清单:流水线健康度自查¶
- [ ] 原子性构建:构建只需运行一条命令,不需要任何手动配置步骤?
- [ ] 版本一致性:测试环境、预发布环境和生产环境是否使用同一个二进制包/镜像(而不是重新构建)?
- [ ] 配置分离:配置信息是否与代码分离,并随环境自动注入?
- [ ] 一键回滚:是否能在 5 分钟内通过一个命令(或点击)将生产环境回滚到上一个稳定版本?
- [ ] 每日部署:团队是否具备每天多次部署到生产环境的能力(即使不一定要这么做)?
- [ ] 红灯停:流水线失败时,是否所有人都停止提交代码,直到修复为止?
常见坑与对策¶
- 坑:测试不仅慢而且不稳定(Flaky Tests)。
- 对策:零容忍。一旦发现不稳定测试,立即隔离或修复。不要让团队习惯于忽略那个红灯,重跑一下就好。
- 坑:只做 CI 不做 CD。
- 对策:很多团队只做到了持续集成(跑通单测),但部署仍需手动操作。需打通最后一公里,将部署脚本化并纳入流水线。
- 坑:环境差异导致的在我机器上是好的。
- 对策:使用容器技术(Docker)确保开发、测试、生产环境的高度一致性;使用 IaC(Terraform/Ansible)管理环境。
可用于丰富《AI 辅助软件产品》的写作点¶
- 第 07 章 Engineering(工程实践):
- AI 作为流水线构建者:现在的 LLM 非常擅长生成 GitHub Actions 或 GitLab CI 配置文件。可以展示如何用 Prompt 生成一个包含 Lint、Test、Build、Docker Push 的完整 CI/CD 配置文件。
- AI 辅助修复构建:当流水线失败时,直接将错误日志投喂给 AI,让其分析原因并给出修复补丁(不仅是代码修复,也包括环境配置修复)。
- 第 17 章 Deployment(部署与发布):
- 智能回滚代理:提出AI SRE的概念。在部署后,AI 监控日志和监控指标(如错误率突增、延迟抖动),一旦发现异常模式,自动触发回滚指令,比人工介入更快。
- 第 10 章 Agentic RAG(Agent 体系):
- Prompt 的持续交付:将 Prompt 视为代码。建立 Prompt 的 CD 流水线:修改 Prompt -> 自动运行评估集(Evaluation) -> 对比质量分数 -> 自动部署到 Agent 服务。这是 AI 产品的特有 CD 实践。