阻止 Jenkins 将工件安装到本地 Maven 存储库

Posted

技术标签:

【中文标题】阻止 Jenkins 将工件安装到本地 Maven 存储库【英文标题】:Prevent Jenkins from Installing Artifact to Local Maven Repository 【发布时间】:2011-11-26 18:59:50 【问题描述】:

Jenkins 正在将最近构建的工件安装到本地 Maven 存储库,即使该作业的执行目标仅为 clean package

当有人不小心提交了共享库的更新版本而没有增加库的 POM 中的版本号时,这会导致问题。 Jenkins 构建了 jar,将其安装到本地 Maven 存储库,然后(按照配置)将工件部署到我们共享的 Nexus 存储库。 Nexus 完全正确地拒绝接受新工件,因为它已经有一个具有给定版本号的版本。

一段时间后,Jenkins 构建了一个依赖于该库的项目,并使用其 本地 Maven 存储库而不是 Nexus 中的库副本。因此,该项目是使用错误版本的代码构建的。

似乎有两种可能的解决方案:

    阻止 Jenkins 错误地将 .jar 安装到本地 存储库 在以下情况下阻止使用本地存储库 构建依赖库的项目

【问题讨论】:

【参考方案1】:

您可以防止在 Nexus 中部署重复的工件。每个工件都应附加一个内部版本号以避免混淆。避免使用 SNAPSHOT 版本,因为它们会让人头疼。

【讨论】:

谢谢,但这个问题是指本地存储库,而不是远程存储库。 我很抱歉——我读得太快了。在这种情况下,每次构建隔离本地 maven 存储库似乎是一种更明智的方法。然后应将每个构建配置为仅从“发布”存储库中检索经过全面测试的工件。这意味着在为消费者发布公共库时要进行良好的规划/沟通。【参考方案2】:

我想知道是否有一个选项可以实际使用(共享)本地存储库但关闭对其的写入(即仅将工件部署到远程存储库)。这是为了减少并发更新的数量(但仍然保持正常的磁盘使用:)

【讨论】:

【参考方案3】:

Jenkins 作业配置中有一个设置是使用私有存储库。这样,您可以避免 Jenkins 构建中的人工制品进入您的主存储库。您需要打开 Maven 构建的扩展选项才能看到该选项。

【讨论】:

我已经尝试过了,遗憾的是它没有任何区别。我手边没有 JIRA 链接,但我相信这是 Jenkins 中的一个已知问题。【参考方案4】:

这是发布到本地存储库的 install 目标...所以第一个问题我没有答案。

第二个问题可以通过隔离每个构建来解决。将它们配置为使用自己的本地存储库,这样一个错误就不会影响其他人:

mvn -s settings.xml compile package

在设置文件中声明构建作业的本地存储库的唯一路径

<settings>
  <localRepository>/data/job1/repository</localRepository>
  ..

定期清除本地存储库,强制进行干净的构建可能是个好主意。

【讨论】:

以上是关于阻止 Jenkins 将工件安装到本地 Maven 存储库的主要内容,如果未能解决你的问题,请参考以下文章