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

部署与发布

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

EN →

这一章讲什么?

你手机里的 App、你每天打开的网页,背后每周甚至每天都在悄悄换新版本。这一章讲的就是怎么换——怎么把新版本推到几千台机器上而不惊动任何一个正在用的人;以及更要紧的那半句:推错了,怎么在两分钟内退回去。

打个比方

过去发新版本像餐厅打烊装修:晚上十点挂出「暂停营业」,一群人熬到凌晨三点,第二天开门祈祷别出事。这一章教的是另外两招。

一招叫蓝绿:不关门,在隔壁开一家一模一样的新店,装修好、试运行过,然后只把街口的指示牌改一下——客人自动走进新店;发现不对劲,牌子再改回来,十秒钟的事,旧店一直留在那儿。

另一招叫金丝雀(名字来自矿工下井带的那只鸟:鸟先不对劲,人就赶紧撤):新菜先只端给一百桌里的两桌,盯住反应;没问题再慢慢铺开,有问题就撤掉——最坏情况也只有两桌客人吃到过。

旧世界为什么难

难的从来不是「推上去」,是没排练过。以前的发布是一份几十页的手册,由一个人在凌晨照着敲;测试环境一套步骤、生产环境另一套——于是生产这一次,成了整场流程里唯一没有彩排的演出

更要命的是退路。手册最后一页通常写着「如需回退,请把上面倒着做一遍」,而这个倒序流程从来没有人真的跑过:它第一次被执行,就是在所有人最慌的那个凌晨。很多重大事故就是这个形状——不是坏在新版本上,是坏在退不回去。

它靠什么把这事掰直

第一,上线的动作必须和平时排练的一模一样。测试、预生产、生产用同一套自动脚本装同一个包,不同的只有几行配置。同一个动作练过上百遍,做第一百零一遍时手才不会抖。

第二,能退回去比能上得去更重要。回滚不该是躺在文档里的预案,而该是天天在用的普通功能——一条常走的路,才在下雨天靠得住。

第三,别一次全换。先换一小块、盯着仪表盘,好了再扩大:把「发布」从一个非开即关的开关,变成一个能慢慢拧的旋钮。

这里有个躲不开的代价

代码能秒退,数据退不回去:新版本按新格式写进去的东西,旧版本可能根本读不懂——真正难的从来不是把程序换回去,而是让同一份数据同时被新旧两版认得。

一句话记住

把发布从「一年几次、全员通宵的大事」变成「随时能做、一键能撤的小事」:同一套脚本部署所有环境,先小范围试放,而退回去的那条路要天天走。

想看蓝绿到底怎么切、金丝雀放多少比例、回滚为什么总卡在数据上? → 切到精读版