在管道作业中设置每节点环境变量

时间:2016-10-11 21:00:01

标签: jenkins jenkins-pipeline

我的Jenkins管道看起来像这样(请原谅小的语法错误):

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)

我的目的是让一个节点包含ENVVAR=foo,另一个节点包含ENVVAR=bar

我实际看到的是,当env命令运行时,在两个节点上都设置了ENVVAR=bar

根据this tutorial,&#34; [特殊变量env]的属性是当前节点上的环境变量。&#34;所以我希望这可行。

2 个答案:

答案 0 :(得分:1)

稍后在教程中,它说:

  

在这种情况下不要使用env:

     

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

     

因为环境变量覆盖仅限于管道运行的全局,而不是当前线程(因此代理)的本地。但是,您可以使用上面提到的withEnv步骤。

看起来像是一个丑陋的DSL限制。它可以在withEnv步骤中包装舞台。

答案 1 :(得分:1)

詹金斯pipline插件是你现在远非稳定(我可以说)。 他们试图应用的CPS概念也会以多种方式影响执行,到目前为止我可能已经离开它了(虽然它真的很棒,但确实如此)

您可能希望尝试按以下方式调整代码,在'withEnv'块中运行所需的命令。将volatile变量移出并行块也有帮助:

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)