Как загрузить еще один groovy script в тот же Jenkins node?
При загрузке конвейера script из другого конвейера script два конвейера не выполняются на одном и том же node: первый выполняется на моем master node, а второй выполняется на slave node.
Я использую конвейеры Jenkins с параметром Pipeline Script from SCM
для большого количества заданий таким образом:
-
Каждое из моих заданий определяет их соответствующий URL-адрес Git repo с параметром Poll SCM
, чтобы репозиторий автоматически включался при изменении моего кода (основное использование задания).
-
Каждое из моих заданий определяет простой Jenkinsfile
в корне их репозитория, а конвейер script внутри в основном ничего, кроме загрузки более общего конвейера.
например.
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 для каждого задания, чтобы оба конвейера имели node("master")
или node("remote")
, потому что я действительно не хочу обрабатывать это вручную, однако Я хотел бы, чтобы после того, как первый конвейер работает на определенном node (либо master, slave1, slave2, slave3), второй/загруженный конвейер выполняется на том же node, потому что в противном случае мой фактический Git код репозитория недоступно из другого рабочего пространства node...
Можно ли указать, что я хочу, чтобы мой второй конвейер выполнялся на одном и том же node в качестве первого или, возможно, передал аргумент при использовании шага load
?
Ответы
Ответ 1
Как насчет смены рабочего пространства после проверки и до загрузки script?:
например.
stash includes: '**', name: "source"
а затем разблокировать его в другой секции node() {}:
например.
unstash "source"
Таким образом, он будет доступен в другом node
Не забудьте очистить рабочее пространство, хотя
Или как насчет создания общей функции, которая содержит логику для проверки (возможно, передача в ветвях как параметр). Затем вы можете отбросить node() {} в файле Jenkins и просто использовать записи node() {} в общем groovy script?
например. Jenkinsfile
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()
}
}
Ответ 2
Вы можете выполнить параметризованное задание для второго конвейера и использовать параметр для управления node при запуске второго задания.
Второй конвейер будет выглядеть следующим образом:
node(runhereParam) {
}