Jenkins:普通的DSL:使用三元运算符区分FreeStyleJob和MatrixJob

thi*_*wfx 2 groovy ternary-operator jenkins groovydsl jenkins-job-dsl

我正在尝试为詹金斯编写一个groovy-dsl脚本以生成两个作业:

  • 第一份工作是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
        // }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用。证明:debug仅在日志文件中打印一次(它应该出现两次,因为我希望定义两个不同的作业)。

我还尝试将三元运算符及其操作数包装在括号中,如下所示:

(config.toolchainsBuild ? job("job1") : matrixJob("job2")) {
// ...
Run Code Online (Sandbox Code Playgroud)

但是,这会导致语法错误:

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
Run Code Online (Sandbox Code Playgroud)

如何根据布尔值重写上面的表达式以产生两个不同的作业?

我相信问题与闭包三元运算符的使用有关,也许不打算以这种方式使用它?

thi*_*wfx 5

我设法通过以下方式解决了问题:

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

jobInstance.with {
    // ... job definition follows
}
Run Code Online (Sandbox Code Playgroud)

即,通过使用该with方法。这样,闭包仅写入一次。