可重现构建(reproducible builds)是一组软件开发实践,如果给定相同的源代码、构建环境和构建指令,任何一方都可以bit-by-bit重新构建出相同副本,则构建是可重现的。本文将探讨可重现构建的重要性,以及在maven项目中如何实现这一目标。

为什么需要可重现构建?

不知道你有没有发现,你的java工程在没有修改代码的情况下,两次构建出来的jar/war包md5值是不一样的。为什么会出现这种情况呢?jar包其实是一个zip压缩包,当你解包两次构建查看其中的差异时,你会发现最明显的区别就是文件夹的时间不一样了:

截屏2024-05-30 19.58.28.png

除了时间不一样以外,还有元数据等等,具体要解决的问题,在apache官网有个提案,记录了可重现构建需要解决的问题。

至于可重现构建带来了什么好处,你可以自行思考,我这里举些例子:

  • 在CI流程中,如果构建的结果和上次一样,那么就说明代码是没有任何改变的,那么单元测试、自动化测试等环节在本次构建中就没有必要重复做了。
  • 如今应用基本上都用容器部署了,本次构建结果和上次一样,镜像的hash值也是一样的,那么就可以优化CD流程,本次构建也没必要部署了。

如果没有可重现构建,以上这些CI/CD的优化是很难做到的。

Maven可重现构建实践

根据官网文档的说明,只需要在你的工程项目的pom文件中加这么一行配置就可以了:

   <properties>
     <project.build.outputTimestamp>2023-01-01T00:00:00Z</project.build.outputTimestamp>
   </properties>

加这个一个配置之后,再次两次构建,我们再解包看下:

截屏2024-05-31 14.05.48.png

可以看到,所有文件的时间戳都被修改成一样的,在未修改代码的情况下每次构建出来的jar包都具有相同的md5值。

标签: none

添加新评论