专业书籍精读 · SRE · 第 8 章

发布工程:发得快只是结果,能原样重来才是地基

Site Reliability Engineering · Ch 8 · Dinah McNutt · Google · 2016

EN →

这一章讲什么?

你手机里那个 App,昨天还是 3.2.1,今天变成了 3.2.2。从工程师敲完最后一行代码,到新版本真的跑在你手机上,中间隔着一整套动作:编译、打包、测试、分批推送。Google 这本书的第 8 章讲的就是这段路——而它的立场很鲜明:这不该是「谁有空谁来」的收尾杂活,它是一门有专职工程师、有原则、有工具的学科,叫「发布工程」。

先打个比方

把发布想成药厂生产。写代码像研发出配方,发布像把配方变成一板一板的药片。药厂最看重的从来不是「今天产量多高」,而是三件事:同一张配方,换哪条产线、隔多久再做,做出来的药片必须一模一样;每一批都能追溯是谁、用哪批原料、哪天做的;真出了问题,能精确召回那一批,而不是全厂停产。软件发布要的,恰好是同样这三件事。

旧世界为什么难

老办法是:到了发布日,某个最熟的人登上服务器,按一份写在脑子里的步骤敲一遍。麻烦有三层:换台机器就做不出同样的东西(他电脑上恰好装了个别人没有的库,于是「在我这儿明明能跑」);半年发一次、一次夹带几千处改动,出事根本不知道是哪一处干的;想退回上一版只能从头再造一遍,几十分钟起步,造出来的还未必和上次那个一样。

核心的点子:四条规矩

自助——中央团队只造工具、不当守门人,各团队按自己的节奏自己发;不然那个中央团队就是全公司的排队瓶颈。

小步快跑——发得越勤,每次夹带的改动越少;真出事时嫌疑犯就那么几个,一眼揪出来。

自带全套原料的密闭厨房——编译时不许用「这台机器上现成的」任何东西,用到的工具、材料统统写死版本、跟着源码一起存。于是同一份源码,今天在这台、三个月后在那台,烤出来的是同一炉面包。好处很实在:线上出急事,你能回到三个月前那一版、只补上那一处修复,而不必把这三个月里其他人的改动全带上去。

门禁与台账——谁能改代码、谁能批准上线、谁能推到生产,全写进工具里管着,每一步自动留痕。

还有一半的坑,在「说明书」上

真正把线上搞挂的常常不是程序本身,而是配置——那些开关、参数、地址。这一章的忠告是:把配置也当成货来管,一样打包、一样编版本号、一样能单独退回。把配置和程序捆在一起发最省事,但改一个开关就得重发整个程序;让程序运行时去外面读最灵活,可那样「此刻生效的是哪一份」就没人说得清了。

一句话记住

发布工程要的不是「发得快」,而是发得可复刻、可追溯、可单独退回:同一份源码在任何机器上都造出同一个程序,配置和程序各有各的版本号,谁批准了什么全有台账——快,是这些做到之后自然来的结果。诚实说一句代价:这套东西前期要专门投人投工具,小团队照搬 Google 的规格并不划算,能搬的是原则而不是编制。

想进到具体机制、分支模型和示意图? → 切到精读版