我正在尝试使用<<
运算符以builder = { name, param1, param2 ->
[job: name, parameters: [string(name: 'Param1', value: param1), string(name: 'Param2', value: param2)], quietPeriod: 2, wait: false]
}
node {
stage('Tests') {
def testBuilds = [:]
testBuilds << build *builder('Test', 'Foo', 'Bar')
testBuilds << build *builder('Test', 'Foo2', 'Bar2')
parallel testBuilds
}
}
运算符实现以下方式启发的代码:
testBuilds
我希望将两个作业附加到groovy.lang.MissingPropertyException: No such property: build for class: groovy.lang.Binding
at groovy.lang.Binding.getVariable(Binding.java:63)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:224)
at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:241)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:221)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:221)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:24)
...
地图中,以便并行运行它们。
但是,在运行作业时,我遇到以下异常错误:
{{1}}
使用上述方法的正确语法是什么?
答案 0 :(得分:1)
您的代码中遇到的问题很少:
分支说明testBuild
是地图(键:值)对象,而非列表。所以你不能像你那样将shift(&lt;&lt;&lt;&lt;)值留在其中,这样的操作不支持map
Jenkins管道并行操作需要使用 closure 作为其值的地图。
build 是管道DSL的一部分,而不是常见的Groovy方法。它似乎不能以这种方式接受论证。虽然表达式build *builder(foo, bar)
首先通过语法检查,但省略圆括号只是常规的语法糖。将此行重写为build(*builder(foo, bar))
会生成语法错误异常。
总而言之,您可以通过以下方式重写代码:
def builder(name, param1, param2) {
return build(job: name, parameters: [string(name: 'Param1', value: param1)], [string(name: 'Param2', value: param2)], quietPeriod: 2, wait: false)
}
node {
stage('Tests') {
def testBuilds = [:]
testBuilds['test1'] = { builder('Test', 'Foo', 'Bar') }
testBuilds['test2'] = { builder('Test', 'Foo2', 'Bar2') }
parallel testBuilds
}
}