Jenkins声明式流水线:查找触发作业

5
我们有一个使用声明性流水线的Jenkins任务。
这个任务可以由不同的其他构建触发。
在声明性流水线中,我如何找出是哪个构建触发了流水线?
3个回答

7
流水线 {
    任何代理
    阶段 {
        阶段('查找上游作业') {
            步骤 {
                脚本 {
                    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/" } ] },

参考:


如果这对你不起作用,请查看我的更新 - Alexander

2

我知道这个问题已经有几年了,但之前的回答需要在我的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()
        }
    }
}

为了使用它,我将其放置在名为“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"
}

此功能的特性请求可以在此处查看:https://issues.jenkins-ci.org/browse/JENKINS-54227 - Daniel Fitzpatrick

1

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的回答 提到了这种方法,但是有太多的杂乱无章,我在写完我的解决方案后才注意到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接