web-dev-qa-db-fra.com

Pipeline Jenkins si autrement ne fonctionne pas

Je crée un exemple de pipeline Jenkins, 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 'I only execute on the master branch'
            } else {
                echo 'I execute elsewhere'
            }                        
        }        
    }
}

ce pipeline échoue avec les journaux d'erreur suivants

Started by user admin
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 15: Not a valid stage section definition: "if (env.BRANCH_NAME == 'master') {
                echo 'I only execute on the master branch'
            } else {
                echo 'I execute elsewhere'
            }". Some extra configuration is required. @ line 15, column 9.
           stage('test3') {
           ^

WorkflowScript: 15: Nothing to execute within stage "test3" @ line 15, column 9.
           stage('test3') {
           ^

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

node {
    stage('Example') {
        if (env.BRANCH_NAME == 'master') {
            echo 'I only execute on the master branch'
        } else {
            echo 'I execute elsewhere'
        }
    }
}

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

Quel est le problème ici, quelqu'un peut-il suggérer s'il vous plaît?

37
Shahzeb

votre premier essai utilise des pipelines déclaratifs, et le second fonctionne avec des pipelines scriptés. vous devez inclure les étapes dans une déclaration d'étapes et vous ne pouvez pas utiliser if en tant qu'étape de niveau supérieur dans une déclaration, vous devez donc l'envelopper dans une étape script. voici une version déclarative de travail:

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 'I only execute on the master branch'
                    } else {
                        echo 'I execute elsewhere'
                    }
                }
            }
        }
    }
}

vous pouvez simplifier ceci et éventuellement éviter l’instruction if (tant que vous n’avez pas besoin de l’autre) en utilisant "when". Voir "when directive" à l'adresse https://jenkins.io/doc/book/pipeline/syntax/ . vous pouvez également valider les jenkinsfiles à l'aide de l'api jenkins rest. c'est super doux. amusez-vous avec les pipelines déclaratifs en jenkins!

83
burnettk

Cela nécessite un peu de réorganisation, mais when fait un bon travail pour remplacer les conditions ci-dessus. Voici l'exemple ci-dessus écrit en utilisant la syntaxe déclarative. Notez que test3 stage est maintenant composé de deux étapes différentes. Un qui fonctionne sur la branche principale et un qui fonctionne sur n'importe quoi d'autre.

stage ('Test 3: Master') {
    when { branch 'master' }
    steps { 
        echo 'I only execute on the master branch.' 
    }
}

stage ('Test 3: Dev') {
    when { not { branch 'master' } }
    steps {
        echo 'I execute on non-master branches.'
    }
}
22
jeffaudio