Конвейер Jenkins - как загрузить Jenkinsfile без первого вызывающего узла ()? - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть несколько уникальная настройка, в которой мне нужно иметь возможность динамически загружать файлы Jenkins, которые находятся за пределами src, который я создаю.Сами Jenkinsfiles обычно вызывают node (), а затем выполняют некоторые шаги сборки.Это приводит к тому, что несколько исполнителей будут израсходованы без необходимости, потому что мне нужно уже вызывать node (), чтобы использовать шаг загрузки для запуска Jenkinsfile или для выполнения groovy, если я прочитал Jenkinsfile как строку и выполнил ее.

То, что у меня есть в пользовательском интерфейсе работы сегодня:

@Library(value='myGlobalLib@head', changelog=fase) _

node{
    load "${JENKINSFILES_ROOT}/${PROJECT_NAME}/Jenkinsfile"
}

Загружаемый Jenkinsfile обычно также вызывает node ().Например:

node('agent-type-foo'){
    someBuildFlavor{
        buildProperty = "some value unique to this build"
        someConfig = ["VALUE1", "VALUE2", "VALUE3"]
        runTestTarget = true
    }
}

Это приводит к тому, что 2 исполнителя будут использованы во время выполнения конвейера.В идеале я загружаю Jenkinsfiles без первого вызывающего узла (), но всякий раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке:

"Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node"

Есть ли способ загрузить Jenkinsfile или выполнить groovy, не имея сначала hudson.Контекст FilePath?Кажется, я ничего не могу найти в документе.Я нахожусь в точке, где я собираюсь предварительно обработать Jenkinsfiles, чтобы удалить их первоначальный вызов node () и call node () со значением, которое использовал Jenkinsfile, а затем загрузить остальную часть файла, но это несколько слишкомхрупким для меня, чтобы быть счастливым.

1 Ответ

0 голосов
/ 01 января 2019

При использовании load шаг Jenkins оценивает файл.Вы можете заключить логику вашего Jenkinsfile в функцию (в моем примере с именем run()), чтобы она загружалась, но не запускалась автоматически.

def run() {
    node('agent-type-foo'){
        someBuildFlavor{
            buildProperty = "some value unique to this build"
            someConfig = ["VALUE1", "VALUE2", "VALUE3"]
            runTestTarget = true
        }
    }
}

// This return statement is important in the end of Jenkinsfile
return this 

Вызовите ее из сценария задания следующим образом:

def jenkinsfile
node{
    jenkinsfile = load "${JENKINSFILES_ROOT}/${PROJECT_NAME}/Jenkinsfile"
}
jenkinsfile.run()

Таким образом, больше нет вложенных node блоков, поскольку первый закрывается до вызова run() функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...