Groovy循环、Map与索引结合问题:Jenkins并行执行索引异常
Jenkins并行任务闭包变量捕获问题修复
问题描述
在Jenkins中通过Groovy创建10个命名不同的并行任务,预期每个任务打印对应索引0-9,但执行后所有任务均输出10。原代码如下:
ps = [:] for (int i = 0; i < 10; ++i) { ps["${i}"] = { println(i) } } for (int i = 0; i < 10; i++) { ps["${i}"]() } // Jenkins中实际执行:parallel ps
问题原因
Groovy闭包捕获的是变量的引用而非循环时的即时值。当循环结束后,变量i的最终值为10,所有闭包执行时都会读取这个已更新的引用值,导致输出全部为10。
解决方案
方法1:创建循环变量副本
在每次循环中创建局部变量保存当前索引值,让闭包绑定这个独立的副本:
ps = [:] for (int i = 0; i < 10; ++i) { def currentIndex = i // 保存当前索引的副本 ps["${i}"] = { println(currentIndex) } } parallel ps
方法2:使用each循环替代for循环
Groovy的each循环会为每次迭代创建独立的作用域,迭代变量在每次循环中都是新实例,闭包会捕获当前迭代的变量值:
ps = [:] (0..9).each { index -> ps["${index}"] = { println(index) } } parallel ps
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

