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

JenkinsJenkins PipelineJenkins 2

Jenkins Problem Overview


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.

Jenkins Solutions


Solution 1 - Jenkins

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

Solution 2 - Jenkins

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/

Solution 3 - Jenkins

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.

Solution 4 - Jenkins

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

Solution 5 - Jenkins

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).

Solution 6 - Jenkins

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionYashView Question on Stackoverflow
Solution 1 - JenkinsMatias SnellingenView Answer on Stackoverflow
Solution 2 - JenkinsYashView Answer on Stackoverflow
Solution 3 - JenkinsMichael COLLView Answer on Stackoverflow
Solution 4 - JenkinspapigeeView Answer on Stackoverflow
Solution 5 - JenkinsMartinView Answer on Stackoverflow
Solution 6 - JenkinsIsaacEView Answer on Stackoverflow