Как загрузить еще один отличный скрипт в том же узле Jenkins?
При загрузке сценария конвейера из другого сценария конвейера два конвейера не выполняются на одном и том же узле: первый выполняется на моем главном узле, а второй выполняется на подчиненном узле.
Я использую трубопроводы Дженкинса с Pipeline Script from SCM
Вариант для многих работ таким образом:
Каждое из моих заданий определяет соответствующий URL Git-репо с помощью
Poll SCM
опцию, чтобы хранилище автоматически опрашивалось при внесении изменений в мой код (базовое использование работы).Каждое из моих заданий определяет простое
Jenkinsfile
в корне их репозитория, и скрипт конвейера внутри делает в основном только загрузку более общего конвейера.
Например:
node {
// --- Load the generic pipeline ---
checkout scm: [$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'http://github/owner/pipeline-repo.git']]]
load 'common-pipeline.groovy'
}()
Мой конвейер common-pipe.groovy выполняет такие вещи, как создание, освобождение или развертывание артефактов, например:
{ ->
node() {
def functions = load 'common/functions.groovy'
functions.build()
functions.release()
functions.deploy()
}
}
Теперь я не хочу форсировать узел для каждой работы, поэтому оба конвейера node("master")
или же node("remote")
потому что я действительно не хочу обрабатывать это вручную, однако мне бы хотелось, чтобы после запуска первого конвейера на определенном узле (master, slave1, slave2, slave3) второй / загруженный конвейер выполнялся на том же узле, потому что в противном случае мой действительный код Git-репозитория недоступен из рабочего пространства другого узла...
Есть ли способ указать, что я хочу, чтобы мой второй конвейер выполнялся на том же узле, что и первый, или, возможно, передать аргумент при использовании load
шаг?
2 ответа
Как насчет сохранения рабочего пространства после проверки и перед загрузкой скрипта?:
например
stash includes: '**', name: "source"
а затем распакуйте его в другой узел node(){}:
например unstash "source"
Таким образом, он будет доступен в другом узле
Не забудьте очистить рабочее место, хотя
Или как насчет создания общей функции, которая также содержит логику для извлечения (возможно, передавая ветки как параметр). Затем вы можете отбросить node(){} в файле Jenkins и просто использовать записи node(){} в вашем общем скрипте groovy?
например, Jenkins file
load 'common-pipeline.groovy'
createWorlflow("*/master")
общий pipeline.groovy:
def createWorkflow(branches){
node() {
def functions = load 'common/functions.groovy'
functions.checkout(branches)
functions.build()
functions.release()
functions.deploy()
}
}
Вы можете создать параметризованное задание для второго конвейера и использовать этот параметр для управления узлом при запуске второго задания.
Второй конвейер будет выглядеть так:
node(runhereParam) {
}