上线原来靠一张纸条,贴在运维显示器右边框上,五步:拉代码、改配置、备份、reload、点 5 个页面看看。字是手写的,两年里改过三次,最后那次把「别忘了清缓存」挤在了角落。
4 月把它搬进 Jenkins。
流水线长什么样
一条 job,7 个阶段:拉指定分支、装依赖、跑测试、打包、传到目标机、备份当前版本、切软链并 reload。产物文件名带 Git 短哈希,比如 app-20200409-a3f7c2.tar.gz,放到 releases 目录,current 是个软链指过去。
回滚就是选上一次的制品,把软链重新指一下,不重新构建、不重新拉代码。跟之前灰度那套 Nginx 权重是两回事,这个更笨,但够用。
第一次跑出的岔子
备份那一步写的是 shell 脚本,忘了加 set -e。备份其实失败了,脚本却继续往下走,把新版本切上去了。好在是预发环境,没影响线上,但当时看着日志一路绿到底,心里发毛。
改完加了两样:每个脚本开头 set -euo pipefail;备份完立刻校验产物大小非 0,不对就整个停掉。
配置不进仓库
有段时间总有人问,数据库密码放哪。我们没放进 Git,放在目标机一个只有部署账号能读的文件里,Jenkins 里只存一个 SSH 私钥。改配置走另一条单独的审批,不跟发版混在一起。
那 5 个页面
原来人肉点的 5 个页面,写成了 5 条 curl 检查:首页 200、登录接口返回预期字段、静态资源能取到、接口不报 500、健康检查端点通。任何一条失败,流水线停在切软链之前。
不测业务正确性,只测「活着」。业务那部分还是人点,我们没敢省。
纸条
纸条没扔,压在键盘下面了。有回 Jenkins 服务自己挂了,有人照着走了一遍,五步还在,字还认得。

