Дженкинс-конвейер: нет такого метода DSL

У меня есть задание Jenkins Pipeline, где я объявил некоторые этапы, в которых используется внешняя функция, созданная мной в том же самом скрипте.

errorList = ["badGatewayMsg", "closedByRemoteHostMsg", "connectionTimedOut"]
def boolean someFunction(name) {
    String jobLog = jenkins.model.Jenkins.instance.getItemByFullName(name).lastBuild.log
    for (error in errorList) {
        if (jobLog.contains(error))
            return true
    }
    return false
}

stage('stage1') {
        if(someFunction('job1Name'))
           // do Something
    }

stage('stage2') {
        if(someFunction('job2Name'))
           // do Something
    }

Когда я хочу начать сборку конвейера, я получаю следующую ошибку:

java.lang.NoSuchMethodError: No such DSL method 'someFunction' found among steps ....

Спасибо за вашу помощь!

1 ответ

Из любопытства я скопировал код в свой локальный Jenkins - и он заработал (после исправления очевидных проблем, таких как создание недостающих заданий и исправление условий if).

Тем не менее, чтобы получить чистый код, вам нужно:

  1. Избавиться от def ключевое слово (или альтернативно избавиться от определения типа данных boolean). Вы можете проверить: Groovy: ключевое слово "def" против конкретного типа

  2. Добавить @NonCPS ключевое слово при доступе к внутренним объектам Jenkins, которые не сериализуются.

  3. Для полноты: в дополнение к этому, конечно, для доступа к внутренним объектам Jenkins вам необходимо переключиться в режим песочницы или поместить свой код в глобальную общую библиотеку.

Вот мой рабочий пример:

errorList = ["badGatewayMsg", "closedByRemoteHostMsg", "connectionTimedOut"]
@NonCPS
boolean someFunction(name) {
    String jobLog = jenkins.model.Jenkins.instance.getItemByFullName(name).lastBuild.log
    for (error in errorList) {
        if (jobLog.contains(error))
            return true
    }
    return false
}

stage('stage1') {
    if(someFunction('job1Name')) {
       // do Something
    }
}

stage('stage2') {
    if(someFunction('job2Name')) {
       // do Something
    }
}
Другие вопросы по тегам