2016-04-14 18 views
3

テストツールの出力に基づいてJenkinsステージを並列化する必要があります。しかし、すべての並列ノードが(プラグインのcurrently brokenループに加えて)等しく定義されているため、問題が発生しています。 は、ワークフロースクリプトの例をダウントリム:Jenkinsワークフロー:ツール出力に基づいてステップを並列化する

instances = ["one", "two", "three"] 
print "Testing instances: " + instances 

test_nodes = [:] 
for (int i = 0; i < instances.size(); i++) { 
    instance_name = instances.get(i) 
    println "Processing instance " + instance_name 
    test_nodes["tk-${instance_name}"] = { 
    node { 
     stage name: ('stage ' + instance_name) 
     echo instance_name 
    } 
    } 
} 
echo "test_nodes: ${test_nodes}" 
parallel test_nodes 

次のように私は結果を期待しながら:

node { 
    stage name: 'stage one' 
    echo 'one' 
}, 
node { 
    stage name: 'stage two' 
    echo 'two' 
}, 
node { 
    stage name: 'stage three' 
    echo 'three' 
} 

私はとして定義されているすべての3つのノードを取得する - それはで見ることができるよう次の出力(繰り返し出力に注意してください。three):

[Pipeline] echo 
Testing instances: [one, two, three] 
[Pipeline] echo 
Processing instance one 
[Pipeline] echo 
Processing instance two 
[Pipeline] echo 
Processing instance three 
[Pipeline] echo 
test_nodes: [tk-one:[email protected], tk-two:[email protected], tk-three:[email protected]] 
[Pipeline] Execute in parallel : Start 
[Pipeline] [tk-one] parallel { (Branch: tk-one) 
[Pipeline] [tk-two] parallel { (Branch: tk-two) 
[Pipeline] [tk-three] parallel { (Branch: tk-three) 
[Pipeline] [tk-one] Allocate node : Start 
[tk-one] Running on master in /var/lib/jenkins/jobs/cookbook-pipeline-cookbook-site-mstypo3org/workspace 
[Pipeline] [tk-two] Allocate node : Start 
[tk-two] Running on master in /var/lib/jenkins/jobs/cookbook-pipeline-cookbook-site-mstypo3org/[email protected] 
[Pipeline] [tk-three] Allocate node : Start 
[tk-three] Running on master in /var/lib/jenkins/jobs/cookbook-pipeline-cookbook-site-mstypo3org/[email protected] 
[Pipeline] [tk-one] node { 
[Pipeline] [tk-two] node { 
[Pipeline] [tk-three] node { 
[Pipeline] [tk-one] echo 
[tk-one] three 
[Pipeline] } //node 
[Pipeline] [tk-two] echo 
[tk-two] three 
[Pipeline] } //node 
[Pipeline] [tk-three] echo 
[tk-three] three 
[Pipeline] } //node 
[Pipeline] Allocate node : End 
[Pipeline] Allocate node : End 
[Pipeline] Allocate node : End 
[Pipeline] } //parallel 
[Pipeline] } //parallel 
[Pipeline] } //parallel 
[Pipeline] Execute in parallel : End 
[Pipeline] End of Pipeline 

なぜこれが起こっていますか? workflow-cpsの別のバグですか?何か間違っていますか? parallel exampleはどの変数にもアクセスしません。

答えて

8

は、それがなければdef instance_name = instances.get(i)

を試してみてくださいそのあなただけのループの後として終わるINSTANCE_NAME、への参照を持っているよう。その同じオブジェクトの方法..

結果:変数のスコープと結合力学、すなわちherehere上に読む

[Pipeline] echo 
Testing instances: [one, two, three] 
[Pipeline] echo 
Processing instance one 
[Pipeline] echo 
Processing instance two 
[Pipeline] echo 
Processing instance three 
[Pipeline] echo 
test_nodes: [tk-one:[email protected], tk-two:[email protected], tk-three:[email protected]] 
[Pipeline] Execute in parallel : Start 
[Pipeline] [tk-one] parallel { (Branch: tk-one) 
[Pipeline] [tk-two] parallel { (Branch: tk-two) 
[Pipeline] [tk-three] parallel { (Branch: tk-three) 
[Pipeline] [tk-one] Allocate node : Start 
[tk-one] Running on master in /var/lib/jenkins/jobs/pipeline/workspace 
[Pipeline] [tk-two] Allocate node : Start 
[tk-two] Running on master in /var/lib/jenkins/jobs/pipeline/[email protected] 
[Pipeline] [tk-three] Allocate node : Start 
[Pipeline] [tk-one] node { 
[Pipeline] [tk-two] node { 
[tk-three] Running on master in /var/lib/jenkins/jobs/pipeline/workspace 
[Pipeline] [tk-one] stage (stage one) 
[tk-one] Entering stage stage one 
[tk-one] Proceeding 
[Pipeline] [tk-one] echo 
[tk-one] one 
[Pipeline] } //node 
[Pipeline] [tk-two] stage (stage two) 
[tk-two] Entering stage stage two 
[tk-two] Proceeding 
[Pipeline] [tk-two] echo 
[tk-two] two 
[Pipeline] } //node 
[Pipeline] Allocate node : End 
[Pipeline] [tk-three] node { 
[Pipeline] Allocate node : End 
[Pipeline] } //parallel 
[Pipeline] } //parallel 
[Pipeline] [tk-three] stage (stage three) 
[tk-three] Entering stage stage three 
[tk-three] Proceeding 
[Pipeline] [tk-three] echo 
[tk-three] three 
[Pipeline] } //node 
[Pipeline] Allocate node : End 
[Pipeline] } //parallel 
[Pipeline] Execute in parallel : End 
[Pipeline] End of Pipeline 
Finished: SUCCESS 

+1

私はGroovyの初心者として私を助けてくれてありがとう!引用されたドキュメントを読む。 – StephenKing

+2

ようこそ、また、[この文書](https://jamesgdriscoll.wordpress.com/2012/04/14/groovy-bindings-or-adding-keywords-to-your-dsl/)のグルーヴィーバインディングメカニックスが役立ちます。 –

関連する問題