【问题标题】:Groovy for loop not incrementing correctlyGroovy for 循环没有正确递增
【发布时间】:2026-01-20 14:45:02
【问题描述】:

我正在编写一个 jenkins 管道,它混合了声明式和脚本式语法。我想循环 4 次以在管道中创建 4 个并行阶段。我想捕捉我正在进行的循环,并在每一步开始时打印出来:

def parallelStages = [:]

int cypressRunners = 4

for (int i = 1; i <= cypressRunners; i++) {
    parallelStages["Cypress ${i}"] = {
        stage("Cypress ${i}") { 
            node("cypress-runner-agent") {
                echo "------------------ Cypress ${i} Stage ------------------"
                // more steps
            }
        }
    }
}

在詹金斯日志中,我总是得到一个打印输出

------------------ Runner 5 Stage ------------------

即使在左侧列出了舞台名称,我也得到了正确索引的名称Cypress 1Cypress 2Cypress 3Cypress 4,如下所示:

我不是 java 或 groovy 开发人员,但这似乎是任何语言中的一个非常简单的 for 循环。我在这里缺少异步或闭包的某些方面吗?存在大量关于 for 循环无法按预期工作的问题,但在 jenkins-groovy-pipeline 上下文中没有问题,当然也不适用于这种情况。

【问题讨论】:

    标签: for-loop jenkins jenkins-groovy jenkins-declarative-pipeline


    【解决方案1】:

    我想出了一个解决方案,而不是删除我会发布一个答案,以防将来可能对其他人有所帮助。我的问题类似于Iterate and print content of groovy closures,但不完全一样。在这个问题的帮助下,我只是在 for 循环的闭包中捕获索引的当前值并使用它:

    for (int i = 1; i <= cypressRunners; i++) {
        def j = i // < ------- capture value within closure
        parallelStages["Cypress ${j}"] = {
            stage("Cypress ${j}") { 
                node("cypress-runner-agent") {
                    echo "------------------ Cypress ${j} Stage ------------------"
                    // more steps
                }
            }
        }
    }
    

    【讨论】: