2017-10-15 6 views
0

YAMLファイルから1つのステージで読み込まれたデータを、別のステージまたはステージ外で使用するにはどうすればよいですか?Jenkinsパイプラインyamlから読み取る

pipeline { 
    agent any 
    environment { 
    MY_ENV_VAR1 = 'VALUE1' 
    } 
    parameters { 
    string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: 'Environment to deploy on') 
    booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: 'Debug the build') 
    } 
    stages { 
    stage('Stage1') { 
     steps { 
     script { 
      def datas = readYaml file: 'release.yml' 
      echo "Got version as ${datas.version} " 
     } 
     echo "Deploying to ${params.DEPLOY_ENV} with debug=${params.DEBUG_BUILD}" 
     } 
    } 
    stage('Stage 2') { 
     steps { 
     sh 'run.sh datas.version' 
     } 
    } 
    } 
} 

私はStage 1にフェッチされたStage 2の手順内部で$ {datas.versionを}アクセスしたいです。

パイプライン定義をできるだけ宣言的にしたいと考えています。 docsを正しく読んだ場合、スクリプトセクションはステージ内にのみ追加できます。私はグローバルパイプラインレベルでこれを試しましたが、エラーUndefined section "script" at line 10がありました。

私は、パイプラインレベルでちょうどdatas = readYaml file: 'release.yml'を追加しましたが、エラーは一度ファイルを読み込み、その後の任意の段階でその読み出しデータを使用するための正しい方法だろう何Not a valid section definition: "datas = readYaml file: 'release.yml'". Some extra configuration is required line 10, column 3.

を言ってますか?

答えて

1

readYamlコードの周りにnodeセクションが必要なようです。その後、すべての段階で${datas.version}にアクセスできます。

node { 
    datas = readYaml file: 'release.yml' 
} 
pipeline { 

... 
} 

これは私がパイプラインセクションに `readYaml`部分を定義するための私の調査結果を更新しましたが、プラグインはそれを好きではないようにそれはそうJENKINS-40167

1

これは単なるスコープの問題です。変数(datas)をスクリプトブロックに宣言すると、そのブロックのスコープ内にのみ存在します。

これを解決するには2つの方法があります。変数をパイプライン外で宣言することで、変数を「グローバルに」(わかりましたが、本当にグローバルではなく、Groovyの用語ではなく)明示的に宣言できます。または、パイプラインでは、スクリプト内で変数を宣言せずにそれを使用するだけで、変数は「グローバル」変数として作成されます。

+0

を追跡されている問題です。 – Neo

+0

何が好きではないですか?私が与えた構文は、プラグインとは関係ありません。基本的なグルーヴィー変数スコープです。 –

+0

groovyコードはおそらく問題ありませんが、パイプラインが有効ではないという問題があります。 – Neo

関連する問題