Je suis coincé sur la façon d'utiliser correctement les conditions imbriquées comme proposé dans la syntaxe Jenkins.
https://jenkins.io/doc/book/pipeline/syntax/#when
Voici ma phase actuelle:
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
}
De mon point de vue, si je mets env.AUTO_BUILD = false
, alors cette étape doit être exécutée, car elle est enfermée dans un anyOf
OR il s'exécuterait si ma branche était par exemple develop
et AUTO_BUILD = true, BUILD_OPT = snapshot
.
Cependant, ce n'était pas le cas lorsque j'ai défini AUTO_BUILD = false
. L'étape n'a pas été exécutée. Suis-je en train de manquer quelque chose?
Il y a deux problèmes ici dans les conditions déclaratives. Tout d'abord, en regardant:
allOf {
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && env.BRANCH_NAME !=~ /feature.+/}
}
le problème ici est que !=~
n'est pas un opérateur valide pour "ne correspond pas à l'expression régulière" dans Groovy. Vous pouvez le remplacer par !(env.BRANCH_NAME =~ /feature/)
comme ceci:
allOf {
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && !(env.BRANCH_NAME =~ /feature/)}
}
pour atteindre le comportement que vous désirez.
Deuxièmement, au conditionnel:
expression{env.AUTO_BUILD == false}
l'expression recherche un type booléen dans env.AUTO_BUILD
. Si la valeur est affectée à une chaîne 'false'
, La vérification de type échouera et le conditionnel ne se comportera pas comme prévu. La saisie de l'affectation d'environnement env.AUTO_BUILD
Sous la forme d'un booléen env.AUTO_BUILD = false
Et non d'une chaîne env.AUTO_BUILD = 'false'
Corrigera cela pour vous.