69 votes

Jenkins pipeline if else non fonctionne

Je suis en train de créer un pipeline Jenkins d'exemple, voici le code.

pipeline {
    agent any 

    stages {    
        stage('test') { 
            steps { 
                sh 'echo hello'
            }            
        }
        stage('test1') { 
            steps { 
                sh 'echo $TEST'
            }            
        }
        stage('test3') {
            if (env.BRANCH_NAME == 'master') {
                echo 'Je n'exécute que sur la branche master'
            } else {
                echo 'J'exécute ailleurs'
            }                        
        }        
    }
}

ce pipeline échoue avec les journaux d'erreur suivants

Démarré par l'utilisateur admin
org.codehaus.groovy.control.MultipleCompilationErrorsException: démarrage échoué:
WorkflowScript: 15: Définition de section de stade non valide : "if (env.BRANCH_NAME == 'master') {
                echo 'Je n'exécute que sur la branche master'
            } else {
                echo 'J'exécute ailleurs'
            }". Une configuration supplémentaire est requise. @ ligne 15, colonne 9.
           stage('test3') {
           ^

WorkflowScript: 15: Rien à exécuter dans le stade "test3" @ ligne 15, colonne 9.
           stage('test3') {
           ^

Mais quand j'exécute l'exemple suivant à partir de cette URL, cela s'exécute avec succès et affiche la partie else.

node {
    stage('Example') {
        if (env.BRANCH_NAME == 'master') {
            echo 'Je n'exécute que sur la branche master'
        } else {
            echo 'J'exécute ailleurs'
        }
    }
}

La seule différence que je peux voir est que dans l'exemple qui fonctionne, il n'y a pas de stages mais dans mon cas, il y en a.

Qu'est-ce qui ne va pas ici, est-ce que quelqu'un peut suggérer?

163voto

burnettk Points 6712

Votre premier essai consiste à utiliser des pipelines déclaratifs, et le deuxième fonctionnant utilise des pipelines scriptés. vous devez inclure les étapes dans une déclaration d'étapes, et vous ne pouvez pas utiliser if comme une étape de niveau supérieur dans le déclaratif, donc vous devez l'encadrer dans une étape script. voici une version déclarative qui fonctionne :

pipeline {
    agent any

    stages {
        stage('test') {
            steps {
                sh 'echo hello'
            }
        }
        stage('test1') {
            steps {
                sh 'echo $TEST'
            }
        }
        stage('test3') {
            steps {
                script {
                    if (env.BRANCH_NAME == 'master') {
                        echo 'Je m'exécute seulement sur la branche principale'
                    } else {
                        echo 'J'exécute ailleurs'
                    }
                }
            }
        }
    }
}

vous pouvez simplifier cela et potentiellement éviter l'instruction if (tant que vous n'avez pas besoin du else) en utilisant "when". Voir "directive when" sur https://jenkins.io/doc/book/pipeline/syntax/. vous pouvez également valider les fichiers jenkins en utilisant l'api rest de jenkins. C'est super cool. amusez-vous avec les pipelines déclaratifs dans jenkins !

42voto

jeffaudio Points 1076

Il nécessite un peu de réorganisation, mais when fait du bon travail pour remplacer les conditionnelles ci-dessus. Voici l'exemple ci-dessus écrit en utilisant la syntaxe déclarative. Notez que l'étape test3 est maintenant deux étapes différentes. Une qui s'exécute sur la branche principale et une qui s'exécute sur tout le reste.

stage ('Test 3: Master') {
    when { branch 'master' }
    steps { 
        echo 'Je n'exécute que sur la branche principale.' 
    }
}

stage ('Test 3: Dev') {
    when { not { branch 'master' } }
    steps {
        echo 'J'exécute sur les branches autres que la principale.'
    }
}

1 votes

Je préfère cette solution plutôt que d'utiliser des if else quand il n'y a pas beaucoup de complexité! Merci!

0 votes

Avec la condition 'when', vous créez une condition pour l'étape complète, si elle est fausse alors l'étape complète sera ignorée, et en cas de 'si sinon', vous pouvez toujours exécuter une partie du script à l'intérieur de l'étape, elle ne sera pas ignorée.

1voto

Nilesh Pardesi Points 40

Si vous voulez créer une condition pour exécuter uniquement une étape basée sur une expression, vous pouvez utiliser le mot clé when

stage ('test3'){
    when { expression { return env.BRANCH_NAME == 'master'} }
    steps {
           echo 'Je n'exécute que sur la branche principale.'
          }
    }
}

Avec le mot clé expression, vous pouvez ajouter n'importe quelle condition.

Par exemple, si l'étape dépend d'un fichier généré dans l'espace de travail.

stage ('Étape dépendante du fichier'){
 when { expression { return fileExists ('myfile') } }
    steps {
           echo "le fichier existe"
          }
    }
}

-3voto

lanni654321 Points 525
        if ( params.build_deploy == '1' ) {
            println "build_deploy  ${params.build_deploy}"
              jobB = build job: 'k8s-core-user_deploy', propagate: false, wait: true, parameters: [
                         string(name:'environment', value: "${params.environment}"),
                         string(name:'branch_name', value: "${params.branch_name}"),
                         string(name:'service_name', value: "${params.service_name}"),                      
                     ]
            println jobB.getResult()
        }

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