2016-10-11 3 views
0

マイジェンキンスパイプラインは、(小さな構文の誤差はご容赦ください)、次のようになります。は、パイプラインの仕事で、ノードごとの環境変数を設定する

def buildsToDo = "foo bar".tokenize() 
def buildPlan = [:] 

for (int i = 0; i < buildsToDo.size(); i ++) { 
    def tag = buildsToDo[i] 

    buildPlan[tag] = { 
    node(tag) { 
     env.ENVVAR = tag 
     stage("build " + tag) { 
     sh 'env' 
     } 
    } 
    } 
} 

parallel(buildPlan) 

私の意図は、1つのENVVAR=fooを持つノードとENVVAR=barのものを持っていることです。

実際に表示されるのは、envコマンドを実行すると、両方のノードにENVVAR=barが設定されていることです。

this tutorialによると、[特殊変数env]のプロパティは、現在のノード上の環境変数です。だから私はこれがうまくいくと思います。

チュートリアルのずっと後に

答えて

1

、それは言う:

この場合にはENVを使用しないでください:

env.PATH = "${mvnHome}/bin:${env.PATH}"

環境変数のオーバーライドがパイプラインの実行にグローバルであることに限定されているので、現在のスレッド(したがってエージェント)に対してローカルではありません。ただし、前述のようにwithEnvステップを使用することもできます。

DSLの醜い制限のように見えます。ステージはwithEnvのステップでラップして動作します。

+0

'env'は、ビルドのグローバルなので、あなたが書いたときに、' env.ENVVAR = tag'次の2つの並列実行スレッドから同じ値にアクセス:並列ブロックのうち、揮発性の変数を移動することにも役立ちます。 – izzekil

0

Jenkins pipline pluginはyoundであり、現在は安定していません(私が言うように)。 CPSのコンセプトを適用しようとすると、さまざまな方法で実行に影響があります。これまでのところ、実際には非常に大きな時間です(実際には同じ時間ですが)。

コードを調整したい場合があります次のように、'withEnv'ブロック内で必要なコマンドを実行します。

def buildsToDo = "foo bar".tokenize() 
def buildPlan = [:] 

for (int i = 0; i < buildsToDo.size(); i ++) { 
    def tag = buildsToDo[i] 
    buildPlan[tag] = { 
    node(tag) { 
     // Note environment is modified here ! 
     withEnv(env + [ENVVAR=tag]) { 
      stage("build " + tag) { 
      sh 'env' 
      } 
     } 
    } 
    } 
} 

parallel(buildPlan) 
関連する問題