基于Jenkins的Maven构建-上游版本范围解析为在并发作业中构建的版本



我们有一个Jenkins构建,它在初始阶段试图通过版本范围来确定一些依赖项的最新部署版本,这些版本范围也是由同一Jenkins实例构建的。每个构建都针对几个工件,所有工件都有一个共享版本,所以我们希望选择已经完成的最新版本。我们通过使用一个特殊的pom来实现这一点,该pom依赖于特定的pom——这些pom是由其他构建最后部署的。

问题是,如果其他构建之一正在运行,但尚未部署pom,maven的版本范围解析最终会为正在进行的构建选择版本,然后由于一些依赖项尚未构建而失败。

这不是由依赖项启动的下游构建。无论如何,我们已经尝试过";为下游构建启用隔离解析";以及";从Artifactory"解析工件";但两者都无济于事。

如果项目是一个普通的UI"maven项目;然后有一个使用专用Maven存储库复选框,该复选框使用特定于工作区的Maven存储缓存

通常,Jenkins使用由Maven确定的本地Maven存储库——确切的过程似乎没有记录,但它是~/.m2/repository,可以在~/.m2/settings.xml中被覆盖(有关更多详细信息,请参阅参考资料(这通常意味着在同一节点上执行的所有作业共享一个Maven存储库。这样做的好处是可以节省磁盘空间,但缺点是有时这些构建可能会相互干扰。例如,您最终可能会错误地成功构建,只是因为您在本地存储库中拥有所有依赖项,尽管事实上POM中没有一个存储库可能拥有这些依赖项。

也有一些关于并发Maven进程尝试使用相同的本地存储库。

选中此选项后,Jenkins将告诉Maven使用$WORKSPACE/.restore作为本地Maven存储库。这意味着job将获得自己的独立Maven存储库。它以牺牲额外磁盘空间为代价修复了上述问题消耗

使用此选项时,请考虑设置Maven工件管理器这样您就不必经常访问远程Maven存储库。

如果您希望在执行的所有Maven作业中激活此模式关于詹金斯,请参阅此处描述的技术。

如果是管道作业,则需要mavenLocalRepo设置,请参阅:https://plugins.jenkins.io/pipeline-maven/

如果这是一份自由式的工作,你唯一的选择就是手工

通过使用此选项,Jenkins将告诉Maven使用一个自定义的构建路径作为本地Maven存储库,方法是使用-Dmaven.report.local如果指定为相对路径,则此值将根据工作区根目录而不是当前工作目录进行解析。例如,如果指定了.repository值,则为$WORKSPACE/.repository。

问题是由于Jenkins maven本地存储库造成的——在当前配置中,这似乎是在构建之间共享的。因此,运行中的构建能够获取尚未部署的已安装pom。

当我们解析版本范围时,我们通过添加-Dmaven.local.repo=${WORKSPACE}/.m2/repository来解决这个问题——这样,在这个阶段,构建就与其他并发构建隔离开来。

最新更新