Joh*_*ion 4 groovy jenkins 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
Run Code Online (Sandbox Code Playgroud)
输出 - 内部并行,'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
Run Code Online (Sandbox Code Playgroud)
参数总是传入的最后一个值(不确定原因,但它是一致的,我知道你需要局部变量技巧.)
但是,局部变量技巧在并行中并不一致:即使本地有时也是'c'(对于嵌套'说'它是正确的,但是主体错了); 在平行之外它按预期得到'a'和'b'.
我误会了吗?
Linux上的Jenkins 2.32.2,Pipeline:Grooby 2.27
| 归档时间: |
|
| 查看次数: |
2636 次 |
| 最近记录: |