Ответ 1
Следующий код должен работать, чтобы определить, начал ли пользователь конвейер или таймер/другой триггер:
def isStartedByUser = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) != null
Я надеюсь добавить условный этап в мой Jenkinsfile, который запускается в зависимости от того, как была создана сборка. В настоящее время мы настроены так, чтобы сборки либо запускались с помощью:
Есть ли способ запуска разных шагов перехода в зависимости от того, какое из этих действий вызвало сборку?
Следующий код должен работать, чтобы определить, начал ли пользователь конвейер или таймер/другой триггер:
def isStartedByUser = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) != null
Возможность получения причин для запуска рабочего процесса была выпущена в версии 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
.
Я думаю, что ответы здесь неполные и не дают фактического готового к использованию ответа. Вот мой код, чтобы заставить его работать:
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 необходим, потому что в противном случае будет выполнен следующий шаг, не связанный со сценарием.
Мы можем использовать переменную "BUILD_CAUSE" для получения информации о том, кто инициировал запуск
для [jenkins-pipe] вы можете использовать
currentBuild.rawBuild.getCauses()
(см. github.com/jenkinsci/pipeline-examples/blob/master/... для более подробной информации)
В 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')