我在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的新手,我只是在谷歌搜索并找到了一些使用这种语法的例子。)
我如何实现目标?在这种情况下我应该解析整个日志还是有更优雅的解决方案?请在答案中提供一些代码,以便我可以直接测试。
答案 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