9. 制品与依赖:构建产物、版本号、语义化与可追溯
CI/CD 的核心对象是制品(artifact),不是源码。
本章目标
建立“制品优先”的交付观:交付的对象是可追溯、可验证、可复现的制品,而不是源码。
你会掌握
版本与追溯、依赖锁定、制品仓库、以及 SBOM/签名/供应链的基本体系与落地路径。
真实收益
当线上出现问题,你能回答:这台机器跑的到底是哪一个构建?它从哪里来?依赖是什么?能否验证它没被篡改?
很多事故都有同一张脸:“我本地没问题”。你问:线上跑的是哪个版本?对方说:应该是最新的。
这就是“源码优先”思维的典型后果:你交付的不是一个确定对象,而是一串不确定过程。
DevOps 的成熟标志之一,是把交付从“猜测”变成“证据”:制品、版本、追溯、验证。
这就是“源码优先”思维的典型后果:你交付的不是一个确定对象,而是一串不确定过程。
DevOps 的成熟标志之一,是把交付从“猜测”变成“证据”:制品、版本、追溯、验证。
1) 制品(Artifact)是什么?为什么它比源码更重要?
制品是“可以被部署/运行”的产物,例如:
- Docker 镜像(image)
- 二进制文件(可执行程序)
- 包(npm/pip/maven/nuget 的发布产物)
- 静态资源包(前端 build 后的产物)
源码只是“配方”;制品才是“出餐”。你想要稳定交付,就要确保每次出餐都是同一道菜,并且你能追溯这道菜是怎么做出来的。
制品优先的关键承诺:
- 同一个制品在 dev/staging/prod 里应当是同一个对象(最多是配置不同)
- 你不会在生产环境“现场编译”
- 任何问题都能追溯到一次构建与一次提交
- 同一个制品在 dev/staging/prod 里应当是同一个对象(最多是配置不同)
- 你不会在生产环境“现场编译”
- 任何问题都能追溯到一次构建与一次提交
图 1:制品流水线(Build → Store → Deploy)(动态)
一旦把“构建”与“部署”解耦,交付就从不确定过程变成确定对象:制品是中心。
2) 版本:语义化版本只是表面,追溯才是核心
版本号的意义不是“好看”,而是让你能稳定回答:
- 这次发布包含哪些提交?
- 这次发布用的依赖版本是什么?
- 线上跑的制品能否对应到一次 CI 构建?
实践上,你至少要做到:
- 源码追溯:commit SHA 或 tag
- 制品追溯:镜像 digest / 包的不可变版本
- 构建追溯:CI run id / build number / build logs
一个强烈建议:对 Docker 镜像优先用 digest(不可变),不要只用 tag(可被覆盖)。
tag 像“外号”,digest 像“身份证号”。
tag 像“外号”,digest 像“身份证号”。
3) 依赖:你不是在写代码,你是在选择供应链
现代软件的大部分代码来自依赖。依赖的问题通常分两类:
- 可复现性:今天装和明天装是不是同一份依赖?
- 安全性:依赖里有没有漏洞?有没有被投毒?许可证是否合规?
锁文件(lockfile)的真正意义
锁文件不是“烦人文件”,它是可复现构建的锚点:让依赖解析结果固定下来。
- Node:
package-lock.json/pnpm-lock.yaml/yarn.lock - Python:
requirements.txt(固定版本)或 lock 工具生成的锁定文件 - Java:maven/gradle 的锁定与仓库策略
图 2:依赖图 + 锁定的“收敛”效果(动态)
没有锁文件时,依赖解析像“开盲盒”;有锁文件时,它像“按图施工”。
4) SBOM 与签名:让交付“可验证”,而不是“可相信”
SBOM(Software Bill of Materials)可以理解为“软件物料清单”:列出制品里包含哪些依赖、版本、来源。
签名与验证则让你能回答:这个制品是否来自我们认可的构建流程?中途有没有被替换?
一句话说清楚差别:可相信(trust)靠人的记忆;可验证(verify)靠证据与机制。
在供应链里,越少依赖“相信”,系统越稳。
在供应链里,越少依赖“相信”,系统越稳。
图 3:可信交付链(Provenance / SBOM / Signature)(动态)
从源码到制品的每一步都留下“可验证的痕迹”,让审计与追溯成为默认能力。
5) 落地清单:你今天就能升级的 7 件事
- 制品唯一标识:对镜像用 digest,对包用不可变版本。
- 制品仓库统一化:让 CI 写入、CD 读取,权限边界清晰。
- 版本与追溯写入制品:把 commit/build id 写进镜像标签、元数据或运行时信息。
- 锁文件进仓:让依赖解析可复现;更新依赖要走 PR 与门禁。
- SCA 扫描:依赖漏洞与许可证合规纳入门禁。
- 生成 SBOM:至少对发布制品生成一份可检索的 SBOM。
- 逐步引入签名验证:先签名再验证,最后把验证做成强制门禁。
本章小结:制品是交付系统的中心对象
- 源码是配方,制品是出餐;交付要围绕制品建立确定性。
- 锁文件让构建可复现;digest/追溯让运行可解释。
- SBOM/签名/证据链让交付可验证,供应链风险从“不可控”变成“可治理”。