2016-10-21 2 views
0

Я пытаюсь реализовать код вдохновленного от 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$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. Ветви описание testBuild является карта (ключ: значение) объекта, а не список. Таким образом, вы не можете сдвиг влево (< <) значения в него так, как вы делали, такая операция не поддерживается для карты

  2. Дженкинс трубопровода параллельно операция ожидает карты с закрытия как его значения.

  3. сборка является частью конвейера 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 
    } 
} 
Смежные вопросы