Как отличить триггеры сборки в трубопроводе Дженкинс

Я надеюсь добавить условный этап в мой Jenkinsfile, который запускается в зависимости от того, как была создана сборка. В настоящее время мы настроены так, чтобы сборки либо запускались с помощью:

  • изменяется на наш репозиторий git, который выбирается при индексировании ветвей
  • пользователь вручную запускает сборку, используя кнопку 'build now' в пользовательском интерфейсе.

Есть ли способ запуска разных шагов перехода в зависимости от того, какое из этих действий вызвало сборку?

Ответ 1

Следующий код должен работать, чтобы определить, начал ли пользователь конвейер или таймер/другой триггер:

def isStartedByUser = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) != null

Ответ 2

Возможность получения причин для запуска рабочего процесса была выпущена в версии 2.22 (2018 ноябрь 02) для подключаемого модуля API поддержки конвейера. Функция была запрошена в JENKINS-41272.

В этом currentBuild глобальной переменной currentBuild было добавлено несколько методов:

getBuildCauses

  • Возвращает JSON-массив причин сборки для текущей сборки

ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ - МОЖЕТ ИЗМЕНИТЬ getBuildCauses(String causeClass)

  • Принимает строку, представляющую полностью определенный класс Cause и возвращает JSON-массив причин построения, отфильтрованных по этому типу для текущей сборки, или пустой JSON-массив, если к текущей сборке не применимы причины указанного типа.

И пример от меня, подающий:

echo "${currentBuild.buildCauses}" // same as currentBuild.getBuildCauses()
echo "${currentBuild.getBuildCauses('hudson.model.Cause$UserCause')}"
echo "${currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')}"

И вывод:

[Pipeline] echo
[[_class:hudson.model.Cause$UserIdCause, shortDescription:Started by user anonymous, userId:null, userName:anonymous], [_class:org.jenkinsci.plugins.workflow.cps.replay.ReplayCause, shortDescription:Replayed #12]]
[Pipeline] echo
[]
[Pipeline] echo
[]
[Pipeline] End of Pipeline
Finished: SUCCESS

НОТА

Кажется, есть проблема с currentBuild.getBuildCauses(type) когда type является типом Cause предоставленной плагином. Например, currentBuild.getBuildCauses('org.jenkinsci.plugins.workflow.cps.replay.ReplayCause') завершается с ошибкой java.lang.ClassNotFoundException. Об этом сообщалось в JENKINS-54673 для версии 2.22 плагина Pipeline: Supports APIs (workflow-support). По сообщениям, это исправлено в версии 2.24.

Ответ 3

Я думаю, что ответы здесь неполные и не дают фактического готового к использованию ответа. Вот мой код, чтобы заставить его работать:

import com.cloudbees.groovy.cps.NonCPS

@NonCPS
def isStartedByTimer() {
    def buildCauses = currentBuild.rawBuild.getCauses()
    echo buildCauses

    boolean isStartedByTimer = false
    for (buildCause in buildCauses) {
        if ("${buildCause}".contains("hudson.triggers.TimerTrigger\$TimerTriggerCause")) {
            isStartedByTimer = true
        }
    }

    echo isStartedByTimer
    return isStartedByTimer

}

// [...]
// Other pipeline stuff

script {
    isStartedByTimer()
}

Когда запускается пользователем:

00:00:01.353 [[email protected]]
[Pipeline] echo
00:00:01.358 false

Когда запускается по таймеру:

00:00:01.585 [[email protected]]
[Pipeline] echo
00:00:01.590 true

Примечание: декоратор NonCPS необходим, потому что в противном случае будет выполнен следующий шаг, не связанный со сценарием.

Ответ 4

Мы можем использовать переменную "BUILD_CAUSE" для получения информации о том, кто инициировал запуск

для [jenkins-pipe] вы можете использовать

currentBuild.rawBuild.getCauses()

(см. github.com/jenkinsci/pipeline-examples/blob/master/... для более подробной информации)

Ответ 5

В Jenkins Pipeline без доступа currentBuild.rawBuild причины создания могут быть получены следующим образом:

// started by commit
currentBuild.getBuildCauses('jenkins.branch.BranchEventCause')
// started by timer
currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')
// started by user
currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')