Jenkins:パイプラインステージで変数を定義できません


106

宣言的なJenkinsパイプラインスクリプトを作成しようとしていますが、単純な変数宣言に問題があります。

これが私のスクリプトです:

pipeline {
   agent none
   stages {
       stage("first") {
           def foo = "foo" // fails with "WorkflowScript: 5: Expected a step @ line 5, column 13."
           sh "echo ${foo}"
       }
   }
}

しかし、私はこのエラーを受け取ります:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected a step @ line 5, column 13.
           def foo = "foo"
           ^

Jenkins 2.7.4とPipeline 2.4を使用しています。

回答:


101

Jenkins Pipelinesの宣言モデルには、stageブロックで許可されている構文のサブセットがあります。詳細については、構文ガイドを参照してください。ステップをscript { ... }ブロックでラップすることでこの制限を回避できますが、その結果、scriptブロック内の構文やパラメーターなどの検証が失われます。


5
スクリプトブロックの外でその変数を使用する場合はどうなりますか?
Jan Steinke 2018

3
スクリプトブロックの外部で変数を使用する場合は、このstackoverflow.com/questions/43879733/…を
Senthil A Kumar '20

56

エラーは指定された行からではなく、最初の3行から発生していると思います。代わりにこれを試してください:

node {
   stage("first") {
     def foo = "foo"
     sh "echo ${foo}"
   }
}

無効な行がいくつかあったと思います...

編集する

宣言型パイプラインモデルのドキュメントからenvironment、変数を宣言するには宣言ブロックを使用する必要があるようです。例:

pipeline {
   environment {
     FOO = "foo"
   }

   agent none
   stages {
       stage("first") {
           sh "echo ${FOO}"
       }
   }
}

1
また、環境ブロックをステージに追加することもできます(たとえば、変数が前のステップで行われたことに依存している場合)。
Tereza Tomcova

34

@ Pom12、@ abayerに同意してください。回答を完了するには、スクリプトブロックを追加する必要があります

次のようなものを試してください:

pipeline {
    agent any
    environment {
        ENV_NAME = "${env.BRANCH_NAME}"
    }

    // ----------------

    stages {
        stage('Build Container') {
            steps {
                echo 'Building Container..'

                script {
                    if (ENVIRONMENT_NAME == 'development') {
                        ENV_NAME = 'Development'
                    } else if (ENVIRONMENT_NAME == 'release') {
                        ENV_NAME = 'Production'
                    }
                }
                echo 'Building Branch: ' + env.BRANCH_NAME
                echo 'Build Number: ' + env.BUILD_NUMBER
                echo 'Building Environment: ' + ENV_NAME

                echo "Running your service with environemnt ${ENV_NAME} now"
            }
        }
    }
}

4
この例では、jenkinsがアクセスできる定義済みの環境変数「ENVIRONMENT_NAME」がすでに存在していると想定していることに注意してください。
アルベルト

1
スクリプトブロックで環境値を変更できますか?
pitchblack408

はい、スクリプトブロック内で環境値を変更できます。
NicoPaez

8

Jenkins 2.138.3には、2つの異なるタイプのパイプラインがあります。

宣言的およびスクリプト化されたパイプライン。

「宣言型パイプラインは、パイプラインDSLの新しい拡張機能です(基本的に、1つのステップのみのパイプラインスクリプトであり、引数を持つパイプラインステップ(ディレクティブと呼ばれます)。これらのディレクティブは特定の構文に従う必要があります。この新しい形式のポイントは、はより厳密であり、したがって、パイプラインの初心者にとっては簡単であり、グラフィカルな編集が可能になり、さらに多くのことが可能になります。スクリプト化されたパイプラインは、高度な要件のフォールバックです。」

jenkinsパイプライン:エージェントvsノード?

次に、宣言型パイプラインで環境変数とグローバル変数を使用する例を示します。それらが設定された後、私が知ることができることから、環境は静的です。

def  browser = 'Unknown'

pipeline {
    agent any
    environment {
    //Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
    IMAGE = readMavenPom().getArtifactId()
    VERSION = readMavenPom().getVersion()


    }
    stages {
        stage('Example') {
            steps {
                script {
                    browser = sh(returnStdout: true, script: 'echo Chrome')
                }
            }
        }
        stage('SNAPSHOT') {
                when {
                    expression { 
                        return !env.JOB_NAME.equals("PROD") && !env.VERSION.contains("RELEASE")
                    }
                }
                steps {
                    echo "SNAPSHOT"
                    echo "${browser}"
                }
            }
            stage('RELEASE') {
                when {
                    expression { 
                        return !env.JOB_NAME.equals("TEST") && !env.VERSION.contains("RELEASE")
                    }
                }
                steps {
                    echo "RELEASE"
                    echo "${browser}"
                }
            }
    }//end of stages 
}//end of pipeline

上記のコードから次のエラーが表示されます。これを提供するステップを含むコード:node
mancocapac

いいえ、そのまま動作しました。これは宣言型パイプラインです。任意のエージェントは、任意のノードで動作できることを意味します
pitchblack408

@ pitchblack408、正解です。パイプラインの上部に[エージェントなし]がいました。あなたが何を意味するのかわからない:それらが設定された後、環境は静的ですか?スクリプト内で変更できます。例:script {IMAGE = "newVal}
mancocapac

例として、IMAGEを見てください。パイプラインによって変更できる、または変更する必要がある変数ではありません。環境の一部として定義された後、静的な値として扱われることは私の理解です。
pitchblack408

0

Groovyコードを実行するためのスクリプトステップを必要とする宣言型パイプラインを使用しています。これは、必要がないスクリプトパイプラインと比べて大きな違いです。

公式ドキュメントは、次のように述べています:

スクリプトステップは、スクリプトパイプラインのブロックを受け取り、宣言型パイプラインで実行します。

pipeline {
   agent none
   stages {
       stage("first") {
           script {
               def foo = "foo" 
               sh "echo ${foo}"
           }
       }
   }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.