阻止 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 存储库的主要内容,如果未能解决你的问题,请参考以下文章

将远程 maven2 工件下载到本地存储库的简单命令行?

如何将 Jenkins 中的特定工件部署到 Nexus 中?

是否有将 Jenkins 的构建与 Maven (Nexus) 工件联系起来的插件

更改 Jenkins 构建工件文件所有权

没有使用 jenkins gradle artifactory 插件部署的工件

Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ③ ( 配置上传工件 | 将 Gradle 插件 jar 包源码文档上传到本地Maven 仓库 )