Jenkins复制工件解析复制的构建ID

时间:2017-10-06 08:04:51

标签: jenkins jenkins-plugins jenkins-pipeline

我在Jenkins 2.73.1中使用多分支管道Copy Artifact Plugin来从其他两个管道获取最后成功的工件,请参阅我的Jenkins文件:

def branchname = "${BRANCH_NAME}".replace("/", "%2F")
pipeline {
  agent {
    label 'windows'
  }
  stages {
    stage('get artifacts') {
      steps {
        script {
          parallel('get-backend': {
            step([$class: 'CopyArtifact', projectName: "backend/${branchname}", target: 'input/backend'])
          },
          'get-frontend': {
            step([$class: 'CopyArtifact', projectName: "frontend/${branchname}", target: 'input/frontend'])
          })
        }
      }
    }
  }
}

在构建日志中,我看到例如:

...
[Pipeline] script
[Pipeline] {
[Pipeline] parallel
[Pipeline] [get-backend] { (Branch: get-backend)
[Pipeline] [get-frontend] { (Branch: get-frontend)
[Pipeline] [get-backend] step
[Pipeline] [get-frontend] step
[get-frontend] Copied 344 artifacts from "frontend » foo/bar" build number 17
[Pipeline] [get-frontend] }
[get-backend] Copied 2'287 artifacts from "backend » foo/bar" build number 3
[Pipeline] [get-backend] }
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // script
...

问题/目标:我想解析并保存到文件(要归档,然后在不同的管道中由groovy加载和解析)前端和后端的内部版本号(在日志中见"内部编号17和#34;以及"内部编号3和#34;)。

在问题Jenkins Pipeline - Reading previous stage log中,我读到可以将sh脚本的标准输出重定向到groovy变量,如下所示:

def out = sh script: 'command', returnStdout: true

但是在我的管道中我需要使用Windows,在这种情况下,步骤也不是命令,但它是一个步骤" (包含类" CopyArtifact",仍然是Jenkins的新手,我只是在谷歌搜索并找到了一些使用这种语法的例子。)

我如何实现目标?在这种情况下我应该解析整个日志还是有更优雅的解决方案?请在答案中提供一些代码,以便我可以直接测试。

2 个答案:

答案 0 :(得分:0)

您无法获取Jenkins步骤的输出,只有sh步骤允许它,但在这种情况下,您将获得输出或内部sh(或bat)命令。

但是在你的情况下它非常简单,因为你只需要其他版本号,你可以使用Jenkins API,如this question中所述:

def backendBuildId = sh script: "wget http://yourjenkinsurl/job/backend/${branchname}/lastSuccessfulBuild", returnStdout: true
def frontendBuildId = sh script: "wget http://yourjenkinsurl/job/frontend/${branchname}/lastSuccessfulBuild", returnStdout: true

有关详细信息,请查看Jenkins中的API details

答案 1 :(得分:0)

您可以将内部版本编号写入上游作业中的文件,并将其包含在存档中。然后向前复制该工件。您可以使用管道实用程序步骤插件从文件中收集信息,但是如果您保持文件简单(即只写内置编号),那么这样的内容就可以获得内部版本号:

def backendBuildId = sh script: "cat backendBuild.txt", returnStdout: true

或在Windows上:

def backendBuildId = bat script: "type backendBuild.txt", returnStdout: true