it-swarm.com.de

Jenkins Pipeline, wenn es sonst nicht funktioniert

Ich erstelle eine Beispiel-Jenkins-Pipeline. Hier ist der 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'
            }                        
        }        
    }
}

diese Pipeline schlägt mit folgenden Fehlerprotokollen fehl

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') {
           ^

Wenn ich aber das folgende Beispiel ausführe von dieser URL , wird es erfolgreich ausgeführt und der else-Teil gedruckt.

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

Der einzige Unterschied, den ich sehen kann, ist, dass es im Arbeitsbeispiel kein stages gibt, aber in meinem Fall hat es.

Was ist hier falsch, kann jemand bitte vorschlagen?

37
Shahzeb

bei Ihrem ersten Versuch werden deklarative Pipelines verwendet, und beim zweiten Versuch werden skriptbasierte Pipelines verwendet. Sie müssen Schritte in eine Schrittdeklaration einschließen, und Sie können if nicht als deklarativen Schritt der obersten Ebene verwenden. Sie müssen ihn daher in einen script -Schritt einschließen. Hier ist eine funktionierende deklarative Version:

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

sie können dies vereinfachen und möglicherweise die if-Anweisung vermeiden (sofern Sie das else nicht benötigen), indem Sie "when" verwenden. Siehe "when Directive" unter https://jenkins.io/doc/book/pipeline/syntax/ . Sie können Jenkins-Dateien auch mit der Jenkins-Rest-API validieren. Es ist super süß. viel spaß mit deklarativen pipelines in jenkins!

83
burnettk

Es erfordert ein wenig Neuordnung, aber when leistet gute Arbeit, um die obigen Bedingungen zu ersetzen. Hier ist das obige Beispiel in deklarativer Syntax. Beachten Sie, dass test3 stage besteht jetzt aus zwei verschiedenen Stufen. Eine, die auf dem Master-Zweig und eine, die auf etwas anderem ausgeführt wird.

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