软件交付:从 Git 提交到真实用户
这一章讲三件事: 交付流水线到底分几段、每段干什么;分支策略怎么影响交付; 以及新版本怎么一步步安全地放到用户面前。 读完你会知道「代码合并了」和「用户用上了」之间隔着什么,以及每一层的保险丝。
1. 这一章讲什么
第 05、06 章的两道闸都过了,代码合并进主干——然后呢?原书的立场很明确:你应该了解你的代码最终如何出现在用户面前,那些在 Git 提交和实时流量之间的步骤不应该是一个谜——即使它由别人自动执行1。
本章在全书链条里的位置:它是「运维之海」站点的入口。交付做完,系统才算真正「长」在用户身上;接下来第 08 章讲它坏了怎么办。
2. 顶层全景
构建 build ──→ 发布 release ──→ 部署 deploy ──→ 展开 rollout
编译+打包 包进仓库+公告 安装到机器 把用户流量移到新版本
(带版本号、 (变更日志/ (原子安装、 (特性开关/金丝雀/
分平台) 发行说明) 可回滚) 蓝绿/摸黑启动)
│
用户流量 ──────────────────────────────┘ ← 展开完成才算「交付」
图说:四个词在行业里常被混用;原书先钉死定义再谈最佳实践。
主走查在 3.4:一个 deb 包走到 1% 金丝雀流量的全程。
3. 核心原理
3.1 四个阶段,四个词
先把术语统一——原书开篇就承认,交付阶段没有行业标准的定义,「发布」和「部署」跟不同的人聊可能是完全不同的环节2。本书沿用原书的四段划分3:
- 构建:把代码变成软件包。软件包应该不可变、带版本号——构建一次,到处安装,不再每台机器现编4;
- 发布:把包发行到集中的仓库,同时更新发行说明和变更日志;
- 部署:把包安装到预生产和生产环境。此时用户还访问不到——只是装上了而已;
- 展开:把用户逐渐转移到新版本上。展开完成,交付才算完成。
这四段各自有一套最佳实践,下面按段走。
3.2 分支策略:交付的地面轨道
交付前还有一个决定性变量:代码在版本控制里怎么流。原书把分支策略分成两大系5:
基于主分支的开发(主干式):所有人都在主干上工作,分支只用于单个小特性或修 bug,几 小时到几天内就合回去。频繁合并有个名字——持续集成(CI):变化迅速传给所有人,谁也不会跑偏太远;代价是主干上的 bug 拖累所有人,所以合并前要跑快速自动化测试,团队的普遍共识是主干应该总是可以发布的6。
基于特性分支的开发:多个人在长期存续的分支上各养一个特性,发布前才汇入发布分支。最流行的是 Gitflow(开发分支+发布分支+热修复分支的组合),由文森特·德里森在 2010 年归纳7。但原书立刻补了一句今天读来最重要的话:德里森本人后来修改了那篇博文,不再鼓励把 Gitflow 用于做持续集成和交付的软件8。
原书的推荐与这个演变一致:除非真的需要长期特性分支,否则坚持主干式——管特性分支本身就会变得很复杂9。这条判据同时回答了第 04 章埋的问题:为什么 API 和数据要向前向后兼容(第 10 章展开)——因为只有兼容,新旧版本才能共存,部署才不必排队。