Jenkins Pipeline:闭包不应该在内部和外部并行解析变量吗?



我正在遇到一些令人困惑的行为,试图在jenkins管道脚本中执行代码。闭合内的值会带有一些意外的值。我已经看到了据说可以解决此问题的本地变量技巧的引用,但它对我不起作用。

简化的示例:创建3个作业'a','b','c'打印其论点 - 并传递给本地。首先并行执行工作;然后平行执行外部以比较结果。定义"说"是因为println在我的jenkins中给出了访问例外(我不是管理员)。

def say(s) {println(s)} // println gives exception inside create_jobs
def create_jobs() {
  def map = [:]                // needed for parallel
  def jobrunfn = { jobid ->    // return a closure that prints hello from job
    def pid = "$jobid"
    return {
      def xsay = { s -> say("[$pid] $s") }
      xsay "HELLO from $pid"
    }
  }
  map['a'] = jobrunfn('a')
  map['b'] = jobrunfn('b')
  map['c'] = jobrunfn('c')
  return map
}
def jobs = create_jobs()
parallel(jobs)              // for Jenkins pipeline only - not groovy interp
for (j in jobs) { jobs[j.key]() }   // groovy interp - parallel not available

输出 - 内部平行,'pid'有时是'c',何时应为'a'或b':

[Pipeline] parallel
[Pipeline] [a] { (Branch: a)
[Pipeline] [b] { (Branch: b)
[Pipeline] [c] { (Branch: c)
[Pipeline] [a] echo
[a] [a] HELLO from c
[Pipeline] [a] }
[Pipeline] [b] echo
[b] [b] HELLO from c
[Pipeline] [b] }
[Pipeline] [c] echo
[c] [c] HELLO from c
[Pipeline] [c] }
[Pipeline] // parallel
[Pipeline] echo
[a] HELLO from a
[Pipeline] echo
[b] HELLO from b
[Pipeline] echo
[c] HELLO from c
[Pipeline] End of Pipeline
Finished: SUCCESS

该参数始终是传递的最后一个值(不确定为什么,但是它是一致的,我知道您需要局部变量的技巧。)

但是,局部变量的技巧在并行内部并不能始终如一:即使局部有时也是" c"(嵌套的"说"它正确,但主体会弄错它);在并行之外,它会按预期获得" A"one_answers" B"。

我误会了吗?

Jenkins 2.32.2 Linux,管道:Grooby 2.27

这是管道的错误。看票。

最新更新