编辑:这是关于使用 Maven 进行持续交付并与 Jenkins 进行协调。Maven 绝对不是为此而设计的,这个问题是我们在不使用 Maven 版本的情况下获得高效工作流程的一部分。帮助表示赞赏。
我们在主要版本中使用 Maven -SNAPSHOTs,以确保客户始终获得该给定版本的最新代码,该版本运行良好。出于技术原因,我们有两个独立的 Maven 作业 - 一个用于将源代码编译为 jar,另一个用于将适当的 jar 组合到给定的部署中。这也很有效。
然后我们让 Jenkins 编排何时调用各个步骤,这有点棘手,因为如果我们mvn clean install
在第一步中执行正常操作,这意味着所有快照工件都会重新编译,这反过来又让 Jenkins 认为所有即使用于生成工件的源没有更改,快照也会更改(因为它们的指纹 - 也称为 MD5 校验和 - 已更改),从而触发所有下游构建,而不仅仅是那些依赖项确实发生变化的构建。
到目前为止,我已经确定这些东西在构建之间有所不同:
- META-INF/maven/.../pom.properties(因为它包含时间戳)
- META-INF/MANIFEST.MF(包含 JDK 和用户)
- jar 文件中的时间戳
我首先找到了解决这两个问题的方法,但后者有点困难。似乎 AbstractZipArchiver (它在 zipFile() 和 zipDir() 中完成所有工作)不是为了允许对存档的生成方式进行任何类型的扩展。
现在我可以想象四种方法(但非常欢迎更多想法):
- 创建当前 maven-jar-plugin 实现的派生,允许一个
timestamp=<number>
属性,然后将其用于插入到 jar 文件中的所有条目。如果未设置,则保留当前行为。 - 修改 Jenkins 指纹方案,使其了解 jar 文件并且只查看条目内容,而不查看它们的元数据。
- 将插件附加到
prepare-package
负责touch
生成具有特定时间戳的文件的阶段。这要求当时所有文件都存在(意味着不允许 jar 插件接触 MANIFEST.MF 文件) - 将一个额外的插件附加到“包”阶段,它会重写完成的 jar 文件,将过程中的所有 zip 条目时间戳归零。
同样,目标是使 maven SNAPSHOT 工件完全独立于时间,因此在相同的源下,您将获得具有相同 MD5 校验和的工件。但是,我也相信这可能对发布版本有益。
我应该如何处理这个?