2017-05-16 19 views
1

私はこのようになります宣言型のパイプラインを取得しようとしている:条件付きの環境変数

pipeline { 
    environment { 
     ENV1 = 'default' 
     ENV2 = 'default also' 
    } 
} 

キャッチがあり、私はENV1またはENV2の値を上書きできるようにしたいのですが任意の条件に基づいて決定する。私の現在の必要性は、枝から離れているだけですが、より複雑な条件を想像することができます。

これを実装するための純粋な方法はありますか?私のような何かを行うことのオンラインいくつかの例を見てきました:

をしかし、私はそれがENV1の呼び出し後に上書きされたローカル変数を設定しているとして、これは、そんなに実際に環境変数を設定していないと信じています。問題は、これらの環境変数がnodejsスクリプトによって読み取られ、実際のマシン環境変数である必要があることです。

jenkinsfileで環境変数を動的に設定する方法はありますか?

答えて

3

withEnvを使用すると、パイプラインの特定の部分(たとえば、ノードスクリプトの実行時)で使用するために環境変数を動的に設定できます。このように(あなたのノードのスクリプトとshのステップの内容を置き換える):

pipeline { 
    agent { label 'docker' } 
    environment { 
     ENV1 = 'default' 
    } 
    stages { 
     stage('Set environment') { 
      steps { 
       sh "echo $ENV1" // prints default 
       // override with hardcoded value 
       withEnv(['ENV1=newvalue']) { 
        sh "echo $ENV1" // prints newvalue 
       } 
       // override with variable 
       script { 
        def newEnv1 = 'new1' 
        withEnv(['ENV1=' + newEnv1]) { 
         sh "echo $ENV1" // prints new1 
        } 
       } 
      } 
     } 
    } 
} 
+0

はい、これは機能します。残念なことに、すべての段階でそれを行う方法はありませんが、今のところこれを行う必要があります。ありがとう! –

0
pipeline { 
    agent none 
    environment { 
     ENV1 = 'default' 
     ENV2 = 'default' 
    } 
    stages { 
     stage('Preparation') { 
      steps { 
       script { 
        ENV1 = 'foo' // or variable 
        ENV2 = 'bar' // or variable 
       } 
       echo ENV1 
       echo ENV2 
      } 
     } 
     stage('Build') { 
      steps { 
       sh "echo ${ENV1} and ${ENV2}" 
      } 
     } 
     // more stages... 
    } 
} 

この方法は、より簡単で、良く見えます。上書きされた環境変数は他のすべてのステージにも適用されます。

+0

実際にはこれは環境変数を上書きしませんが、新しいグローバルスコープのGroovy変数を定義します(私は思います)。 _Build_ステージに '$ {env.ENV1}' intをエコーし​​ようとすると、元の価値! – Kutzi

関連する問題