出了事追不到谁发的版
凌晨线上崩了,赶紧回滚止血。但天亮复盘时,发现一个尴尬的问题:谁发的这一版?改了哪些代码?在哪一步发上去的?——流水线跑过就跑过了,日志没人留,制品和代码对不上,根本查不清。这就是流水线没做审计的后果。
前面讲 CI/CD 流水线时重点在"怎么自动化发版",这一篇反过来问:发完之后,每一步能不能被追溯、被审查、被复盘。这在有合规要求的团队尤其重要。
自动化让发版变快,审计让发版可控。快和控缺一不可。
- 制品溯源每个上线的包能追到具体代码提交。
- 审批留痕谁批的、谁发的,都有记录。
- 环境隔离测试环境别和生产混。
- 权限最小化只有必要的人能动生产。
制品溯源:每个包都能追到代码
最基本的审计要求是:生产上跑着的这个制品,能说清它是哪一段代码编译出来的。做法是给每个制品打上唯一标识——把 git 的提交编号写进制品里:
制品溯源的关键:
- 构建时,把当前 git commit 编号写进镜像/包
- 生产上查到版本号,立刻对应到具体代码提交
- 这样出问题能精确知道改了什么
没有这个标记,版本号就是个"v1.2.3",谁也不知道它里面到底装了哪次提交的代码。加个 commit 标记,溯源就通了。
审批留痕:谁点的发布
生产环境的发布不能谁想发就发。关键是每次发布都留下记录:谁发起、谁审批、什么时候发的、发的哪个版本。流水线工具一般支持在发生产那一步加一个审批卡点:
发布审批卡点:
- 测试环境发布:自动,无需审批
- 生产环境发布:需要人工点击批准
- 批准人、时间、备注都记入流水日志
这样事后复盘,"这版是谁批的、为什么批"都查得到。出了事不会变成一笔糊涂账。
流水线日志:能回放每一步
流水线每一步的日志要完整保留下来:构建、测试、部署,每一步跑了什么、成功还是失败、耗时多久。出了问题能回放当时这一步到底发生了什么,而不是只能猜。
日志别只留几天就清掉——至少保留到能覆盖一次完整的复盘周期。很多团队流水线日志默认只存一周,等真要查的时候早就没了。
环境隔离:别让测试污染生产
审计里一个高频事故是:本想部署到测试环境,手滑发到了生产。或者测试环境的配置、脚本和生产共用,结果测试数据写进了生产。解决办法是把环境彻底隔离开:
环境隔离的做法:
- 测试/预发/生产,三套独立配置和权限
- 部署目标环境要显式指定,不能默认
- 生产环境的部署走单独的、要审批的流水线
关键是别让"发生产"是顺手就能做的事——多一步确认、多一道审批,手滑的代价就小多了。
生产权限最小化
最后是权限:能直接动生产的人越少越好。大部分开发应该只能看生产,不能改;发布走流水线,不靠人手动登录上去部署。这样即使账号泄露,能造成的破坏也有限。
这和前面讲的 K8s 安全里的 RBAC 是一个思路——按岗位给最小必要权限,定期审查谁还有生产权限。离职、转岗的人,权限要及时回收。
一套最小审计方案
如果你的流水线现在是"跑完就忘",按这个最小路径:
第一步:制品打 commit 标记
- 每个上线包都能追溯到代码
第二步:生产发布加审批卡点
- 谁批的、什么时候发的,都有记录
第三步:流水线日志完整保留
- 至少存够一个复盘周期
第四步:隔离三套环境
- 测试别手滑发生产
第五步:收窄生产权限
- 能发生产的人越少越好
审计不是为了给开发找麻烦,而是出了事能快速查清、不背锅,更是合规过审的硬要求。配合前面讲的 CI/CD、GitOps 和 K8s 安全,整个交付链路就既快、又安全、又可追溯了。