如何将构建作业附加到地图中?
How to append build jobs into a map?
我正在尝试通过以下方式使用 <<
运算符实现受 here 启发的代码:
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.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)
...
使用上述方法的正确语法是什么?
您的代码中几乎没有问题:
分支描述testBuild
是一个map(key:value)对象,不是list .所以你不能像你那样左移 (<<) 值,map
不支持这样的操作
Jenkins pipeline parallel operation expects map with closure 作为其值。
build 是管道 DSL 的一部分,而不是常见的 Groovy 方法。看来它不能以这种方式接受论点。虽然表达式 build *builder(foo, bar)
首先通过语法检查,但省略圆括号只是 groovy 语法糖。将此行重写为 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
}
}
我正在尝试通过以下方式使用 <<
运算符实现受 here 启发的代码:
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.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)
...
使用上述方法的正确语法是什么?
您的代码中几乎没有问题:
分支描述
testBuild
是一个map(key:value)对象,不是list .所以你不能像你那样左移 (<<) 值,map 不支持这样的操作
Jenkins pipeline parallel operation expects map with closure 作为其值。
build 是管道 DSL 的一部分,而不是常见的 Groovy 方法。看来它不能以这种方式接受论点。虽然表达式
build *builder(foo, bar)
首先通过语法检查,但省略圆括号只是 groovy 语法糖。将此行重写为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
}
}