Как реорганизовать общий код 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. Как правильно это сделать?


person Noel Yap    schedule 13.01.2015    source источник


Ответы (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')
  }
}
person daspilker    schedule 13.01.2015
comment
Я бы порекомендовал сделать несколько явных примеров в вики проекта о том, как извлечь часто используемый код. Мы искали то же самое в течение довольно долгого времени. - person Matthias B; 01.12.2015
comment
Я собираюсь обновить вики-страницу Job DSL о блоках конфигурации, см. github. com/jenkinsci/job-dsl-plugin/pull/683 - person daspilker; 01.12.2015
comment
Что делает косая черта после node -> node / ... ? - person niken; 16.08.2016
comment
@daspilker Мне потребовалось около 3 часов поиска, чтобы наконец наткнуться на этот ответ и понять, что мне нужно свойство делегата. Я использовал это. Большое спасибо за помощь!! - person Allen Rice; 21.12.2016
comment
Теперь я хотел бы реорганизовать много общего кода во вспомогательный класс. Но 'Process Job DSL' находит мой вспомогательный класс рядом с моим классом JobDSL и пытается запустить его как JobDSL. Как это преодолеть? - person Ed Randall; 13.10.2017