1. ホーム
  2. jenkins

Jenkinsパイプラインif elseが動作しない

2023-08-08 07:01:43

質問

私は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 がありませんが、私の場合はあります。

何が間違っているのか、どなたかご指摘ください。

どのように解決するのですか?

最初の試みは宣言型パイプライン、2番目の試みはスクリプト型パイプラインを使用しています。 if をトップレベルのステップとして宣言することはできません。 script のステップでラップする必要があります。以下は、動作するdeclarativeバージョンです。

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ディレクティブ" at https://jenkins.io/doc/book/pipeline/syntax/ jenkinsのrest apiを使えば、jenkinsファイルを検証することもできます。