web-dev-qa-db-ja.com

Jenkins:パイプラインステージで変数を定義できない

宣言型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を使っています。

65
Crummy

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

76
abayer

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

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

私はあなたが有効ではないいくつかの余分な行を持っていたと思います...

編集

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

pipeline {
   environment {
     FOO = "foo"
   }

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

@ 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"
            }
        }
    }
}
17
Si Zi

Jenkins 2.138.3では、2種類のパイプラインがあります。

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

「宣言的パイプラインは、パイプラインDSLの新しい拡張です(基本的には1つのステップしか持たないパイプラインスクリプト、引数を持つパイプラインステップ(ディレクティブと呼ばれます)。これらのディレクティブは特定の構文に従う必要があります。より厳密なので、パイプラインに慣れていない人、グラフィカルな編集ができる人、その他にとって、もっと簡単なはずです。スクリプト化されたパイプラインは、高度な要件の代替となります。」

ジェンキンスのパイプライン:エージェント対ノード?

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

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
4
pitchblack408