我在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来说仍然是新的,我只是使其在谷歌搜索中工作并找到了一些使用这种语法)。
我如何实现我的目标?在这种情况下,我应该解析整个日志还是有一个更优雅的解决方案?请在您的答案中提供一些代码,以便我直接对其进行测试。
您可以将内部版本号写入上游作业中的文件,并将其包含在存档中。然后,您向前复制该工件。您可以使用管道实用程序步骤插件从文件中收集信息,但是如果您保持文件简单(即,除了内部版本号,就什么都不写),那么类似这样的东西会为您提供内部版本号:
def backendBuildId = sh script: "cat backendBuild.txt", returnStdout: true
或在Windows上:
def backendBuildId = bat script: "type backendBuild.txt", returnStdout: true