У меня есть конвейер Jenkins с несколькими этапами, который должен знать, как была запущена сборка (пользователем, таймером и т. Д.), И я бы хотел избежать дублирования следующей строки на каждом этапе:
currentBuild.rawBuild.getCauses()[0].class.getName().contains('TimerTriggerCause')
При использовании этой команды в каждом блоке when
она работает, как и ожидалось, но при помещении в блок environment
она продолжает давать сбой:
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/jobs/test-pipeline/workspace
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Stage on timer)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.lang.NoSuchMethodError: No such DSL method '$' found among steps [archive, bat, build, catchError...zip] or globals [currentBuild, docker, env, params, pipeline, scm]
at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:199)
at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
at sun.reflect.GeneratedMethodAccessor513.invoke(Unknown Source)
Сценарий Дженкинса:
pipeline {
agent {
label 'master'
}
environment {
DAY = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
HOUR = Calendar.getInstance().get(Calendar.HOUR_OF_DAY)
ONTIMER = currentBuild.rawBuild.getCauses()[0].class.getName().contains('TimerTriggerCause')
}
stages {
stage('Stage on timer') {
when {
expression {
return (${ONTIMER} && (${DAY} != Calendar.SATURDAY && ${DAY} != Calendar.SUNDAY))
}
}
steps {
echo "on timer..."
}
}
}
}
Две другие переменные DAY
и HOUR
отлично работают при использовании в блоке when
. Есть идеи?