流水线 { 任何代理 阶段 { 阶段('查找上游作业') { 步骤 { 脚本 { def原因=currentBuild.rawBuild.getCauses() for(原因中的原因) { if (原因.class.toString().contains("UpstreamCause")) { println "此作业是由作业引起的" + 原因.upstreamProject } else { println "根本原因:" + cause.toString() } } } } } } }
您可以检查作业的REST API以获取以下额外信息:
{ "_class" : "org.jenkinsci.plugins.workflow.job.WorkflowRun", "actions" : [ { "_class" : "hudson.model.ParametersAction", "parameters" : [
] }, { "_class" : "hudson.model.CauseAction", "causes" : [ { "_class" : "hudson.model.Cause$UpstreamCause", "shortDescription" : "Started by upstream project \"larrycai-sto-46908390\" build number 7", "upstreamBuild" : 7, "upstreamProject" : "larrycai-sto-46908390", "upstreamUrl" : "job/larrycai-sto-46908390/" } ] },
参考:
我知道这个问题已经有几年了,但之前的回答需要在我的Jenkins实例中进行一些额外的安全设置。经过一番研究,我发现在2018年11月完成了一个新的功能请求,解决了这个需求,并在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()
}
}
}
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"
}
Larry的答案对我来说不太管用。
但是,在这些文档的帮助下,我稍微修改了一下,这个版本就可以用了:
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()
}
}
P.S. 实际上,Daniel的回答 提到了这种方法,但是有太多的杂乱无章,我在写完我的解决方案后才注意到它。