ジェンキンス・パイプラインが動作しない場合

サンプルの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 がないのに、私の場合はあるということです。

何が間違っているのか、誰か教えてください。

ソリューション

ステップ宣言でステップを囲む必要がありますが、declarativeでは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'
                    }
                }
            }
        }
    }
}

これを簡単にして、if文を避けられる可能性があります(elseを必要としない限り) "when"を使ってください。https://jenkins.io/doc/book/pipeline/syntax/ の "when directive" を参照してください。また、jenkins rest api を使って jenkinsfiles を検証することもできます。

解説 (0)

少しアレンジが必要ですが、whenは上記の条件式を置き換えるのに良い仕事をしてくれます。上の例を宣言型の構文で書いてみましょう。test3`のステージが2つの異なるステージになっていることに注意してください。一つは master ブランチで実行されるもの、もう一つはそれ以外の場所で実行されるものです。

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.'
    }
}
解説 (0)
        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()
        }
解説 (0)