编辑:这是关于使用Maven进行持续交付并与Jenkins合作完成。 Maven绝对不是为此而设计的,这个问题是我们努力在不使用Maven版本的情况下获得高效工作流程的一部分。感谢帮助。
我们在主要版本中使用Maven -SNAPSHOT,以确保客户始终获得该给定版本的最新代码,该代码运行良好。由于技术原因,我们有两个独立的Maven作业 - 一个用于将源代码编译为jar,另一个用于将适当的jar组合到给定的部署。这也很有效。
然后我们让Jenkins协调何时调用各个步骤,这就是它有点棘手的地方,因为如果我们在第一步中执行正常的mvn clean install
,这意味着所有快照工件都会被重新编译,这反过来使詹金斯认为所有快照都已更改(因为他们的指纹 - 也就是MD5校验和 - 已更改),即使用于生成工件的源未发生更改,也会触发 all 下游构建而不仅仅是依赖 更改的那些。
到目前为止,我确定这些内容在构建之间有所不同:
我已经找到了两种方法,但后者有点困难。似乎AbstractZipArchiver(它完成了zipFile()和zipDir()中的所有工作)并不是为了允许对存档的生成方式进行任何扩展。
现在我可以想象四种方法(但非常欢迎更多的想法):
timestamp=<number>
属性,然后将该属性用于插入jar文件的所有条目。如果未设置,则保留当前行为。prepare-package
具有特定时间戳的文件的touch
阶段。这需要所有文件在那时出现(意味着不能允许jar插件触摸MANIFEST.MF文件)同样,目标是使maven SNAPSHOT工件完全独立于时间,因此在给定相同源的情况下,您将获得具有相同MD5校验和的工件。不过,我也相信这对发布版本有益。
我该如何处理?
答案 0 :(得分:0)
根据我的评论,我仍然认为答案是不做你建议的任何事情,而是使用发布优先于快照来获取你所做的工件实际上是向客户发布的。
您描述的问题是:
我对Maven的经验告诉我,如果你尝试并坚持使用“Maven Way”,那么工具对于你来说是开箱即用的,但如果你偏离了,那么你将度过一段美好的时光。不幸的是,Maven Way有时难以捉摸: - )
如果你的模块系列具有代价不同的模块,Maven中的多模块项目非常有用,例如:你有一个包含一堆接口的模块,以及一些提供实现的兄弟模块。在多模块项目中拥有十几个模块是不寻常的。所有模块都应该共享父级的版本号(Maven没有强制执行此操作,在我看来这是令人困惑的。)
构建多模块项目的快照版本时,即使特定模块中的代码未更改,也会构建所有模块的快照。因此,您可以查看存储库中的一系列模块,并了解在编译时模块间代码引用是否满足。
例如,在域模型模块中,您可能有一个接口:
public interface Student {
void study();
}
在一些兄弟模块中,它们会在POM中声明域模型的编译范围依赖关系,你可能会有实现。
如果您要更改域模型模块中的界面:
public interface Student {
void study();
void drink(Beer beer);
}
并重建多模块项目,构建将失败。 依赖模块将无法构建,即使它们的代码和POM保持不变。在多模块项目中,如果所有子模块都成功构建,则只安装或部署工件,因此通常非常需要重建快照 - 它会告诉您有关模块间依赖关系的信息。
如果:
那么你的模块化是不正确的。不要将多模块项目用作构建系统(你有Jenkins),而是使用它代表代码模块之间的关系。
在你的评论中,你说:
RELANASE工件在被Jenkins重建时的行为方式相同。
发布工件的重点是你不重建它们 - 它们是明确的!如果你使用像Artifactory这样的东西,你会发现你不能多次部署一个发布工件 - 如果你尝试它,你的Jenkins工作就会失败。
这是Maven的一个基本原则。 Maven的目标之一是,如果两个开发人员在不同的工作站上尝试相同的版本,他们将构建功能相同的工件。如果你构建了一个表达依赖关系的工件(可能用于编译目的,或者因为它被组装成.war等),那么:
如果您可以重建发布工件,那么您可能会创建两个开发人员在其存储库中具有不同版本的可能性,并且根据您使用的工作站,您将拥有不同的版本。不要这样做。
另一个关键细节是发布工件不能依赖于快照工件,同样,您将失去各种保证。
发布是明确的,听起来你希望你的程序集依赖于确定的工件。 Jenkins使标记和发布多模块项目变得非常简单。
总结: