Groovy 在循环中创建时未正确执行分支

Groovy 在循环中创建时未正确执行分支,groovy,jenkins-workflow,Groovy,Jenkins Workflow,我正在使用Pipeline插件进行概念验证,并希望了解如何并行运行构建—要运行的构建列表是高度动态的,并且取决于特定的硬件设置。所以,我尝试动态创建分支并运行它们-没有骰子!但是,如果我只是将它们与“硬编码”索引一起添加到分支图中,一切都正常。我是groovy的新手(尽管我对Java很在行),所以它可能是jenkins的东西,也可能是groovy的东西——我真的不知道 def branchesFail = [:] for (int i = 0; i < 5; i++ ) { s =

我正在使用Pipeline插件进行概念验证,并希望了解如何并行运行构建—要运行的构建列表是高度动态的,并且取决于特定的硬件设置。所以,我尝试动态创建分支并运行它们-没有骰子!但是,如果我只是将它们与“硬编码”索引一起添加到分支图中,一切都正常。我是groovy的新手(尽管我对Java很在行),所以它可能是jenkins的东西,也可能是groovy的东西——我真的不知道

def branchesFail = [:]
for (int i = 0; i < 5; i++ ) {
    s = i.toString()
    branchesFail [ s ] = { build job: 'nebraska-echo', parameters: [ [$class: 'StringParameterValue', name: 'ARG', value: s ] ] }
}
parallel branchesFail

def branchesPass = [:]

branchesPass [ '0' ] = { build job: 'nebraska-echo', parameters: [ [$class: 'StringParameterValue', name: 'ARG', value: '0' ] ] }
branchesPass [ '1' ] = { build job: 'nebraska-echo', parameters: [ [$class: 'StringParameterValue', name: 'ARG', value: '1' ] ] }
branchesPass [ '2' ] = { build job: 'nebraska-echo', parameters: [ [$class: 'StringParameterValue', name: 'ARG', value: '2' ] ] }
branchesPass [ '3' ] = { build job: 'nebraska-echo', parameters: [ [$class: 'StringParameterValue', name: 'ARG', value: '3' ] ] }
branchesPass [ '4' ] = { build job: 'nebraska-echo', parameters: [ [$class: 'StringParameterValue', name: 'ARG', value: '4' ] ] }

parallel branchesPass
从循环中添加的分支中,仅首先执行(无论分支中的项目数是否为Fail),但在分支中,所有作业按预期并行运行

我做错了什么


标记。

您是否可以尝试使用
collectEntries
语句代替包含闭包的for循环

def branchesFail = (0..4).collectEntries { idx ->
    String sIdx = idx.toString()
    [sIdx, { build job: 'nebraska-echo', parameters: [ [$class: 'StringParameterValue', name: 'ARG', value: sIdx ] ] } ]
}
parallel branchesFail
我怀疑问题与以下相同:

如果在
for
循环中创建一个闭包,并且闭包围绕循环的迭代器变量闭合,如下所示:

def listOfClosures = []
for(int i = 0 ; i < 5 ; i++) {
    listOfClosures << { println i * i }
}
将打印:

25
25
25
25
25
我相信你也有同样的情况。。。另一个解决方案是将
def
放在
s
前面,这样每个闭包都会得到一个新的闪亮的
s
副本来完成

def s = i.toString()
25
25
25
25
25
def s = i.toString()