从另一个触发多分支作业

Trigger Multibranch Job from another

我在 Jenkins 有一份工作,我需要在它结束时触发另一个工作(如果正确结束)。

第二个job是multibranch,所以我想知道有没有办法在触发这个job的时候,通过我想要的branch。例如,如果我在分支 develop 中开始第一个作业,我需要它来触发 develop 分支的第二个作业。

有什么办法可以实现吗?

是的,您可以通过添加 post 构建步骤来调用下游作业: Trigger/Call 在其他项目上构建(您可能需要安装 "Parameterized Trigger Plugin"):

  • 在“参数”部分中,您可以为与当前作业中的变量关联的下游作业定义变量。

此外,multibranch_PARAM1 和 *PARAM2 必须在下游作业中配置:

只需将多分支作业想象成一个文件夹,其中包含以可用分支命名的真实作业:

使用管道作业

在使用管道构建步骤时,您必须使用如下内容: build(job: 'JOB_NAME/BRANCH_NAME')。当然你也可以用变量来指定分支名称。

使用自由式作业

当从自由式作业触发时,您很可能必须

  1. 使用参数化触发器插件,因为普通的旧下游构建插件在触发管道作业时仍然存在问题(至少我们正在使用的版本)
  2. 作业名称使用与上述相同的模式:JOB_NAME/BRANCH_NAME

应该可以在这里使用作业参数指定分支名称。不过我没试过。

有时您想调用一个或多个从属多分支作业并让它们构建所有分支,而不仅仅是一个。脚本可以检索分支名称并构建它们。

因为脚本在调用构建步骤之前调用了 Jenkins API, it should be in a shared library to avoid sandbox restrictions. The script should clear non-serializable 引用。

共享库脚本jenkins-lib/vars/mbhelper.groovy:

def callMultibranchJob(String name) {
    def item = jenkins.model.Jenkins.get().getItemByFullName(name)
    def jobNames = item.allJobs.collect {it.fullName}
    item = null // CPS -- remove reference to non-serializable object
    for (jobName in jobNames) {
        build job: jobName
    }
}

管道:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                script {
                    library 'jenkins-lib'
                    mbhelper.callMultibranchJob 'multibranch-job-one'
                    mbhelper.callMultibranchJob 'multibranch-job-two'
                }
            }
        }
    }
}