如何将构建作业附加到地图中?

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)
...

使用上述方法的正确语法是什么?

您的代码中几乎没有问题:

  1. 分支描述testBuild是一个map(key:value)对象,不是list .所以你不能像你那样左移 (<<) 值,map

  2. 不支持这样的操作
  3. Jenkins pipeline parallel operation expects map with closure 作为其值。

  4. 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
    }
}