【问题标题】:How can you deploy a specific artifact from Jenkins into Nexus?如何将 Jenkins 中的特定工件部署到 Nexus 中?
【发布时间】:2014-07-26 23:41:33
【问题描述】:

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

编辑:

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

这似乎也因重新部署工件而损坏。在“Jenkins the Definitive Guide”中有一些verbage,但它谈到了“本地”settings.xml。我所有的构建都发生在 Jenkins 从属服务器上,所以这不是一个选择,甚至对 Jenkins 架构也没有任何意义。

【问题讨论】:

    标签: maven jenkins jenkins-plugins nexus


    【解决方案1】:

    您可以使用 Nexus Jenkins 插件 将特定工件从 Jenkins 部署到 Nexus: https://support.sonatype.com/hc/en-us/articles/227256688-How-do-I-configure-the-Nexus-Jenkins-Plugin

    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 存储库。

    【讨论】:

      【解决方案2】:

      如果你还需要通用的方式。

      使用 Execute shell 选项并手动使用 mvn deploy 命令,您可以将您的版本和其他内容(例如 groupID 等)作为参数传递给作业,如果您维护单独的作业来构建和上传,这将解决。

      例如:

      导出 M2_HOME=/PATH/TO/softwares/apache-maven-3.0.4 PATH=$M2_HOME/bin:$JAVA_HOME/bin:$PATH 导出路径

      mvn -v

      mvn deploy:deploy-file -Durl=http://someorg:8081/nexus/content/repositories/t1.snapshot/ -DrepositoryId=t1.snapshot -DartifactId=artifactID -DgroupId=groupID -Dpackaging=zip -Dfile=${WORKSPACE}/filename.zip -Dversion=1.0-TEST -SNAPSHOT -s "/path/to/.m2/settings.xml"

      【讨论】:

        【解决方案3】:

        这是我想出的丑陋的 hack。如果有人有更好的主意,我很乐意为此给其他人“正确”的答案:

        我意识到我需要同时部署父 pom.xml 和程序集。我在两个单独的后期构建步骤中做到了这一点。

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

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

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

        当我想部署 rpm 时,发生了真正的大黑客攻击。我尝试了“部署文件”目标,但没有变量我可以扩展为版本号,我无法指定确切的文件并且通配符不会扩展。相反,我做了一个“执行 shell”选项并使用 curl 我找到了 here:

        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}
        

        就像我说的,这是一个丑陋的 hack。我很确定有些元数据文件没有更新,但是 rpm、它是 pom,并且它们的校验和正在上传。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 不会部署构建中的所有工件吗?那不是我想要的。我只想要最终的工件(一个 rpm),并且它是必要的父 pom。
          • 而且显然只有使用具有用户名密码的 .m2/settings.xml 才能执行此操作(我正在从 svn 中检查 settings.xml)。
          猜你喜欢
          • 2012-05-19
          • 2016-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-04
          • 1970-01-01
          • 2014-03-18
          • 2016-01-29
          相关资源
          最近更新 更多