我如何从詹金斯文件中触发另一个作业的构建?

我假设这个作业是同一github组织下的另一个存储库,它已经有自己的Jenkins文件。

我还希望仅在分支名称为master时才这样做,因为触发任何本地分支的下游构建都没有意义。

更新:

stage 'test-downstream'
node {
     def job = build job: 'some-downtream-job-name'
}

但是,当执行时,我得到一个错误

没有找到名为some- downstream -job-name的参数化作业

我确定该作业存在于jenkins中,并且与当前作业在同一个组织文件夹下。这是另一个有自己“詹金斯档案”的工作。

请注意,这个问题是特定于GitHub组织插件,它自动创建和维护来自GitHub组织的每个存储库和分支的作业。


当前回答

命令内置管道用于触发jenkins中的其他作业。

在github上的例子

作业必须存在于Jenkins中,并且可以参数化。 至于分支,我猜您可以从git中读取它

其他回答

除了上面提到的答案之外:我想通过传递给第二个管道的简单参数启动一个作业,并在http://web.archive.org/web/20160209062101/https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow上找到了答案

所以我用:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}

首先,在节点中封装构建步骤是对执行器插槽的浪费。你的上游执行者会毫无理由地闲置着。

其次,在多分支项目中,您可以使用环境变量BRANCH_NAME在当前分支上设置逻辑条件。

第三,作业参数接受绝对或相对作业名。如果您给出的名称没有任何路径限定,那么它将指向同一文件夹中的另一个作业,在多分支项目的情况下,这意味着同一存储库的另一个分支。

所以你想写的可能是

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}

命令内置管道用于触发jenkins中的其他作业。

在github上的例子

作业必须存在于Jenkins中,并且可以参数化。 至于分支,我猜您可以从git中读取它

为该任务使用build job插件,以便从jenkins文件中触发其他任务。 您可以在执行中添加各种逻辑,例如并行、节点和代理选项以及触发外部作业的步骤。我举了一些简单易懂的例子。

1.从Jenkins文件中触发外部任务的例子:

if (env.BRANCH_NAME == 'master') {
  build job:'exactJobName' , parameters:[
    string(name: 'keyNameOfParam1',value: 'valueOfParam1')
    booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
 ]
}

2.使用条件从Jenkins文件触发多个作业的示例:

 def jobs =[
    'job1Title'{
    if (env.BRANCH_NAME == 'master') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
        booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
     ]
    }
},
    'job2Title'{
    if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam3',value: 'valueOfParam3')
        booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
        booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
     ]
    }
}

您可以使用Jenkins Pipeline中的构建作业步骤(最小Jenkins要求:2.130)。

下面是构建步骤的完整API: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

如何使用build:

job:要构建的下游作业的名称。可能是另一个管道工作,但更常见的是一个自由式或其他项目。 如果作业与上游Pipeline作业在同一个文件夹中,请使用简单的名称; 你可以使用相对路径,比如../姐妹文件夹/下游 或者你也可以使用绝对路径,比如/top-level-folder/nested-folder/downstream

使用分支作为参数触发另一个作业

在我的公司,许多分支机构都包含“/”。必须将“/”的任何实例替换为“%2F”(因为它出现在作业的URL中)。

在本例中,我们使用相对路径

    stage('Trigger Branch Build') {
        steps {
            script {
                    echo "Triggering job for branch ${env.BRANCH_NAME}"
                    BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
                    build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
            }
        }
    }

使用构建号作为参数触发另一个作业

build job: 'your-job-name', 
    parameters: [
        string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
        string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
    ]

并行触发许多作业

来源:https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/

更多关于Parallel的信息请访问:https://jenkins.io/doc/book/pipeline/syntax/#parallel

    stage ('Trigger Builds In Parallel') {
        steps {
            // Freestyle build trigger calls a list of jobs
            // Pipeline build() step only calls one job
            // To run all three jobs in parallel, we use "parallel" step
            // https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
            parallel (
                linux: {
                    build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                mac: {
                    build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                windows: {
                    build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                failFast: false)
        }
    }

或者:

    stage('Build A and B') {
            failFast true
            parallel {
                stage('Build A') {
                    steps {
                            build job: "/project/A/${env.BRANCH}", wait: true
                    }
                }
                stage('Build B') {
                    steps {
                            build job: "/project/B/${env.BRANCH}", wait: true
                    }
                }
            }
    }