【问题标题】:How to set Jenkinsfile for upload maven artifact to Artifactory如何设置 Jenkinsfile 以将 Maven 工件上传到 Artifactory
【发布时间】:2019-01-29 15:28:23
【问题描述】:

我的 .Jenkinsfile 是这样的:

properties([[$class: 'GitLabConnectionProperty', gitLabConnection: 'gitlab@srv']])
node {
  env.JAVA_HOME = tool 'JDK 7'
  def mvnHome = tool 'Maven 3.2.2'
  def nodeJS = tool 'IA_NodeJS'
  env.PATH = "${mvnHome}/bin:${nodeJS}/bin:${env.JAVA_HOME}/bin:${env.PATH}"

  stage ('checkout') {
    checkout scm
  }

  stage ('build') {
    gitlabCommitStatus("build") {
      // your build steps
      sh 'mvn clean install -Denv=dev -P !faster'
    }
  }

  stage ('upload') {
    gitlabCommitStatus("upload") {
      def server = Artifactory.server "artifactory@ibsrv02"
      def buildInfo = Artifactory.newBuildInfo()
      buildInfo.env.capture = true
      buildInfo.env.collect()

      def uploadSpec = """{
        "files": [
          {
            "pattern": "**/target/*.jar",
            "target": "libs-snapshot-local"
          }, {
            "pattern": "**/target/*.pom",
            "target": "libs-snapshot-local"
          }, {
            "pattern": "**/target/*.war",
            "target": "libs-snapshot-local"
          }
        ]
      }"""
      // Upload to Artifactory.
      server.upload spec: uploadSpec, buildInfo: buildInfo

      buildInfo.retention maxBuilds: 10, maxDays: 7, deleteBuildArtifacts: true
      // Publish build info.
      server.publishBuildInfo buildInfo
    }
  }
}

使用这种方法,jenkins 上传工件而不使用“maven 风格”布局(包子文件夹和 poms)。

我想将生成的工件上传到 Artifactory,就像正常作业上传它并选中“Maven3-Artifactory Integration”一样。

【问题讨论】:

  • 为什么不使用mvn deploy
  • 我正在将作业转换为没有 mvn deploy 的 jenkinsfile。我想在不更改 poms 的情况下转换它。 @khmarbaise 如果不可能,我会更换 poms
  • 此外,我们中的一些人还有后续阶段,这些阶段也必须成功才能让合并/拉取请求被接受。使用 mvn deploy 会导致工件被部署,即使对于构建它们的代码没有合并的被拒绝的拉取请求。(更不用说我个人不喜欢为开发人员提供从未知构建环境/配置部署工件的能力. 喜欢隔离到 CI 构建。)

标签: maven jenkins artifactory jenkins-pipeline


【解决方案1】:

从 Artifactory Jenkins 插件版本 2.7.2 开始,您可以使用 Artifactory pipeline DSL 运行 Maven 和 Gradle。

使用新的 DSL,您的构建脚本将如下所示:

  def server = Artifactory.server "artifactory@ibsrv02"
  def buildInfo = Artifactory.newBuildInfo()
  buildInfo.env.capture = true
  def rtMaven = Artifactory.newMavenBuild()
  rtMaven.tool = MAVEN_TOOL // Tool name from Jenkins configuration
  rtMaven.opts = "-Denv=dev"
  rtMaven.deployer releaseRepo:'libs-release-local', snapshotRepo:'libs-snapshot-local', server: server
  rtMaven.resolver releaseRepo:'libs-release', snapshotRepo:'libs-snapshot', server: server

  rtMaven.run pom: 'pom.xml', goals: 'clean install', buildInfo: buildInfo

  buildInfo.retention maxBuilds: 10, maxDays: 7, deleteBuildArtifacts: true
  // Publish build info.
  server.publishBuildInfo buildInfo

您可以在jenkins-pipeline-examples 中找到更多 Artifactory 管道 DSL 示例。

【讨论】:

  • 谢谢,正是我想要的!对于错误或功能请求,我可以在 github 上提交吗?
  • 对于错误报告或功能请求,最好通过Jenkins Artifactory Plugin Jira 进行交流。 Jenkins Artifactory 插件是一个开源项目,您可以随时通过向jenkins-artifactory-plugin 项目发送拉取请求来贡献代码。
  • @TamirHadad 有什么方法可以将 maven 目标的执行与已编译的 maven 工件的上传分离,这样我就可以为插件指定一些 maven 坐标,然后它们就会被上传?
  • 不错。但是是否还有纯声明式管道解决方案?
  • @Ianoxx - 没错。我也需要解耦。否则,当稍后阶段(运行 qualys 扫描、推送 docker 图像或发布 API 文档)可能失败并拒绝合并/拉取请求时,我的构建阶段最终会部署 maven 工件。到目前为止,我还没有找到一种使用 Artifactory 插件解耦的方法,尽管它在 Jenkins 的旧 maven 工作中被解耦。可能需要定制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2014-08-23
相关资源
最近更新 更多