Как загрузить еще один 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) {

}