9. 制品与依赖:构建产物、版本号、语义化与可追溯

CI/CD 的核心对象是制品(artifact),不是源码。

本章目标

建立“制品优先”的交付观:交付的对象是可追溯、可验证、可复现的制品,而不是源码。

你会掌握

版本与追溯、依赖锁定、制品仓库、以及 SBOM/签名/供应链的基本体系与落地路径。

真实收益

当线上出现问题,你能回答:这台机器跑的到底是哪一个构建?它从哪里来?依赖是什么?能否验证它没被篡改?

很多事故都有同一张脸:“我本地没问题”。你问:线上跑的是哪个版本?对方说:应该是最新的。
这就是“源码优先”思维的典型后果:你交付的不是一个确定对象,而是一串不确定过程。
DevOps 的成熟标志之一,是把交付从“猜测”变成“证据”:制品、版本、追溯、验证

1) 制品(Artifact)是什么?为什么它比源码更重要?

制品是“可以被部署/运行”的产物,例如:

源码只是“配方”;制品才是“出餐”。你想要稳定交付,就要确保每次出餐都是同一道菜,并且你能追溯这道菜是怎么做出来的。

制品优先的关键承诺:
- 同一个制品在 dev/staging/prod 里应当是同一个对象(最多是配置不同)
- 你不会在生产环境“现场编译”
- 任何问题都能追溯到一次构建与一次提交

图 1:制品流水线(Build → Store → Deploy)(动态)

一旦把“构建”与“部署”解耦,交付就从不确定过程变成确定对象:制品是中心。

Build CI 生成制品 版本 + 元数据 + 校验 Store 制品仓库 registry / package repo Deploy CD 拉取同一制品 按环境注入配置 要点:构建一次、存一次、部署多次;同一制品跨环境复用。

2) 版本:语义化版本只是表面,追溯才是核心

版本号的意义不是“好看”,而是让你能稳定回答:

实践上,你至少要做到:

一个强烈建议:对 Docker 镜像优先用 digest(不可变),不要只用 tag(可被覆盖)。
tag 像“外号”,digest 像“身份证号”。

3) 依赖:你不是在写代码,你是在选择供应链

现代软件的大部分代码来自依赖。依赖的问题通常分两类:

锁文件(lockfile)的真正意义

锁文件不是“烦人文件”,它是可复现构建的锚点:让依赖解析结果固定下来。

图 2:依赖图 + 锁定的“收敛”效果(动态)

没有锁文件时,依赖解析像“开盲盒”;有锁文件时,它像“按图施工”。

Dependencies direct + transitive 版本解析可能漂移 Lockfile resolved versions 可复现构建锚点 Reproducible same input → same output 减少“本地没问题” 要点:锁定不是束缚,是让构建输出可预测。

4) SBOM 与签名:让交付“可验证”,而不是“可相信”

SBOM(Software Bill of Materials)可以理解为“软件物料清单”:列出制品里包含哪些依赖、版本、来源。

签名与验证则让你能回答:这个制品是否来自我们认可的构建流程?中途有没有被替换?

一句话说清楚差别:可相信(trust)靠人的记忆;可验证(verify)靠证据与机制。
在供应链里,越少依赖“相信”,系统越稳。

图 3:可信交付链(Provenance / SBOM / Signature)(动态)

从源码到制品的每一步都留下“可验证的痕迹”,让审计与追溯成为默认能力。

Source commit / tag 变更可追溯 Build Evidence provenance + logs 谁/何时/如何构建 Artifact SBOM + signature 可验证、可审计 要点:把交付从“相信”升级为“可验证”,供应链风险会显著下降。

5) 落地清单:你今天就能升级的 7 件事

  1. 制品唯一标识:对镜像用 digest,对包用不可变版本。
  2. 制品仓库统一化:让 CI 写入、CD 读取,权限边界清晰。
  3. 版本与追溯写入制品:把 commit/build id 写进镜像标签、元数据或运行时信息。
  4. 锁文件进仓:让依赖解析可复现;更新依赖要走 PR 与门禁。
  5. SCA 扫描:依赖漏洞与许可证合规纳入门禁。
  6. 生成 SBOM:至少对发布制品生成一份可检索的 SBOM。
  7. 逐步引入签名验证:先签名再验证,最后把验证做成强制门禁。

本章小结:制品是交付系统的中心对象

← 上一章:评审与门禁 下一章:CI 总览 →