我有一个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 slave0=org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper@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行是&#34; parallel&#34;线。
我做错了什么?我不确定是否有更简单的方法可以根据从属参数列表动态创建并行构建作业。
答案 0 :(得分:0)
对slaveClosure(i)
的调用初始化一个对象并将其分配给地图,这是jenkins意外的。如果你要使用这个模式,你可能需要一个围绕闭包的外部函数,它返回闭包而不进行评估。相反,我使用以下方法生成并行作业。在每次迭代中存储索引值很重要,因为在运行时会计算闭包。
def projectName = "${PROJECT_NAME}"
def slaveList = "${SLAVE_LIST}".split("\n")
def slaveMap = [:]
def gradleTasks = "${GRADLE_TASKS}"
for (int i = 0; i < slaveList.size(); i++) {
def index = i
slaveMap['slave' + index] = {build job: projectName, parameters: [
[$class: 'LabelParameterValue', name: 'slaveAol', label: slaveList[index]],
[$class: 'StringParameterValue', name: 'gradleTasks', value: gradleTasks]
]
}
}
parallel slaveMap