5

我们有一个使用声明性管道的 Jenkins 工作。

该作业可以由不同的其他构建触发。

在声明性管道中,我如何找出哪个构建触发了管道?

4

3 回答 3

7

下面的代码示例

管道{
    代理任何
    阶段{
        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/”
        }
      ]
    },

参考:

于 2017-10-25T18:55:09.797 回答
1

我意识到这已经有几年的历史了,但是之前的响应需要在我的 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"
}
于 2019-05-16T23:54:11.493 回答
0

拉里的回答对我不太适用。

但是,在我在这些文档的帮助下稍微修改了它之后,这个版本就可以工作了:

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实际上,丹尼尔的回答提到了这种方法,但是太杂乱了,我是在写完解决方案后才注意到的。

于 2021-01-12T04:08:20.713 回答