How to invoke a jenkins pipeline A in another jenkins pipeline B

I have two Jenkins pipelines, let's say pipeline-A and pipeline-B. I want to invoke pipeline-A in pipeline-B. How can I do this?

(pipeline-A is a subset of pipeline-B. Pipeline-A is responsible for doing some routine stuff which can be reused in pipeline-B)

I have installed Jenkins 2.41 on my machine.

96510 次浏览

A little unclear if you want to invoke another pipeline script or job, so I answer both:

Pipeline script The "load" step will execute the other pipeline script. If you have both scripts in the same directory, you can load it like this:

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

Other script (pipeline_a.groovy):

def someMethod() {
//do something
}


return this

Pipeline job

If you are talking about executing another pipeline job, the "build job" step can accomplish this:

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

propagate: Propagate errors

wait: Wait for completion

If you have paramters on the job, you can add them like this:

build job: '<Project name>', parameters: [[$class: 'StringParameterValue', name: 'param1', value: 'test_param']]

Following solution works for me:

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'
}
}
}
}

Adding link of the official documentation of "Pipeline: Build Step" here: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

To add to what @matias-snellingen said. If you have multiple functions, the return this should be under the function that will be called in the main pipeline script. For example in :

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


def helperMethod1(){
//do stuff
}


def helperMethod2(){
//do stuff
}

The someMethod() is the one that will be called in the main pipeline script

Another option is to create a package, load it and execute it from the package.

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


def myFunc(var1) {
return result
}

Than consume it

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

hope it helps

As mentioned by @Matias Snellingen and @Céline Aussourd, in the case of launching a multibranch job you have to specify the branch to build like this :

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

In my case it solved the problem.

I am going to post my solution, which is similar to @Michael COLL, @Matias Snellingen, and @Céline Aussourd. For the multibranch pipeline I am using the following code in Jenkinsfile to trigger my multibranch B with multibranch A (in the example there are two cases for pipeline and multibranch pipeline):

post {
always {
echo 'We are in post part and Jenkins build with QA tests is going to be triggered.'
// For triggering Pipeline
//build job: 'WGF-QA WITH ALLURE', parameters: [string(name: 'QA-Automation', value: 'value from Build pipeline')]
// For triggering Multibranch Pipeline
build job: 'Testing QA/QA Selenium Tests/feature%2FGET-585', parameters: [string(name: 'QA-Automation', value: 'value from Build pipeline')]
}
}

Just be sure to define the whole path to the branch as is defined in the case and instead of / in branch name use %2F (feature/GET-585 -> feature%2FGET-585).