我们有一个使用声明性管道的 Jenkins 工作。
该作业可以由不同的其他构建触发。
在声明性管道中,我如何找出哪个构建触发了管道?
下面的代码示例
管道{ 代理任何 阶段{ stage('寻找上游工作') { 脚步 { 脚本 { def 原因 = currentBuild.rawBuild.getCauses() for(原因中的原因){ if (cause.class.toString().contains("UpstreamCause")) { println "这个工作是由工作引起的" + cause.upstreamProject } 别的 { println "根本原因:" + cause.toString() } } } } } } }
您可以检查作业的 REST API 以获取如下额外信息
{ "_class" : "org.jenkinsci.plugins.workflow.job.WorkflowRun", “行动”:[ { "_class" : "hudson.model.ParametersAction", “参数” : [ ] }, { "_class" : "hudson.model.CauseAction", “原因”:[ { "_class" : "hudson.model.Cause$UpstreamCause", "shortDescription" : "由上游项目\"larrycai-sto-46908390\" build number 7 启动", “上游构建”:7, “upstreamProject”:“larrycai-sto-46908390”, “upstreamUrl”:“工作/larrycai-sto-46908390/” } ] },
参考:
我意识到这已经有几年的历史了,但是之前的响应需要在我的 Jenkins 实例中进行一些额外的安全设置。经过一番研究,我发现在 11/2018 完成了一个新功能请求,它解决了这个需求,并在 currentBuild 中公开了构建原因。这是我编写的一个小库,如果构建是由另一个构建触发的,则返回带有字符串“JOB/”的原因:
def call(body) {
if (body == null) {body = {DEBUG = false}}
def myParams= [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = myParams
body()
def causes = currentBuild.getBuildCauses()
if (myParams.DEBUG) {
echo "causes count: " + causes.size().toString()
echo "causes text : " + causes.toString()
}
for(cause in causes) {
// echo cause
if (cause._class.toString().contains("UpstreamCause")) {
return "JOB/" + cause.upstreamProject
} else {
return cause.toString()
}
}
}
为了使用它,我将它放在名为“buildCause.groovy”的文件中的库中。然后我引用了 Jenkinsfile 顶部的库:
library identifier: 'lib@master', retriever: modernSCM(
[$class: 'GitSCMSource', remote: '<LIBRARY_REPO_URL>',
credentialsId: '<LIBRARY_REPO_CRED_ID', includes: '*'])
然后我可以在我的管道中根据需要调用它:
def cause=buildCause()
echo cause
if (!cause.contains('JOB/')) {
echo "started by user"
} else {
echo "triggered by job"
}
拉里的回答对我不太适用。
但是,在我在这些文档的帮助下稍微修改了它之后,这个版本就可以工作了:
def causes = currentBuild.getBuildCauses()
for(cause in causes) {
if (cause._class.toString().contains("UpstreamCause")) {
println "This job was caused by job " + cause.upstreamProject
} else {
println "Root cause : " + cause.toString()
}
}
PS实际上,丹尼尔的回答提到了这种方法,但是太杂乱了,我是在写完解决方案后才注意到的。