Декларативный конвейер - использование условия когда, как делать вложенные условия anyOf/allOf/not
Я застрял в том, как правильно использовать вложенные условия, как предложено в синтаксисе Дженкинса.
https://jenkins.io/doc/book/pipeline/syntax/
Это мой текущий этап:
stage('Build'){
when{
anyOf{
allOf{
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && env.BRANCH_NAME !=~ /feature.+/}
}
expression{env.AUTO_BUILD == false}
}
}
steps{
echo env.AUTO_BUILD
echo env.BUILD_OPT
echo env.BRANCH_NAME
}
С моей точки зрения, если я установлю env.AUTO_BUILD = false
, то этот этап должен быть выполнен, так как он заключен в anyOf
ИЛИ это выполнится, если моя ветка была, например, develop
а также AUTO_BUILD = true, BUILD_OPT = snapshot
,
Однако это был не тот случай, когда я установил AUTO_BUILD = false
, Этап не был выполнен. Я что-то пропустил?
1 ответ
Здесь есть две проблемы в декларативных условных выражениях. Сначала посмотрим на:
allOf {
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && env.BRANCH_NAME !=~ /feature.+/}
}
проблема здесь в том, что !=~
не является допустимым оператором для "не совпадает с регулярным выражением" в Groovy. Вы можете заменить его на !(env.BRANCH_NAME =~ /feature/)
вот так:
allOf {
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && !(env.BRANCH_NAME =~ /feature/)}
}
достичь желаемого поведения.
Во-вторых, в условном:
expression{env.AUTO_BUILD == false}
выражение проверяет логический тип в env.AUTO_BUILD
, Если значение присваивается строка 'false'
, тогда проверка типа не удастся, и условное поведение не будет работать, как ожидалось. Ввод среды env.AUTO_BUILD
назначение в качестве логического env.AUTO_BUILD = false
а не строка env.AUTO_BUILD = 'false'
исправит это для вас.