0

我在尋求幫助,瞭解Groovy閉包發生了什麼,以及什麼是「正確」的做法。我有一個Jenkins管道,我在5個平行分支中調用子程序;它需要一個參數,其實際值是一個字符串常量 - 在並行分支的每個調用中不同的參數。我所看到的是,所有5個處決接收的最後並聯支路命名字符串常量:Jenkins並行管道:參數塊中的所有子例程調用都從最後一個塊傳遞參數

段:

def build_if_needed = { project -> 
    println "build_if_needed: $project" 
    // ultimately this will kick off a build job... 
} 

parallel (
    aaa : { build_if_needed('aaa')}, 
    bbb : { build_if_needed('bbb')}, 
    ccc : { build_if_needed('ccc')}, 
    ddd : { build_if_needed('ddd')}, 
    eee : { build_if_needed('eee')}, 
) 

輸出:

[Pipeline] parallel 
[Pipeline] [aaa] { (Branch: aaa) 
[Pipeline] [bbb] { (Branch: bbb) 
[Pipeline] [ccc] { (Branch: ccc) 
[Pipeline] [ddd] { (Branch: ddd) 
[Pipeline] [eee] { (Branch: eee) 
[Pipeline] [aaa] echo 
[aaa] build_if_needed: eee 
[Pipeline] [aaa] } 
[Pipeline] [bbb] echo 
[bbb] build_if_needed: eee 
[Pipeline] [bbb] } 
[Pipeline] [ccc] echo 
[ccc] build_if_needed: eee 
[Pipeline] [ccc] } 
[Pipeline] [ddd] echo 
[ddd] build_if_needed: eee 
[Pipeline] [ddd] } 
[Pipeline] [eee] echo 
[eee] build_if_needed: eee 
[Pipeline] [eee] } 
[Pipeline] // parallel 
[Pipeline] End of Pipeline 

我期待的參數值傾倒在[aaa]中是'aaa',而不是'eee'。它是一個固定的字符串常量,作爲參數傳遞。爲什麼所有5次執行的'build_if_needed'從最終的並行調用中接收到字符串常量?我錯過了什麼?

有沒有辦法做我想做的事情?

+0

我仍然不明白上面顯示的行爲,但我能夠通過遵循本文中的邏輯來解決它http://jenkins-ci.361315.n4.nabble.com/Generating-parallel-flow-用 - 建設 - 流量 - 插件 - td4687604.html。 –

回答

0

這被認爲是一個基本上是duplicate question的bug。它已被修正爲Groovy Pipeline 2.35。

0

它在我的情況下,運作良好(詹金斯2.7.4)使用方法,而不是封閉的:

def build_if_needed(project) { 
    println "build_if_needed: $project" 
    // ultimately this will kick off a build job... 
} 

parallel (
    aaa : { build_if_needed('aaa')}, 
    bbb : { build_if_needed('bbb')}, 
    ccc : { build_if_needed('ccc')}, 
    ddd : { build_if_needed('ddd')}, 
    eee : { build_if_needed('eee')} 
) 

以我的經驗,你應該避免使用封閉儘可能多的,你可以在管道的腳本。 Jenkins似乎有問題來處理關閉,如https://issues.jenkins-ci.org/browse/JENKINS-26481

相關問題