Дженкинс-конвейер: нет такого метода 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).
Тем не менее, чтобы получить чистый код, вам нужно:
Избавиться от
def
ключевое слово (или альтернативно избавиться от определения типа данныхboolean
). Вы можете проверить: Groovy: ключевое слово "def" против конкретного типаДобавить
@NonCPS
ключевое слово при доступе к внутренним объектам Jenkins, которые не сериализуются.Для полноты: в дополнение к этому, конечно, для доступа к внутренним объектам 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
}
}