一尘不染

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

jenkins

我有一个在Jenkins中运行的多模块Maven项目。我想将最终的工件(程序集构建中的RPM)部署到Nexus服务器。我认为没有理由部署中间工件(因此没有“
mvn clean
deploy”),因为这会在服务器上产生我不需要的额外垃圾。我们正在尝试建立一个持续交付管道,因此我们从未部署过SNAPSHOT版本。Jenkins的各种插件似乎都专注于部署所有工件。我该如何部署自己选择的那个?

编辑:

经过深思熟虑,如果在所有构建完成之后进行部署,我愿意将所有工件部署到联系。如果我要走那条路线,我想在构建后使用“将工件部署到Maven存储库”。不过,此工具似乎已损坏,因为它缺少指定用户名/密码的功能。我知道可以在settings.xml中指定它,但显然只有“
.m2”中的一个。它似乎并没有查看我为此构建指定的settings.xml。

重新部署工件似乎也坏了。在《
Jenkins权威指南》中有一些用语,但这是关于“本地”
settings.xml的。我所有的构建都在Jenkins从属服务器上进行,因此这不是一个选择,甚至对于Jenkins架构也没有任何意义。


阅读 474

收藏
2020-07-25

共1个答案

一尘不染

这是我想出的丑陋的骇客。如果有人有更好的主意,我会很乐意为其他人提供“正确”的答案:

我意识到我需要同时部署父pom.xml和程序集。我在两个单独的后期构建步骤中进行了此操作。

首先,我选择了带有“
Maven”的Maven版本的“调用顶级Maven目标”(我认为这使用的是Jenkins版本的maven。我不想在系统上放置其他版本)。我使用了以下目标:

-s svn-admin/settings.xml -N deploy

这将使用我指定的settings.xml将父pom部署到nexus。

当我想部署rpm时,确实发生了很大的变化。我尝试了“部署文件”目标,但是如果没有变量,我可以扩展到版本号,我无法指定确切的文件,而通配符也不会扩展。相反,我做了一个“
Execute shell”选项,并使用了在这里找到的curl :

env
UPLOAD_FILE=assembly/target/ips-${POM_VERSION}-x.x86_64.rpm
DESTINATION=http://mvnrepo01/nexus/content/repositories/releases/com/bla/ips/assembly/${POM_VERSION}/assembly-${POM_VERSION}.rpm
sha1sum ${UPLOAD_FILE} | awk -F" " '{print $1}' | curl -v -u admin:password --upload-file - ${DESTINATION}.sha1
md5sum ${UPLOAD_FILE} | awk -F" " '{print $1}' | curl -v -u admin:password --upload-file - ${DESTINATION}.md5
curl -v -u admin:password --upload-file ${UPLOAD_FILE} ${DESTINATION}

UPLOAD_FILE=assembly/pom.xml
DESTINATION=http://mvnrepo01/nexus/content/repositories/releases/com/bla/ips/assembly/${POM_VERSION}/assembly-${POM_VERSION}.pom
sha1sum ${UPLOAD_FILE} | awk -F" " '{print $1}' | curl -v -u admin:password --upload-file - ${DESTINATION}.sha1
md5sum ${UPLOAD_FILE} | awk -F" " '{print $1}' | curl -v -u admin:password --upload-file - ${DESTINATION}.md5
curl -v -u admin:password --upload-file ${UPLOAD_FILE} ${DESTINATION}

就像我说的,这是一个丑陋的骇客。我很确定有些元数据文件没有更新,但是rpm,pom和它们的校验和都已上传。

2020-07-25