如何在 Jenkins 流水线 B 中调用 Jenkins 流水线 A

89

我有两个Jenkins流水线,假设是pipeline-A和pipeline-B。我想在pipeline-B中调用pipeline-A。我该如何做?

(pipeline-A是pipeline-B的子集。pipeline-A负责执行一些例行工作,可以在pipeline-B中重复使用)

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


1
你尝试过将其作为普通作业触发吗:node { def job = build job: 'some-pipeline' } - Torsten
6个回答

78

以下的解决方案对我有效:

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/


3
这对你有用吗?"pipeline1"实际上是"pipeline {}"吗?我收到了这个错误消息:"不支持等待非作业项"。我认为这只适用于作业而不是完整的流水线。 - red888
pipeline1 实际上是另一个你需要在这里调用的流水线名称。 - Yash
4
如果您遇到错误 ERROR: Waiting for non-job items is not supported,可能需要指定分支:build job: 'pipeline1/master', parameters: [ - Céline Aussourd
1
您可以把JOB_NAME环境变量作为参数传递给子作业。 - Matias Snellingen
这个问题在过去几年中引起了很多关注。有人成功地从父作业或子作业中获取了工作路径或工作ID吗? - Yash
显示剩余6条评论

75
有点不太清楚你是想调用另一个流水线脚本还是作业,所以我会两者都回答一下: 流水线脚本 "load" 步骤将执行另一个流水线脚本。如果你的两个脚本在同一个目录下,你可以这样加载它:
def pipelineA = load "pipeline_A.groovy"
pipelineA.someMethod()

其他脚本(pipeline_a.groovy):
def someMethod() {
    //do something
}

return this

管道作业

如果您想要执行另一个管道作业, 您的Jenkinsfile中的build job步骤可以完成此操作:

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

propagate: 传播错误

wait: 等待完成

如果您有作业的参数,可以像这样添加:

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

我想知道如何在父管道中获取子管道的状态。我希望根据子管道的结果来继续执行父管道。 - Yash
有没有办法像“旧的jenkins”一样将“当前构建参数”从一个作业传递到另一个作业? - Shahar Hamuzim Rajuan
6
我怀疑你试图开始一个不存在的工作或使用错误的名称。例如,如果你想调用多分支工作,请使用:"build job:“my-job/my-branch-name",propagate: true, wait: true"。请注意,在翻译时不会添加任何解释或其他内容。 - Matias Snellingen
2
@colti 下游分支已经存在。我需要做的是将BRANCH_NAME指定为${env.BRANCH_NAME}。因此,我的最终调用类似于: build job:"Downstream_Job/${env.BRANCH_NAME}",parameters:[string(name:'some_param',value:'true')] - msteppe91
2
如何在BlueOcean UI中显示子流程的阶段? - handras
显示剩余7条评论

4

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

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

在我的情况下,它解决了这个问题。


嗨,我怎样才能在另一个管道中访问这个参数? - awiechert
@awiechert 是的,你可以。 - Michaël COLL
那么,我们首先在Jenkins上运行Pipeline1,然后我们可以调用作业的名称。这样对吗? - Dhody Rahmad Hidayat
你如何以这种方式传递布尔值? - Yaron

2

我将发布我的解决方案,它与@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 -> feature%2FGET-585)。


你可以从构建作业中返回成功或失败吗? - Danijel

1

补充一下 @matias-snellingen 的话。如果您有多个函数,则 return this 应该在主管道脚本中将要调用的函数下面。例如:

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

def helperMethod1(){ 
   //do stuff
} 

def helperMethod2(){
  //do stuff
}

someMethod() 是主管道脚本中将被调用的方法。


0
另一个选择是创建一个包,加载它并从包中执行它。
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)

希望能有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接