Дженкинс: отличный DSL: использование троичного оператора для различения FreeStyleJob и MatrixJob

Я пытаюсь написать сценарий groovy-dsl для Jenkins для создания двух заданий:

  • Первая работа - это FreestyleJob
  • Второй - MatrixJob

Их определения почти одинаковы; между ними есть только незначительные различия. Поэтому я хочу повторно использовать большую часть кода задания и пришел к следующему сценарию рефакторинга (пожалуйста, обратите внимание на пятую строку, в тройном операторе):

[
    ['toolchainsBuild': false],
    ['toolchainsBuild': true],
].each { Map config ->
    config.toolchainsBuild ? job("job1") : matrixJob("job2") {
        // job definition follows...for example:
        out.println("debug")
        steps {
            cmake {
                buildToolStep {}
            }
        }
        // if (config.toolchainsBuild) {
        //     ... // different actions, depending on the job type
        // }
    }
}

Однако это не работает. Доказательство: debug печатается только один раз в лог-файле (он должен появиться дважды, так как я хочу, чтобы были определены две разные работы).

Я также попытался обернуть троичный оператор и его операнды в скобки, например:

(config.toolchainsBuild ? job("job1") : matrixJob("job2")) {
// ...

Однако это вызывает синтаксическую ошибку:

Processing provided DSL script
ERROR: (script, line 20) No signature of method: javaposse.jobdsl.dsl.jobs.MatrixJob.call() is applicable for argument types: (script$_run_closure1$_closure2) values: [script$_run_closure1$_closure2@2cb2656f]
Possible solutions: wait(), label(), any(), wait(long), label(java.lang.String), each(groovy.lang.Closure)
Started calculate disk usage of build
Finished Calculation of disk usage of build in 0 seconds
Started calculate disk usage of workspace
Finished Calculation of disk usage of workspace in 0 seconds
Notifying upstream projects of job completion
Finished: FAILURE

Как я могу переписать вышеприведенное выражение для создания двух разных заданий, в зависимости от значения логического значения?

Я считаю, что проблема связана с использованием троичного оператора с замыканиями, может быть, он не предназначен для использования таким образом?

1 ответ

Решение

Мне удалось решить это так:

def jobInstance = !config.toolchainsBuild ? job("job1") : matrixJob("job2")

jobInstance.with {
    // ... job definition follows
}

То есть, используя with метод. Таким образом, закрытие записывается только один раз.

Другие вопросы по тегам