【问题标题】:How to invoke a jenkins pipeline A in another jenkins pipeline B如何在另一个詹金斯管道B中调用詹金斯管道A
【发布时间】:2017-09-06 07:37:45
【问题描述】:

我有两个 Jenkins 流水线,比如说流水线 A 和流水线 B。我想在管道-B 中调用管道-A。我怎样才能做到这一点?

(管道-A 是管道-B 的子集。管道-A 负责做一些可以在管道-B 中重用的日常工作)

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

【问题讨论】:

  • 您是否尝试将其作为正常作业触发:node { def job = build job: 'some-pipeline' }

标签: jenkins jenkins-pipeline jenkins-2


【解决方案1】:

有点不清楚是否要调用另一个管道脚本或作业,所以我两个都回答:

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

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

其他脚本(pipeline_a.groovy):

def someMethod() {
    //do something
}

return this

管道作业

如果您正在谈论执行另一个管道作业, “构建作业”步骤可以做到这一点:

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

传播:传播错误

wait:等待完成

如果你有关于工作的参数,你可以像这样添加它们:

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

【讨论】:

  • 只想知道如何获取父管道中子管道的状​​态。我想根据子管道的结果进行父管道。
  • 有没有办法将“当前构建参数”从一个工作传递到另一个工作?就像在“老詹金斯”中一样
  • 我怀疑您尝试开始一份不存在的工作,或者您使用了错误的名称。例如,如果您想调用多分支作业,请使用:build job: "my-job/my-branch-name", propagate: true, wait: true
  • @colti 下游分支已经存在。我需要做的是将 BRANCH_NAME 指定为 ${env.BRANCH_NAME}。所以我最后的电话结果是这样的:build job: "Downstream_Job/${env.BRANCH_NAME}", parameters: [string(name: 'some_param', value: 'true')]
  • 如何在 BlueOcean UI 中显示子管道中的阶段?
【解决方案2】:

以下解决方案对我有用:

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/

【讨论】:

  • 这对您有什么作用? “pipeline1”实际上是“pipeline{}”吗?我收到此错误:“不支持等待非作业项目”。我认为这仅适用于工作而不是完整的管道
  • pipeline1 实际上是另一个需要在这里调用的管道名称。
  • @red888 如果收到错误ERROR: Waiting for non-job items is not supported,可能需要指定分支:build job: 'pipeline1/master', parameters: [
  • 子管道运行时有没有办法知道父管道的名称?
  • 您可以将 JOB_NAME 环境变量作为参数传递给子作业。
【解决方案3】:

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

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

def helperMethod1(){ 
   //do stuff
} 

def helperMethod2(){
  //do stuff
}

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

【讨论】:

    【解决方案4】:

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

    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)
    

    希望对你有帮助

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 您好,如何在其他管道中访问此参数?
      • @awiechert 是的,你可以。
      • 所以,我们先在jenkins上运行了pipeline1,然后我们就可以喊出job的名字了。对吗?
      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 2019-01-09
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 2017-05-24
      相关资源
      最近更新 更多