Как извлечь разделы сценария конвейера Дженкинса в классы?

#jenkins #groovy #refactoring #jenkins-pipeline #jenkinsfile

#дженкинс #groovy #рефакторинг #дженкинс-конвейер

Вопрос:

Я хочу преобразовать мой сценарий конвейера Дженкинса в классы для удобства чтения и повторного использования.

Проблема в том, что при этом я получаю исключения. Давайте рассмотрим простой пример:

Когда я запускаю

 echo currentBuild.toString()
  

все в порядке

Но когда я извлекаю его в класс как так:

 class MyClass implements Serializable {
    def runBuild() {
        echo currentBuild.toString()
    }
}
new MyClass().runBuild()
  

я получаю исключение:

 Started by user admin
Replayed #196
[Pipeline] End of Pipeline
groovy.lang.MissingPropertyException: No such property: currentBuild for class: MyClass
  

Каков правильный способ извлечения кода конвейера в классы?

Ответ №1:

Вы на правильном пути, но проблема в том, что вы не передали объект script экземпляру вашего класса и пытались вызвать метод, который не определен в классе, который вы создали.

Вот один из способов решить эту проблему:

 // Jenkins file or pipeline scripts editor in your job
new MyClass(this).runBuild()

// Class declaration
class MyClass implements Serializable {
    def script
    MyClass(def script) {
        this.script=script
    }
    def runBuild() {
        script.echo script.currentBuild.toString()
    }
}
  

Комментарии:

1. Спасибо вам за ваш любезный ответ. Я понял это через несколько минут после публикации вопроса 🙂

2. Похоже, это не работает с последним плагином конвейера версии v2.5. Выдается следующее исключение groovy.lang.MissingPropertyException: No such property: script for class: MyClass

3. @bram не могли бы вы предоставить нам более подробную информацию о вашем скрипте? Теперь вы его запускаете?

Ответ №2:

в вашем коде отсутствует сценарий объявления поля класса

 class MyClass implements Serializable {

    def script

    MyClass(def script) {
        this.script=script
    }

    def runBuild() {
        script.echo script.currentBuild.toString()
    }
}
  

этот код должен быть в порядке @bram