配置可重现的构建
什么是可重现的构建?
可重现的构建是一组软件开发实践,它们创建了从源代码到二进制代码的可独立验证的路径。如果给定相同的源代码、构建环境和构建指令,则构建是可重现的,任何一方都可以逐位重新创建所有指定工件的相同副本。
Reproducible Central列出了通过独立于 Central Repository 中发布的参考构建进行重建而检查为可重现的项目版本。
如何配置我的 Maven 构建?
没有 Maven 版本先决条件。一切都发生在插件级别:
- 将您的插件升级到可重现的版本,特别是
maven-jar-plugin
,maven-source-plugin
和maven-assembly-plugin
最低版本 3.2.0。 project.build.outputTimestamp
通过向项目添加属性,为插件启用 Reproducible Builds 模式pom.xml
:<properties> <project.build.outputTimestamp>10</project.build.outputTimestamp> </properties>
您已经配置了基础知识。输出现在应该是可重现的。
如何测试我的 Maven 构建重现性?
使用maven-artifact-plugin
's compare
goal,您可以检查项目的第二个构建是否产生与初始构建相同的输出:
- 构建和
install
您的项目:(mvn clean install
不要犹豫自定义参数以更好地匹配您的项目) - 重建(
verify
仅,不安装)并检查以前的安装:mvn clean verify artifact:compare
如何修复我的 Maven 构建重现性?
如果初始设置后某些内容仍然无法重现:
- 使用diffoscope查找构建之间的不稳定输出。目标提出了一个带有文件路径的
artifact:buildinfo
命令:只需复制/粘贴即可启动。 - 找到生成此输出的插件。
- 检查插件的可重现版本是否可用。如果没有,请打开一个问题以帮助插件维护人员在每个插件级别改进 Reproducible Builds 支持。
更多细节
Maven 的可重现构建:
- 在依赖项中不需要版本范围,
- 由于换行符不同,通常在 Windows 和 Unix 上给出不同的结果。(Windows 上的回车换行,Unix 上的换行)
- 一般取决于用于编译的 JDK 的主要版本。(即使定义了源/目标,每个主要的 JDK 版本都会更改生成的字节码)
常问问题
- Q.
project.build.outputTimestamp
属性pom.xml
可以在发布时自动更新吗?答:是的。
详细信息取决于您的发布流程工具:
- 如果您使用maven-release-plugin,则需要版本 3.0.0-M1 或更高版本
pom.xml
:它会在更新版本的同一提交中自动更新时间戳值, - 如果您有自定义发布流程工具,则需要将该功能添加到您的发布工具中。请注意,如果您
versions-maven-plugin
在自定义发布脚本中使用,从发布 2.9.0 开始,versions:set
目标会更新属性。 pom.xml
有些人倾向于使用最后一个 Git 提交时间戳,而不是在他们的.
- 如果您使用maven-release-plugin,则需要版本 3.0.0-M1 或更高版本
不要犹豫,在用户邮件列表上分享您的问题或解决方案。
- Q. 哪些额外的插件需要为 Reproducible Builds 更新?
A. 这是一个简化的列表:
插入 最低版本 注释 maven-程序集插件 3.2.0 maven-jar-插件 3.2.0 maven-ejb-插件 3.1.0 maven-javadoc-插件 3.2.0 还需要 <notimestamp>true</notimestamp>
配置pluginManagement
(用于从插件和报告中自动使用)maven-插件-插件 3.5.1 Maven 远程资源插件 1.7.0 maven-shade-插件 3.2.3 maven 站点插件 3.9.0 Maven 源插件 3.2.1 Maven 战争插件 3.3.1 maven-ear-插件 3.1.0 丛组件元数据 2.1.0 bnd-maven-插件 见配置说明 Apache Felix maven-bundle-plugin 5.1.3 Eclipse Sisu Maven 插件 0.3.4 springboot-maven-插件 2.3.0-M4 还没有战争(因为 maven-war-plugin 还不行) MojoHaus属性-maven-plugin 1.1.0 有关更多详细信息,请参阅Maven “Reproducible/Verifiable Builds” Wiki 页面