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

Maven 如何将Jenkins的特定工件部署到Nexus中?,maven,jenkins,jenkins-plugins,nexus,Maven,Jenkins,Jenkins Plugins,Nexus,我有一个在Jenkins运行的多模块maven项目。我想将最终工件(来自组装构建的RPM)部署到Nexus服务器。我认为没有理由部署中间构件(因此没有“mvn干净部署”),因为这将在服务器上产生我不需要的额外垃圾。我们正试图建立一个连续的交付管道,因此我们从未部署过快照版本。Jenkins的各种插件似乎专注于部署所有工件。如何部署我选择的一个 编辑: 经过深思熟虑,如果部署发生在所有构建完成之后,我愿意将所有工件部署到nexus。如果我要走这条路线,我希望使用“将工件部署到maven存储库”构建

我有一个在Jenkins运行的多模块maven项目。我想将最终工件(来自组装构建的RPM)部署到Nexus服务器。我认为没有理由部署中间构件(因此没有“mvn干净部署”),因为这将在服务器上产生我不需要的额外垃圾。我们正试图建立一个连续的交付管道,因此我们从未部署过快照版本。Jenkins的各种插件似乎专注于部署所有工件。如何部署我选择的一个

编辑:

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


这似乎也因为重新部署工件而中断。《詹金斯权威指南》中有一些关于这方面的内容,但它谈到了“本地”settings.xml。我的所有构建都发生在Jenkins slaves上,因此这不是一个选项,对于Jenkins体系结构来说也没有意义。

您可以使用“构建后操作”下的“将构件部署到Maven存储库”。看看这个

这是我想出的一个丑陋的黑客。如果有人有更好的想法,我很乐意给别人一个“正确”的答案:

我意识到我需要同时部署父pom.xml和程序集。我在两个独立的后期构建步骤中完成了这项工作

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

-s svn-admin/settings.xml -N deploy
它仅将父pom部署到具有我指定的settings.xml的nexus

当我想要部署rpm时,会发生真正的大问题。我尝试了一个“deployfile”目标,但是如果没有变量,我可以扩展到版本号,我无法指定确切的文件,通配符也无法扩展。相反,我使用了一个“执行shell”选项,并使用了我发现的curl:


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

如果你还需要通用的方式

使用executeshell选项并手动使用mvndeploy命令,您可以将您的版本和其他内容(如groupID等)作为参数传递到作业中,如果您维护单独的作业来构建和上载,这将起作用

例:

export M2_HOME=/PATH/TO/softwares/apache-maven-3.0.4 路径=$M2\u HOME/bin:$JAVA\u HOME/bin:$PATH 导出路径

mvn-v


mvn deploy:deploy file-Durl=-DrepositoryId=t1.snapshot-DartifactId=artifactID-DgroupId=groupID-dpackage=zip-Dfile=${WORKSPACE}/filename.zip-Dversion=1.0-TEST-snapshot-s=s”/path/to/.m2/settings.xml“

您可以使用Nexus Jenkins插件将特定工件从Jenkins部署到Nexus:

Jenkins管道示例:

stage('Publish') {
    def pom = readMavenPom file: 'pom.xml'
    nexusPublisher nexusInstanceId: 'your-nexus-instance-id', \
        nexusRepositoryId: 'your-nexus-repository-id', \
        packages: [[$class: 'MavenPackage', \
        mavenAssetList: [[classifier: '', extension: '', filePath: "target/${pom.artifactId}-${pom.version}.${pom.packaging}"]], \
        mavenCoordinate: [artifactId: "${pom.artifactId}", \
        groupId: "${pom.groupId}", \
        packaging: "${pom.packaging}", \
        version: "${pom.version}"]]]
}

在这种情况下,Nexus Jenkins插件将只将您的
target/${pom.artifactId}-${pom.version}.${pom.packaging}
pom.xml
文件部署到Nexus存储库。

这不会部署构建中的所有工件吗?那不是我想要的。我只需要最终的工件(一个rpm)和它的父pom(如果需要的话)。显然,只有使用带有用户名密码的.m2/settings.xml(我正在从svn中检查settings.xml),才能这样做。
stage('Publish') {
    def pom = readMavenPom file: 'pom.xml'
    nexusPublisher nexusInstanceId: 'your-nexus-instance-id', \
        nexusRepositoryId: 'your-nexus-repository-id', \
        packages: [[$class: 'MavenPackage', \
        mavenAssetList: [[classifier: '', extension: '', filePath: "target/${pom.artifactId}-${pom.version}.${pom.packaging}"]], \
        mavenCoordinate: [artifactId: "${pom.artifactId}", \
        groupId: "${pom.groupId}", \
        packaging: "${pom.packaging}", \
        version: "${pom.version}"]]]
}