web-dev-qa-db-ja.com

動作していない場合はJenkinsパイプライン

サンプルのジェンキンスパイプラインを作成しています。これがコードです。

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

このパイプラインは、次のエラーログで失敗します

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

しかし、次の例を実行すると このURLから が実行され、else部分が正常に出力されます。

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

私が見ることができる唯一の違いは、作業例にはstagesがありませんが、私の場合はあります。

ここで何が間違っていますか、誰でも提案できますか?

37
Shahzeb

最初の試行は宣言型パイプラインを使用することであり、2番目の試行はスクリプトパイプラインを使用することです。ステップをステップ宣言で囲む必要があり、ifを宣言の最上位ステップとして使用できないため、scriptステップでラップする必要があります。これは、機能する宣言バージョンです。

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

"when"を使用することで、これを単純化し、ifステートメントを(潜在的にelseが必要でない限り)避けることができます。 https://jenkins.io/doc/book/pipeline/syntax/ の「whenディレクティブ」を参照してください。 jenkins rest apiを使用してjenkinsfilesを検証することもできます。とても甘い。 jenkinsの宣言型パイプラインをお楽しみください!

83
burnettk

少し並べ替える必要がありますが、whenは上記の条件を置き換えるのに適しています。以下は、宣言構文を使用して記述された上記の例です。 test3ステージは2つの異なるステージになりました。 1つはmasterブランチで実行され、もう1つは他のもので実行されます。

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