如何在Jenkins Job DSL中使用带有conditionalSteps的foreach

时间:2018-03-12 16:22:27

标签: jenkins jenkins-job-dsl

我正在尝试使用Jenkins Job DSL中的conditionalSteps添加来有条件地触发构建步骤。如果给定集合中的任何文件存在,我希望此步骤触发。我可以通过explcitly调出多个fileExistsor来完成这项工作。但是,我想使用foreach动态创建它。

以下是我在http://job-dsl.herokuapp.com/

上玩的内容
def files = ["file1", "file2", "file3"]

job('SomeJob') {
    steps {
        conditionalSteps {
            condition {
                /* This works fine:
                or {
                    fileExists("file1.jenkinsTrigger", BaseDir.WORKSPACE)
                }{
                    fileExists("file2.jenkinsTrigger", BaseDir.WORKSPACE)
                }{
                    fileExists("file3.jenkinsTrigger", BaseDir.WORKSPACE)
                }
                */

                //But I want to create the Or clause from the array above
                or {
                    files.each {
                        fileExists("${it}.jenkinsTrigger", BaseDir.WORKSPACE)
                    }
                }
            }
            runner('Unstable')
            steps {
                gradle 'test'
            }
        }
    }
}

以上获取

javaposse.jobdsl.dsl.DslScriptException: (script, line 17) No condition specified

我已经尝试了各种组合方式来完成这项工作而无济于事...任何提示都会非常感激

1 个答案:

答案 0 :(得分:4)

or DSL方法需要一系列闭包。因此,您需要将文件名集合转换为闭包数组。

示例:

def files = ["file1", "file2", "file3"]

job('example') {
  steps {
    conditionalSteps {
      condition {
        or(
          (Closure[]) files.collect { fileName ->
            return {
              fileExists("${fileName}.jenkinsTrigger", BaseDir.WORKSPACE)
            }
          }
        )
      }
      runner('Unstable')
      steps {
        gradle 'test'
      }
    }
  }
}