专业书籍精读 · 持续交付 · 第 6 章

构建与部署脚本化

Continuous Delivery · Ch 6 · Jez Humble & David Farley · 2010

EN →

这一章讲什么?

你手机里的 App 每周更新一次。把工程师写完的代码变成你手机上那个能跑的新版本,中间隔着一连串动作:编译、打包、传到服务器、改配置、重启。《持续交付》第 6 章讲的就是这一串动作该怎么写成脚本——不是随手敲几行命令,而是像写正式产品那样写它。

打个比方

把发布想成做菜。手工部署是大厨凭记忆现做:今天多放了勺盐,明天忘了关火。脚本化就是写成菜谱、让机器照做。但这一章的主张还要更进一步:菜谱不该写在贴冰箱门的便利贴上(想到哪写到哪、每个厨房一张、越改越乱),而要当成正式出版物来维护——有版本、有人审、出了事能查出是哪一版。

先说个真事

2012 年 8 月,美国券商骑士资本(Knight Capital)上线新代码,靠人手拷到 8 台生产服务器,漏了 1 台。那台上残留的旧代码被一个新开关意外唤醒,疯狂下错单,约 45 分钟内亏掉逾 4.6 亿美元,公司实质上就此消失。技术根因并不玄:部署靠人一台台做,没有任何东西保证这 8 台一模一样。

核心的三个词

第一,同一套脚本。 开发、测试、生产,用同一份部署脚本,环境之间的差别只体现在外面那份配置文件里。因为一旦每个环境各一份脚本,它们就会各自长歪——你在测试环境验过二十遍的东西,上生产跑的其实是另一段代码。

第二,跑几遍都一样。 好脚本写的不是「依次做这 12 步」,而是「确保最后是这个样子」:发现装好了就跳过,装错了就改对。这样半路失败,重跑一次就行,不用先手工收拾残局。

第三,分层。 把「装操作系统和中间件」「放应用程序」「改配置」「迁移数据」拆成四层各自的脚本。因为它们变动的频率差着几个数量级:配置可能一天改三次,操作系统一年才动一次。混在一起,改一行配置就得把中间件重装一遍。

该从哪儿下手

别一上来就想写全套。这一章的建议很实在:从最疼的那一步开始——每次发布你最烦、最容易错的是哪一步,就先把那一步脚本化,再一点点往两头长。

代价也得说清楚:脚本化不是免费的。这些脚本自己也会有 bug、也要人维护,等于多养了一套代码。它依然划算,是因为手工部署的错误不会在测试环境暴露,只会在生产上暴露。

一句话记住

把部署写成脚本还不够——要所有环境共用同一套脚本(差异只放配置里)、跑几遍结果都一样、并且像对待产品代码一样对待它:进版本库、被评审、能重构。

想看构建工具的两派分歧、幂等的机制和对比表? → 切到精读版