139 votes

Étape/étape conditionnelle dans le pipeline Jenkins

Comment exécuter une étape/stage de construction uniquement si l'on construit une branche spécifique ?

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

265voto

Chandan Nayak Points 3190

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

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

stage('feature-branch-stuff') {
    when {
        branch 'feature/*'
    }
    steps {
        echo 'run this stage - only if the branch name started with feature/'
    }
}

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

stage('env-specific-stuff') {
    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 aussi - https://jenkins.io/doc/book/pipeline/syntax/#when


La directive beforeAgent true peut être défini pour éviter de lancer un agent pour exécuter la condition, si la condition ne nécessite pas l'état de git pour décider de son exécution :

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

Communiqué de presse y docs


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

equals - Compare deux valeurs (chaînes de caractères, variables, nombres, booléens). et renvoie vrai si elles sont égales. Honnêtement, je ne sais pas comment nous avons manqué ajouter cette fonction plus tôt ! Vous pouvez effectuer des comparaisons "non égales" en utilisant la fonction not { equals ... }.

changeRequest - Dans sa forme la plus simple, ceci renvoie true si ce Pipeline est en train de construire une demande de modification, telle qu'une demande de retrait GitHub. Vous pouvez également effectuer des vérifications plus détaillées par rapport à la demande de modification, vous permettant de demander "est-ce une demande de changement contre la branche master et bien plus encore.

buildingTag - Une condition simple qui vérifie simplement si le Pipeline est s'exécute sur une étiquette dans SCM, plutôt que sur une branche ou une référence de référence de commit.

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

1 votes

Puis-je l'utiliser pour les actions post-construction ?

1 votes

Je trouve que Jenkins lance l'agent spécifié même si le when{} La condition est évaluée à false :(

2 votes

@Trejkaz vous pouvez maintenant utiliser beforeAgent true pour éviter cela

57voto

krzyk Points 1044

Il suffit d'utiliser if y env.BRANCH_NAME par exemple :

    if (env.BRANCH_NAME == "deployment") {                                          
        ... do some build ...
    } else {                                   
        ... do something else ...
    }

6 votes

Si cela doit être avant ou après l'étape ?

6 votes

Avant l'étape, les étapes peuvent être à l'intérieur si les branches

0 votes

Je ne pense pas que le placement importe réellement

9voto

Wolfson Points 479

Je rajoute cette réponse pour mentionner explicitement l'utilisation d'une condition dans une étape à l'inverse d'un escenario à la fois dans pipelines déclaratifs .

Condition dans une étape d'un pipeline déclaratif

Comme l'ont déjà montré @Chandan Nayak et d'autres, cela peut être fait en se basant sur when dans le cas de

stage('myConditionalStage') {
    when {
        branch 'myBranch'
    }
    steps {
        echo 'triggered by myBranch'
    }
}

Donc la scène myConditionalStage ne sera exécutée que si elle est déclenchée par un push vers myBranch .

Condition dans une étape de l'étape d'un pipeline déclaratif

Si toutefois vous avez besoin d'une condition dans la section des étapes d'une étape, vous pouvez utiliser la syntaxe Groovy ( if/else dans ce cas) qui est utilisé dans Pipelines scriptés . En cas de Pipeline déclaratif vous devez le mettre dans un script comme suit :

stage('myStage') {
    steps {
        echo 'within myStage'
        script {
            if (env.BRANCH_NAME == "myBranch") {
                echo 'triggered by myBranch'
            } else {
                echo 'triggered by something else'
            }
        }
    }
}

Pour un Pipeline sous forme de script vous pouvez l'utiliser sans l'option script bloc comme montré par @Krzysztof Krasoń

5voto

Yakir GIladi Edry Points 1688

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'
                    }
                }
            }
        }
    }
}

0voto

Eric Blair Points 46

Si vous vous exécutez contre une demande de tirage en utilisant le plugin ghprb [github pull request builder], le nom de la branche apparaîtra comme origin/pr/<<#PRNumber>>/merge.

Dans ce cas, les noms des branches peuvent être capturés en utilisant la variable d'environnement ci-dessous.

when { environment name: 'ghprbSourceBranch', value: 'engine_staging' }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X