Как вызвать конвейер Дженкинса A в другом конвейере Дженкинса B

У меня есть два конвейера Jenkins, скажем, pipeline-A и pipeline-B. Я хочу вызвать конвейер-A в конвейере-B. Как я могу это сделать?

(Pipeline-A - это подмножество pipeline-B. Pipeline-A отвечает за выполнение некоторых рутинных операций, которые можно повторно использовать в pipeline-B)

Я установил Jenkins 2.41 на свой компьютер.


person Yash    schedule 11.04.2017    source источник
comment
вы пробовали запускать его как обычное задание: node {def job = build job: 'some-pipeline'}   -  person Torsten    schedule 11.04.2017


Ответы (5)


Немного неясно, хотите ли вы вызвать другой сценарий конвейера или задание, поэтому я отвечаю на оба:

Сценарий конвейера На этапе «загрузка» выполняется другой сценарий конвейера. Если у вас есть оба сценария в одном каталоге, вы можете загрузить его следующим образом:

def pipelineA = load "pipeline_A.groovy"
pipelineA.someMethod()

Другой скрипт (pipeline_a.groovy):

def someMethod() {
    //do something
}

return this

Трубопроводная работа

Если вы говорите о выполнении другого задания конвейера, шаг "build job" может выполнить это:

build job: '<Project name>', propagate: true, wait: true

распространять: распространять ошибки

ждать: дождаться завершения

Если у вас есть параметры для работы, вы можете добавить их следующим образом:

build job: '<Project name>', parameters: [[$class: 'StringParameterValue', name: 'param1', value: 'test_param']]
person Matias Snellingen    schedule 11.04.2017
comment
Просто хочу знать, как я могу получить статус дочернего конвейера в родительском конвейере. Я хочу продолжить родительский конвейер на основе результата дочернего конвейера. - person Yash; 30.08.2017
comment
Есть ли способ передать текущие параметры сборки от одного задания к другому? как в старых Дженкинсах - person Shahar Hamuzim Rajuan; 01.02.2018
comment
Я использовал первый пример из «конвейерного задания» с распространением и ожиданием, но Дженкинс выдает мне эту ошибку: ОШИБКА: Ожидание незадействованных элементов не поддерживается. Есть какие-нибудь подсказки, что я сделал не так? - person P Kuijpers; 02.05.2018
comment
Я подозреваю, что вы пытаетесь начать работу, которой не существует, или используете неправильное имя. Если вы, например, хотите вызвать многоотраслевое задание, используйте: build job: "my-job/my-branch-name", propagate: true, wait: true. - person Matias Snellingen; 03.05.2018
comment
Есть ли способ динамически использовать переменную окружения BRANCH_NAME из многоотраслевого задания? Что-то вроде build job: "my-job/$BRANCH_NAME", propagate: true, wait: true? Я все время получаю ошибку с синтаксисом, который использую. Я тоже пробовал env.BRANCH_NAME. Ошибки заключаются в том, что элементы с именем my-job / $ BRANCH_NAME не найдены (я использую свое настоящее имя вакансии вместо my-job). - person msteppe91; 02.10.2018
comment
@ msteppe91 конвейер для нисходящей ветви должен уже существовать, прежде чем вы сможете построить. Я столкнулся с той же ошибкой, не могу найти решение. Однако переменную окружения следует использовать так: ${BRANCH_NAME} - person colti; 11.10.2018
comment
@colti Нисходящая ветвь уже существовала. Мне нужно было указать BRANCH_NAME как ${env.BRANCH_NAME}. Так что мой последний звонок оказался примерно таким: build job: "Downstream_Job/${env.BRANCH_NAME}", parameters: [string(name: 'some_param', value: 'true')] - person msteppe91; 15.10.2018
comment
Как можно показать, что этапы суб-конвейера отображаются в пользовательском интерфейсе BlueOcean? - person handras; 15.01.2019
comment
если я вызываю другой сценарий, он использует другое рабочее пространство. есть ли способ предотвратить это, чтобы оба сценария использовали одно и то же? - person benez; 27.02.2019
comment
Вы можете использовать ws(c:\workspace\path\here){ code here }, чтобы указать местоположение рабочей области, в которой выполняется ваше задание. - person Matias Snellingen; 28.02.2019
comment
«Build job: my-job / my-branch-name, распространять: true, wait: true» действителен ли этот синтаксис для другого репо? Например, могу ли я использовать это: «my-job / path / another / repo» - person elulcao; 05.06.2021

