使用功能标志实现主干开发 | AI生成和翻译
问题:如何在真实团队中,使用功能标志成功实施基于主干的开发,并提供实用、分步的指导?
答案:
这是一个经过实战检验的分阶段发布计划,大多数团队都可以使用它从 Git Flow(或混乱)转向真正的基于主干的开发,实现每天 20-100+ 次部署。
阶段 0 – 先决条件(1-2 周)
- 确保您拥有真正的 CI,并在每次提交时运行(测试、linting、安全扫描)。
- 让 CI 管道快速运行(关键路径小于 10 分钟)。如果更慢,请先修复它。
- 实现 80% 以上的单元测试覆盖率和合理的集成/端到端测试覆盖率。
- 设置自动化部署,在每次合并到
main时部署到测试环境。
阶段 1 – 强制执行“短生命周期分支”(1-2 周)
- 最长分支生命周期:48 小时(许多团队从 24 小时开始)。
- 通过 CI 策略强制执行:分支年龄 >48 小时 → 管道失败。
- 不再有
develop、release/*或长期存在的功能分支。 - 开发者仍然创建功能分支,但必须每天(或每天多次)合并。
- 目标:让团队习惯小而频繁的提交和持续集成。
阶段 2 – 引入功能标志(2-6 周)
| 步骤 | 操作 |
|---|---|
| 1 | 选择一个功能标志系统(LaunchDarkly、Unleash、ConfigCat、Split.io 或内部系统)。 |
| 2 | 创建一个“Hello World”标志,并在生产环境中切换一些微不足道的东西。 |
| 3 | 定义标志生命周期规则:每个标志都必须有所有者 + 删除日期(最多 30-90 天)。 |
| 4 | 添加自动化清理作业:如果存在死标志,则 CI 失败。 |
| 5 | 开始将每个新功能包装在一个标志中。旧代码目前可以保持未标记状态。 |
阶段 3 – 完全基于主干(重大切换)
- 声明
main为唯一分支。删除develop和所有旧的发布分支。 - 所有工作现在都发生在:
- 直接在
main上(对于非常小的更改),或 - 在极其短生命周期的分支中(理想情况 <4 小时,绝对最大 <24 小时)。
- 直接在
- 强制执行“结对/群组编程”或在数小时内(而不是数天)进行强制代码审查。
- 强制执行“每天多次合并到 main”作为文化规范(在站会中跟踪)。
阶段 4 – 持续部署(回报)
- 将与测试环境完全相同的提交从测试环境 → 生产环境自动(或一键批准)发布。
- 将每次合并到
main的代码部署到生产环境(代码始终位于标志之后或 100% 安全)。 - 一旦功能完全推出,积极地删除旧标志。
- 如果您需要额外的安全性,可以添加金丝雀部署或环形部署。
阶段 5 – 优化和扩展
- 转向提交级部署(一些团队部署每个提交)。
- 实施“标志债务”仪表板,如果陈旧标志数量 >X,则构建失败。
- 在错误率增加时添加自动回滚(PagerDuty + Spinnaker/Argocd 回滚)。
- 达到每天 10 次部署 → 20 → 50 → 100 次时庆祝。
10-50 人团队的典型时间线
| 周次 | 里程碑 |
|---|---|
| 1–2 | 快速 CI + 短生命周期分支策略 |
| 3–8 | 所有新工作都使用功能标志 |
| 9–12 | 完全只基于主干 + 持续部署到生产环境 |
| 12+ | 每天 20+ 次部署,几乎零事故 |
常见陷阱及如何避免
| 陷阱 | 解决方法 |
|---|---|
| “我的功能对于一个标志来说太大了” | 将其分解为 10 个小标志(UI 标志、API 标志、DB 迁移标志等) |
| 数据库 schema 更改 | 使用可扩展迁移 + 回滚脚本 + 功能标记的代码 |
| 害怕破坏生产环境 | 从暗发布和百分比发布开始(0.01% → 100%) |
| 标志蔓延 | 强制最长 30 天的生命周期 + 自动化清理 |
一旦您达到第 4 阶段,部署真正变得枯燥——这正是您想要的。
参考资料:
- 基于主干的开发 – 完整实施指南
- Paul Hammant 的 TBD 短生命周期分支页面
- Google 的网站可靠性工程书 – 第 27 章:持续部署
- 功能标志驱动开发 – Martin Fowler
- 加速 – 2023 年 DevOps 报告状况(基于主干的开发相关性)