Декларативный конвейер Дженкинса: узнайте инициирующую работу

У нас есть задание Jenkins, в котором используется декларативный конвейер.

Это задание может запускаться различными другими сборками.

Как в декларативном конвейере узнать, какая сборка запустила конвейер?


person Bernhard    schedule 24.10.2017    source источник


Ответы (3)


Пример кода ниже

pipeline {
    agent any
    stages {
        stage('find upstream job') {
            steps {
                script {
                    def causes = currentBuild.rawBuild.getCauses()
                    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()
                        }
                    }
                }      
            }
        }
    }
}

Вы можете проверить 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/"
        }
      ]
    },

Ссылка:

person Larry Cai    schedule 25.10.2017
comment
Посмотрите мое обновление, если оно вам не подходит. - person Alexander; 12.01.2021

Я понимаю, что этому пару лет, но предыдущий ответ требовал дополнительной настройки безопасности в моем экземпляре 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"
}
person Daniel Fitzpatrick    schedule 16.05.2019
comment
Запрос на добавление этой функции можно увидеть здесь: issues.jenkins-ci.org/ просмотреть/JENKINS-54227 - person Daniel Fitzpatrick; 17.05.2019

Ответ Ларри не совсем сработал для меня.

Но после того, как я немного изменил его с помощью эти документы и эта версия работает:

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 answer упоминает этот метод, но слишком много беспорядка, я заметил это только после того, как написал свое решение.

person Alexander    schedule 12.01.2021