目标
为每个环境重新构建,等于把测试刚排除掉的所有不确定性重新请回来:依赖漂移、编译差异、时钟差异。改为晋级一个不可变的摘要,环境晋级就变成不可能改变行为的元数据操作——预发通过的与生产部署的,在字节层面必然相同。
步骤要点
- 从打标的提交构建唯一产物,把摘要、构建链接、测试结果作为不可变元数据附在产物上。
- 所有环境流水线改为按注册表摘要部署,弃用可变 tag 或分支名引用。
- 每次晋级设门:进预发前过集成测试,进生产前过签署,门禁证据入审计日志。
- 晋级即移动指针:把环境指针(channel 或 tag)推进到已验证摘要,绝不重建也绝不在既有产物上重打标。
- 生产部署后比对已部署摘要与预发批准摘要,不一致立即告警。
排错提示
生产摘要与预发不一致几乎总是某处仍在重建,搜流水线里的 build 步骤并改为 digest 引用;配置被烙进产物字节是因为构建参数混入了环境值,把环境差异全部外置为部署时注入;审计日志缺 actor 说明有人手工挪了指针,收回直接写注册表的权限并走晋级 API。
适用边界
本流程要求注册表支持不可变摘要与指针,可变 tag 体系要先改造;按摘要部署后回滚也是指针操作,速度取决于注册表而非构建队列,容量规划要相应调整。
代码示例
registry: app@sha256:9f21c4...
build: run #4821 (tag v1.8.0, commit 7ab3e1)
tests: 412/412 green
pointers (promotion = pointer move):
dev -> sha256:9f21c4... (auto after green)
staging -> sha256:9f21c4... (after integration suite)
prod -> sha256:9f21c4... (after sign-offs)
audit: staging->prod by ops@team, gate: release-checklist #88, 14:02Z