Для меня работает следующее решение:

pipeline {
    agent
    {
        node {
                label 'master'
                customWorkspace "${env.JobPath}"
              }
    }

    stages 
    {
        stage('Start') {
            steps {
                sh 'ls'
            }
        }

        stage ('Invoke_pipeline') {
            steps {
                build job: 'pipeline1', parameters: [
                string(name: 'param1', value: "value1")
                ]
            }
        }

        stage('End') {
            steps {
                sh 'ls'
            }
        }
    }
}

Добавление ссылки на официальную документацию «Pipeline: Build Step» здесь: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

person Yash    schedule 30.08.2017
comment
Как это работает для вас? Действительно ли pipeline1 является конвейером {}? Я получаю эту ошибку: Ожидание не связанных с работой элементов не поддерживается. Я думаю, это только для рабочих мест, а не для полного конвейера - person red888; 16.09.2017
comment
pipeline1 - это на самом деле другое имя конвейера, которое вам нужно вызвать здесь. - person Yash; 02.01.2018
comment
@ red888 Если вы получили ошибку ERROR: Waiting for non-job items is not supported, возможно, потребуется указать ветку: build job: 'pipeline1/master', parameters: [ - person Céline Aussourd; 23.05.2018
comment
Есть ли способ узнать имя родительского конвейера, когда дочерний конвейер запущен? - person Yash; 19.07.2018
comment
Вы можете передать переменную среды JOB_NAME в качестве параметра дочернему заданию. - person Matias Snellingen; 16.01.2019
comment
Всегда ли мне нужен определенный Jenkins-Job (как Pipeline-Job) для вызова с помощью задания сборки? Или я могу вызвать Groovy-Code с полным конвейером прямо из родительского конвейера? Пример: у меня есть параметризованный конвейер для создания чего-либо. С другими небольшими другими конвейерами я хочу запустить параметризованный конвейер с разными комбинациями параметров. Нужна ли мне (параметризованная)) работа jenkins для конвейера сборки или я могу вызвать большой конвейер напрямую? - person afischer; 26.08.2020
comment
Я пробовал только с Pipeline Job, но он должен работать и для других стандартных заданий. - person Yash; 31.08.2020
comment
В последние годы этот вопрос приобрел большую популярность. Удалось ли кому-нибудь получить путь работы или идентификатор работы дочерней работы из родительской работы или наоборот? - person Yash; 27.05.2021
comment
Я пытаюсь запустить новое задание в файле jenkins, используя build(job:”app/other/repo/), но это не удается из-за «Ожидание не связанных с заданием элементов не поддерживается». Как можно запустить новое задание из другого репо из первого файла Jenkins? - person elulcao; 05.06.2021

Чтобы добавить к тому, что сказал @ matias-snellingen. Если у вас несколько функций, return this должен находиться под функцией, которая будет вызываться в сценарии основного конвейера. Например в:

def someMethod() {
   helperMethod1() 
   helperMethod2()
} 
return this 

def helperMethod1(){ 
   //do stuff
} 

def helperMethod2(){
  //do stuff
}

someMethod() - это тот, который будет вызываться в сценарии основного конвейера.

person papigee    schedule 04.05.2018

Как упоминалось @Matias Snellingen и @ Céline Aussourd, в случае запуска многоотраслевого задания вы должны указать ветку для сборки следующим образом:

stage ('Invoke_pipeline') {
    steps {
        build job: 'pipeline1/master', parameters: [
        string(name: 'param1', value: "value1")
        ]
    }
}

В моем случае это решило проблему.

person Michael COLL    schedule 18.10.2019
comment
Привет, как я могу получить доступ к этому параметру в другом конвейере? - person awiechert; 22.11.2019
comment
@awiechert Ага, можешь. - person Michael COLL; 10.03.2020

Другой вариант - создать пакет, загрузить его и запустить из пакета.

package name.of.package
import groovy.json.*

def myFunc(var1) {
return result
}

Чем потреблять

@Library('name_of_repo')
import name.of.package.* 
utils = new name_of_pipeline()
// here you can invoke
utils.myFunc(var)

Надеюсь, это поможет

person IsaacE    schedule 18.07.2019