2016-09-12 7 views
2

私は1つのプロジェクトで複数のビルドジョブを起動するJenkinsパイプラインを持っています。各ビルドジョブには、ジョブ中に動的に生成されるさまざまなパラメータがあります。また、ジョブを実行するスレーブの文字列パラメータもあります。そのリストは\ nで分割された複数行の文字列です。ビルドジョブを動的にトリガする方法は?

def projectName = "${PROJECT_NAME}" 
def slaveList = "${SLAVE_LIST}".split("\n") 

def gradleTasks = "${GRADLE_TASKS}" 

def slaveClosure = { slaveNum -> 
    build job: projectName, parameters: [ 
        [$class: 'LabelParameterValue', name: 'slaveAol', label: slaveList[slaveNum]], 
        [$class: 'StringParameterValue', name: 'gradleTasks', value: gradleTasks] 
       ] 
} 

def parallelSlaveMap = [:] 
for (int i = 0; i < slaveList.size(); i++) { 
    parallelSlaveMap.put("slave${i}", slaveClosure(i)) 
} 

parallel(parallelSlaveMap) 

しかし、これは私に次のエラーが発生しました:

これは私が持っているものである

参考
java.lang.IllegalArgumentException: Expected a closure or failFast but found slave[email protected]5caff0a8 
    at org.jenkinsci.plugins.workflow.cps.steps.ParallelStep$DescriptorImpl.newInstance(ParallelStep.java:202) 
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:134) 
    at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:113) 
    at groovy.lang.GroovyObject$invokeMethod.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:151) 
    at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:21) 
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:115) 
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:103) 
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:149) 
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:146) 
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:15) 
    at WorkflowScript.run(WorkflowScript:44) 

、スクリプトの行44は、「平行」行があります。

私は間違っていますか?スレーブのパラメータリストに基づいて並列ビルドジョブを動的に作成する簡単な方法があるかどうかはわかりません。

答えて

0

slaveClosure(i)を呼び出すと、オブジェクトが初期化され、マップに割り当てられます。これはジェンキンズによって予期しないものです。このパターンを使用する場合は、クロージャの周囲に外側の関数が必要になります。クロージャは、クロージャを評価せずに返します。代わりに、次の方法を使用して並列ジョブを生成します。各反復でのインデックス値の格納は、実行時にクロージャが評価されるため重要です。

​​
関連する問題