首页/开发/CI/CD 与发布速查/构建确定性技巧(SOURCE_DATE_EPOCH 等)
构建与制品管理58 条

构建确定性技巧(SOURCE_DATE_EPOCH 等)

消除构建中的非确定性来源:时间戳用 SOURCE_DATE_EPOCH、排序稳定、路径规范化,让「同输入同输出」可测量。

CI/CD 与发布速查开发更新于 2026-10-12
时间戳export SOURCE_DATE_EPOCH=$(git log -1 --format=%ct)(被众多工具链识别)
归档tar --sort=name --mtime 固定 + gzip -n 去掉名称时间
路径构建目录固定或在产物中剔除绝对路径

可复现打包

可复现打包
export SOURCE_DATE_EPOCH=$(git log -1 --format=%ct)
tar --sort=name --mtime="@${SOURCE_DATE_EPOCH}" --owner=0 --group=0 -cf app.tar dist/
gzip -n app.tar
先做双次构建比对(两次产物哈希是否一致),逐项定位差异再逐项消除。

易错点

  • 只设环境变量未全链路传递:深层工具没收到,构建仍带当前时间
  • 文件系统遍历顺序依赖:产物清单顺序漂移,显式排序

数据来源与参考

  • reproducible-builds.org《SOURCE_DATE_EPOCH》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