我的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;所以我希望这可行。
答案 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)