一尘不染

Jenkins Copy Artifact解析复制的内部版本ID

jenkins

我在Jenkins 2.73.1中的多分支管道“
复制工件插件”中使用,以从其他两个管道中获得最后成功的工件,请参阅我的Jenkinsfile:

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”和“内部版本号3“)。

在“ Jenkins Pipeline-阅读上一阶段日志”问题中,我读到有可能将sh脚本的标准输出重定向到groovy变量,如下所示:

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

但是在我的管道中,我需要使用Windows,在这种情况下,步骤也不是命令,而是一个“步骤”(包含类“
CopyArtifact”,对于Jenkins来说仍然是新的,我只是使其在谷歌搜索中工作并找到了一些使用这种语法)。

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


阅读 434

收藏
2020-07-25

共1个答案

一尘不染

您可以将内部版本号写入上游作业中的文件,并将其包含在存档中。然后,您向前复制该工件。您可以使用管道实用程序步骤插件从文件中收集信息,但是如果您保持文件简单(即,除了内部版本号,就什么都不写),那么类似这样的东西会为您提供内部版本号:

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

或在Windows上:

def backendBuildId = bat script: "type backendBuild.txt", returnStdout: true
2020-07-25