如何重构常见的Jenkins JobDSL代码?

Noe*_*Yap 23 groovy jenkins jenkins-job-dsl

我有以下JobDSL规范:

job {
  steps {
    gradle('generateLock saveLock', '-PdependencyLock.includeTransitives=true', true) { node ->
      node / wrapperScript('${NEBULA_HOME}/gradlew')
    }
    gradle('check', '', true) { node ->
      node / wrapperScript('${NEBULA_HOME}/gradlew')
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想将公共代码重构成一个函数:

def gradlew(String tasks, String options) {
  gradle(tasks, options, true) { node ->
    node / wrapperScript('${NEBULA_HOME}/gradlew')
  }
}
Run Code Online (Sandbox Code Playgroud)

但是该gradle功能在功能中是不可见的gradlew.这样做的正确方法是什么?

das*_*ker 34

大括号形成一个Groovy闭包.每个闭包都有一个委托对象,方法调用定向到该委托对象.并且可以通过delegate属性访问委托.您可以将该委托传递给辅助函数以访问它的方法.

def gradlew(def context, String tasks, String options = '') {
  context.gradle(tasks, options, true) { node ->
    node / wrapperScript('${NEBULA_HOME}/gradlew')
  }
}
job {
  steps {
    gradlew(delegate, 'generateLock saveLock', '-PdependencyLock.includeTransitives=true')
    gradlew(delegate, 'check')
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议在项目维基上做一些关于如何提取常用代码的明确示例.很长一段时间我们一直在寻找相同的东西. (4认同)
  • 我将更新有关配置块的Job DSL wiki页面,请参阅https://github.com/jenkinsci/job-dsl-plugin/pull/683 (3认同)
  • @daspilker我花了大约3个小时的搜索才最终发现这个答案,并意识到我需要代表属性.我一直在使用"这个".非常感谢你的帮助!! (2认同)