配置可重现的构建

什么是可重现的构建?

可重现的构建是一组软件开发实践,它们创建了从源代码到二进制代码的可独立验证的路径。如果给定相同的源代码、构建环境和构建指令,则构建是可重现的,任何一方都可以逐位重新创建所有指定工件的相同副本。

Reproducible Central列出了通过独立于 Central Repository 中发布的参考构建进行重建而检查为可重现的项目版本。

如何配置我的 Maven 构建?

没有 Maven 版本先决条件。一切都发生在插件级别:

  1. 将您的插件升级到可重现的版本,特别是maven-jar-plugin,maven-source-pluginmaven-assembly-plugin最低版本 3.2.0。
  2. project.build.outputTimestamp通过向项目添加属性,为插件启用 Reproducible Builds 模式pom.xml
       <properties>
         <project.build.outputTimestamp>10</project.build.outputTimestamp>
       </properties>

您已经配置了基础知识。输出现在应该是可重现的。

如何测试我的 Maven 构建重现性?

使用maven-artifact-plugin's comparegoal,您可以检查项目的第二个构建是否产生与初始构建相同的输出:

  1. 构建和install您的项目:(mvn clean install不要犹豫自定义参数以更好地匹配您的项目)
  2. 重建(verify仅,不安装)并检查以前的安装:mvn clean verify artifact:compare

如何修复我的 Maven 构建重现性?

如果初始设置后某些内容仍然无法重现:

  1. 使用diffoscope查找构建之间的不稳定输出。目标提出了一个带有文件路径的artifact:buildinfo命令:只需复制/粘贴即可启动。
  2. 找到生成此输出的插件。
  3. 检查插件的可重现版本是否可用。如果没有,请打开一个问题以帮助插件维护人员在每个插件级别改进 Reproducible Builds 支持。

更多细节

Maven 的可重现构建:

  • 在依赖项中不需要版本范围
  • 由于换行符不同,通常在 Windows 和 Unix 上给出不同的结果。(Windows 上的回车换行,Unix 上的换行)
  • 一般取决于用于编译的 JDK 的主要版本。(即使定义了源/目标,每个主要的 JDK 版本都会更改生成的字节码)

有关详细说明,请参阅Maven "Reproducible/Verifiable Builds" Wiki page

常问问题

  • 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 提交时间戳,而不是在他们的.

不要犹豫,在用户邮件列表上分享您的问题或解决方案。