Как загрузить еще один отличный скрипт в том же узле 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) {

}
Другие вопросы по тегам