阻止 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 存储库的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Jenkins 中的特定工件部署到 Nexus 中?
是否有将 Jenkins 的构建与 Maven (Nexus) 工件联系起来的插件
没有使用 jenkins gradle artifactory 插件部署的工件
Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ③ ( 配置上传工件 | 将 Gradle 插件 jar 包源码文档上传到本地Maven 仓库 )