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

时间:2016-04-22 14:56:15

标签: groovy jenkins-workflow

我正在使用Pipeline插件进行概念验证,并希望了解如何并行运行构建 - 并且要运行的构建列表是高度动态的,并且取决于特定的硬件设置。所以,我试图动态创建分支并运行它们 - 没有骰子!但是,如果我只是添加"硬编码"分支地图的索引,一切正常。我是一个时髦的新手(虽然我对Java非常好),所以它可能是一个jenkins的事情或一个时髦的事情 - 我真的不知道

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

输出如下:

[Pipeline] Execute sub-workflows in parallel : Start
[Pipeline] [0] parallel {: Parallel branch: 0
[Pipeline] [1] parallel {: Parallel branch: 1
[Pipeline] [2] parallel {: Parallel branch: 2
[Pipeline] [3] parallel {: Parallel branch: 3
[Pipeline] [4] parallel {: Parallel branch: 4
[Pipeline] [0] build: Building nebraska-echo
[0] Scheduling project: nebraska-echo
[Pipeline] [1] build: Building nebraska-echo
[1] Scheduling project: nebraska-echo
[Pipeline] [2] build: Building nebraska-echo
[2] Scheduling project: nebraska-echo
[Pipeline] [3] build: Building nebraska-echo
[3] Scheduling project: nebraska-echo
[Pipeline] [4] build: Building nebraska-echo
[4] Scheduling project: nebraska-echo
[0] Starting building: nebraska-echo #58
[Pipeline] } //parallel
[Pipeline] } //parallel
[Pipeline] } //parallel
[Pipeline] } //parallel
[Pipeline] } //parallel
[Pipeline] Execute sub-workflows in parallel : End
[Pipeline] Execute sub-workflows in parallel : Start
[Pipeline] [0] parallel {: Parallel branch: 0
[Pipeline] [1] parallel {: Parallel branch: 1
[Pipeline] [2] parallel {: Parallel branch: 2
[Pipeline] [3] parallel {: Parallel branch: 3
[Pipeline] [4] parallel {: Parallel branch: 4
[Pipeline] [0] build: Building nebraska-echo
[0] Scheduling project: nebraska-echo
[Pipeline] [1] build: Building nebraska-echo
[1] Scheduling project: nebraska-echo
[Pipeline] [2] build: Building nebraska-echo
[2] Scheduling project: nebraska-echo
[Pipeline] [3] build: Building nebraska-echo
[3] Scheduling project: nebraska-echo
[Pipeline] [4] build: Building nebraska-echo
[4] Scheduling project: nebraska-echo

[0] Starting building: nebraska-echo #59
[1] Starting building: nebraska-echo #60
[2] Starting building: nebraska-echo #61
[3] Starting building: nebraska-echo #62
[4] Starting building: nebraska-echo #63
[Pipeline] } //parallel
[Pipeline] } //parallel
[Pipeline] } //parallel
[Pipeline] } //parallel
[Pipeline] } //parallel
[Pipeline] Execute sub-workflows in parallel : End
[Pipeline] End of Pipeline
Finished: SUCCESS

从循环中添加的分支只执行第一个(无论branchesFail中的项目数量),但在branchesPass中,所有作业都按预期并行运行。

我做错了什么?

标记。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用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 }
}

然后闭包实际上不会获得值,直到它们被执行。此时,i的所有值都相同(在本例中为5),因此调用:

listOfClosures*.call()

将打印:

25
25
25
25
25

我相信你上面也有同样的情况......另一个解决办法是将def放在s前面,这样每个闭包都会获得一个新的s闪亮副本来关闭轮

def s = i.toString()
相关问题