周五部署代码,到底有什么不一样?
它不只是一条命令,不只是一次 git push,也不只是流水线又变绿了一次。周五的部署,有自己的性格。工作日里,部署像工程;到了周五,部署更像一场小型冒险。
功能测过了,代码审过了,日志查过了,那个 pull request 盯得够久,每一行都认得出来。一切看起来都准备好了。然后有人问一句:“今天能上吗?”房间里的气氛,忽然就变了。
光标移向终端,最后一次测试跑完,部署按钮安静地等着。而开发者脑子里有个小小的声音在问:我们真的要在周五干这事吗?
从信心满满开始
每一次部署都从信心开始,至少大多数是这样。
你花了好几个小时写这个功能,也许是好几天。你新建了一个接口,可能改了一条数据库查询,也许加了一个新的界面组件,甚至把应用的一部分整个重写了。你在本地测过,跑了自动化测试,检查了预发环境,翻过了日志。
到这一步,感觉不错。代码已经跨过了那条看不见的线,从“没写完”变成了“可以了”。你开始把部署当成一道手续:功能完成了,剩下的只是把它送进生产环境。
这是最平静的部分。服务器健康,咖啡都更好喝,你是一个一切尽在掌握的工程师。
然后周五登场了。
机器不在乎周五,人会在乎
严格来说,周五只是普通的一天。计算机不知道今天是周五。服务器不会看一眼日历说:“有意思,周末快到了,我们是不是该表现得不一样一点。”数据库不在乎,接口不在乎,负载均衡器也不在乎。
但人在乎。周五往往意味着一周工作的结束,人们准备离开,去陪家人、去旅行、去休息、去看电影、去打游戏、去玩音乐,或者干脆几个小时不看代码。这就改变了部署的情绪含义。
周一的部署背后有一整周撑着。如果出了意外,通常有充足的时间去排查。周五的部署不一样,因为开发者已经能想象出周末消失在终端窗口里的样子。
这不一定是因为会出问题。大多数部署都完全正常。这种感觉来自“可能性”。软件和可能性的关系很奇特:一切都可以运转得很好,但仍然可能存在某个你没想到的地方。
部署越来越近了。你又跑了一遍测试,不是因为你一定需要跑。测试套件启动了,然后你想起还有一个测试忘了跑,于是也补上。你检查环境变量,看部署配置,这东西你见过很多次了,但周五把普通的配置变成了文学作品,于是你又读了一遍。
代码离开你的机器那一刻
最终,代码进了 Git。情绪之旅在这里变得有点哲学。
你看一眼自己的分支:一切都提交了,工作区是干净的。Git 说:nothing to commit, working tree clean。漂亮。干净的工作区是软件工程里那种小小的愉悦,就像把家里每个抽屉都关上,知道所有东西都在该在的位置。
你检查最新的提交,看提交信息,想着要不要改一下。然后敲下 git push。终端回应了,代码开始它的旅程。它不再只待在你的机器上,它正在走向世界。
这个转变出人意料地有情绪。代码最初是一个想法,然后变成文字,再然后变成服务器上运行的东西。在这段旅程的终点,某个地方的某个人可能会点一下按钮,在不知情的情况下和你创造的东西发生交互。这是软件开发里安静的快乐之一。
接着 CI/CD 流水线开始了。这是耐心变成工程技能的地方。你盯着流水线,刷新页面。部署成功。
有那么一瞬间,一切都很完美。但有经验的开发者知道,部署成功不等于发布成功。部署系统可以报告成功,而应用仍然需要观察。于是你打开生产环境,测试新功能,检查数据库,一切看起来正常。你看日志,看监控面板,一切平静。应用活着。
你已经跨过了最重要的心理边界:生产环境不再是理论上的。功能真实地存在于真实环境里。
然后有趣的事情发生了。没有神秘的电话打来。这是软件工程里最好的声音之一:健康的生产系统不会总是宣告自己,有时候成功就是没有问题。你坐在那里几分钟,看着指标,图表继续移动,用户继续使用应用,系统正在做它被设计来做的事。
也许周五部署终究没那么戏剧化。
然后你的想象力开始工作了。这是开发者变得极其有创造力的时候。万一那个边界情况发生了呢?你想到不寻常的输入,意想不到的请求,那个把按钮点了十七次的用户,那条从 2019 年就存在的数据库记录,那个账号配置很老的客户……
