You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 06:53:16