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

时间:2016-10-21 22:41:33

标签: groovy jenkins-pipeline

我正在尝试使用<<运算符以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}}

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

1 个答案:

答案 0 :(得分:1)

您的代码中遇到的问题很少:

  1. 分支说明testBuild地图(键:值)对象,而非列表。所以你不能像你那样将shift(&lt;&lt;&lt;&lt;)值留在其中,这样的操作不支持map

  2. Jenkins管道并行操作需要使用 closure 作为其值的地图。

  3. build 是管道DSL的一部分,而不是常见的Groovy方法。它似乎不能以这种方式接受论证。虽然表达式build *builder(foo, bar)首先通过语法检查,但省略圆括号只是常规的语法糖。将此行重写为build(*builder(foo, bar))会生成语法错误异常。

  4. 总而言之,您可以通过以下方式重写代码:

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