Étape / étape conditionnelle dans le pipeline Jenkins

90

Comment exécuter une étape / étape de construction uniquement si vous créez une branche spécifique?

Par exemple, exécutez une étape de déploiement uniquement si la branche est appelée deployment, en laissant tout le reste inchangé.

Devonte
la source

Réponses:

180

En faisant de même dans la syntaxe déclarative du pipeline, voici quelques exemples:

stage('master-branch-stuff'){
  agent any
  when{
    branch 'master'
  }
  steps {
    echo 'run this stage - ony if the branch = master branch'
  }
}

<b

stage('feature-branch-stuff') {
    agent label:'test-node'
    when { branch "feature/*" }
    steps {
        echo 'run this stage - only if the branch name started with feature/'
    }
}

<b

stage('expression-branch') {
    agent label:'some-node'
    when {
    expression {
        return env.BRANCH_NAME != 'master';
        }
    }
    steps {
        echo 'run this stage - when branch is not equal to master'
    }
}

<b

stage('env-specific-stuff') {
    agent label:'test-node'
    when { 
      environment name: 'NAME', value: 'this' 
    }
    steps {
        echo 'run this stage - only if the env name and value matches'
    }
}

Des moyens plus efficaces à venir - https://issues.jenkins-ci.org/browse/JENKINS-41187
Regardez également - https://jenkins.io/doc/book/pipeline/syntax/#when


La directive beforeAgent truepeut être définie pour éviter de faire tourner un agent pour exécuter le conditionnel, si le conditionnel ne nécessite pas l'état de git pour décider s'il doit s'exécuter:

when { beforeAgent true; expression { return isStageConfigured(config) } }

Publier le message et les documents


MISE À JOUR
Nouvelle clause WHEN
REF: https://jenkins.io/blog/2018/04/09/whats-in-declarative

equals - Compare deux valeurs - chaînes, variables, nombres, booléens - et renvoie true si elles sont égales. Honnêtement, je ne sais pas comment nous avons manqué d'ajouter cela plus tôt! Vous pouvez également effectuer des comparaisons "not égal" en utilisant la combinaison not {equals ...}.

changeRequest - Dans sa forme la plus simple, cela retournera true si ce Pipeline construit une demande de changement, telle qu'une demande d'extraction GitHub. Vous pouvez également effectuer des vérifications plus détaillées par rapport à la demande de changement, ce qui vous permet de demander "est-ce une demande de changement par rapport à la branche principale?" et beaucoup plus.

buildingTag - Une condition simple qui vérifie simplement si le Pipeline s'exécute sur une balise dans SCM, plutôt qu'une branche ou une référence de validation spécifique.

tag - Un équivalent plus détaillé de buildingTag, vous permettant de vérifier le nom du tag lui-même.

Chandan Nayak
la source
1
puis-je l'utiliser pour les actions post-build?
Doug le
1
Je trouve que Jenkins fait tourner l'agent spécifié même si la when{}condition est évaluée à false. :(
Trejkaz
1
@Trejkaz, vous pouvez maintenant utiliser beforeAgent truepour éviter cela
Nick Jones
1
@NickJones en effet, beforeAgentest maintenant une solution de contournement pour cela.
Trejkaz
45

Utilisez simplement ifet env.BRANCH_NAME, exemple:

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }                                                                       
Krzysztof Krasoń
la source
4
si devrait être avant ou après l'étape?
Jet
5
Avant l'étape, les étapes peuvent être à l'intérieur si les branches
Krzysztof Krasoń
ne pense pas que le placement compte vraiment
omu_negru
9
Je ne peux pas obtenir ce travail avec un pipeline déclaratif. Cela fonctionne-t-il avec les pipelines déclaratifs? WorkflowScript: 9: Attendu une étape @ ligne 9, colonne 9. if (env.BRANCH_NAME == "deployment") {WorkflowScript: 8: Aucune étape spécifiée @ ligne 8, colonne 5. étapes {
pitchblack408

4
cela ne fonctionne que dans les pipelines scriptés. pour les pipelines déclaratifs, vous devez utiliser script {} dans l'étape.
Pedro Henrique
1

Selon d'autres réponses, j'ajoute le scénario des étapes parallèles:

pipeline {
    agent any
    stages {
        stage('some parallel stage') {
            parallel {
                stage('parallel stage 1') {
                    when {
                      expression { ENV == "something" }
                    }
                    steps {
                        echo 'something'
                    }
                }
                stage('parallel stage 2') {
                    steps {
                        echo 'something'
                    }
                }
            }
        }
    }
}
Yakir GIladi Edry
la source