web-dev-qa-db-fra.com

Pipeline déclaratif - Utilisation de la condition when, comment faire des conditions imbriquées anyOf / allOf / not

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?

8
Tai Ly

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.

8
Matt Schuchard