我如何使用 jenkins 动态生成并行作业 workflow/pipeline

How can I dynamically generate parallel jobs with jenkins workflow/pipeline

所以我正在尝试为 运行 并行生成可变数量的测试作业,但我 运行 正在进入一种情况,即传入的参数将是最大值所有执行的值。

这是我使用的 groovy 代码的简化版本

jobs=[:]
unitSplits = 5
println "split units $unitSplits times"

for (int i = 0; i < unitSplits; i++) {
  jobs["unit tests ${i} of ${unitSplits}"] =  { 
      group -> {-> test(group)}
    }(i)
}

jobs.each{ k, v -> v() }

def test(group) {
  println "testing group ${group}"
}

预期输出:

split units 5 times
testing group 0
testing group 1
testing group 2
testing group 3
testing group 4

实际输出:

split units 5 times
testing group 5
testing group 5
testing group 5
testing group 5
testing group 5

我需要这个 group 参数来知道要进行哪一组测试 运行。

关于如何使这项工作有任何想法吗?

这是一个 Groovy 错误,实际上还有另一个 jenkins-workflow 问题在讨论它。您的 int i 是一个单一的 变量 作用域为循环并由每个闭包共享;在循环结束时(在任何闭包 运行 之前!),它的最终值为 5。使用 def 创建新的(有效 final)的最简单修复每个循环迭代中的变量,例如:

def _i = i

顺便说一下,由于 JENKINS-26481.each 无法正常工作;您现在必须使用更简单的 C 风格循环。无论如何,我想您的真实示例是使用 parallel 步骤。