如何在另一个詹金斯管道 B 中调用一个詹金斯管道 A

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

我有两个 Jenkins 管道,假设是管道 A 和管道 B。我想在管道 B 中调用管道 A。我怎样才能做到这一点?

(pipeline-A 是 pipeline-B 的一个子集。Pipeline-A 负责做一些可以在 pipeline-B 中重复使用的常规工作)

我已经在我的机器上安装了 Jenkins 2.41。

有点不清楚你是想调用另一个管道脚本还是作业,所以我都回答了​​:

管道脚本 "load" 步骤将执行另一个管道脚本。如果你的两个脚本都在同一个目录下,你可以这样加载它:

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

传播:传播错误

wait:等待完成

如果你在工作中有参数,你可以这样添加:

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

以下解决方案适用于我:

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"官方文档的link: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

补充@matias-snellingen 所说的内容。如果您有多个函数,return this 应该在将在主管道脚本中调用的函数下。例如:

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

def helperMethod1(){ 
   //do stuff
} 

def helperMethod2(){
  //do stuff
}

someMethod() 是将在主管道脚本中调用的

另一种选择是创建一个包,加载它并从包中执行它。

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)

希望对您有所帮助

正如@Matias Snellingen 和@Céline Aussourd 所提到的,在启动多分支作业的情况下,您必须像这样指定要构建的分支:

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

就我而言,它解决了问题。

我将post我的解决方案,它类似于@Michael COLL、@Matias Snellingen 和@Céline Aussourd。 对于多分支管道,我在 Jenkinsfile 中使用以下代码来触发我的多分支 B 和多分支 A(在示例中,有两种情况用于管道和多分支管道):

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

只需确保按照案例中的定义定义分支的整个路径,而不是 / 在分支名称中使用 %2F (feature/GET-585 ->特征%2FGET-585).