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