如何使用 GitHub Org 插件从 jenkins 管道 (jenkinsfile) 触发另一个作业?

How can I trigger another job from a jenkins pipeline (jenkinsfile) with GitHub Org Plugin?

如何从 Jenkinsfile 中触发另一个作业的构建?

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

我也想仅在分支名称为 master 时执行此操作,因为触发任何本地分支的下游构建没有意义。

更新:

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

仍然,执行时出现错误

No parameterized job named some-downtream-job-name found

我确定这个作业存在于jenkins 中并且与当前作业在同一个组织文件夹下。这是另一个有自己的工作 Jenkinsfile.

请注意,此问题特定于 GitHub Organization Plugin,它会为您的 GitHub 组织的每个存储库和分支自动创建和维护作业。

pipeline 中的命令 build 用于触发 jenkins 中的其他作业。

Example on github

作业必须存在于 Jenkins 中并且可以参数化。 至于分支,我猜你可以read it from git

首先,将build步骤包裹在node中是浪费一个executor slot。您的上游执行者将无缘无故闲置。

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

第三,job参数采用绝对或相对作业名称。如果您提供的名称没有任何路径限定,那将引用同一文件夹中的另一个作业,在多分支项目的情况下,这意味着同一存储库的另一个分支。

所以你想写的大概是

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

除了上面提到的答案:我想用一个传递给第二个管道的简单参数开始一个工作,并在 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]]
}

对该任务使用 build job plugin 以触发 jenkins 文件中的其他作业。 您可以将各种逻辑添加到您的执行中,例如并行、节点和代理选项以及触发外部作业的步骤。为此,我给出了一些 easy-to-read 食谱示例。

1.example 用于通过条件示例从 jenkins 文件触发外部作业:

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

2.example 使用条件示例从 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 中的 build job 步骤(最低 Jenkins 要求:2.130)。

这是 build 步骤的完整 API:https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

如何使用build:

  • job:要构建的下游作业的名称。可能是另一项管道工作,但更常见的是自由式或其他项目。
    • 如果作业与此上游流水线作业位于同一文件夹中,则使用简单名称
    • 您可以改用 相对路径 ,例如 ../sister-folder/downstream
    • 或者你可以使用绝对路径,比如/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/

有关并行的更多信息,请点击此处: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
                    }
                }
            }
    }