2017-05-16 37 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}',你會發現它仍然有原始價值! – Kutzi