Подтвердить что ты не робот

Как реорганизовать общий код Jenkins JobDSL?

У меня есть следующая спецификация 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')
    }
  }
}

Я хотел бы реорганизовать общий код, скажем, в функцию:

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

Но функция gradle не видна внутри функции gradlew. Какой правильный способ сделать это?

4b9b3361

Ответ 1

Кудрявые скобки образуют закрытие 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')
  }
}