关于groovy:我如何使用GitHub Org插件从jenkins管道(jenkinsfile)中触发另一个工作?

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

如何从Jenkinsfile内部触发另一个作业的生成?

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

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

更新:

1
2
3
4
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 Organization中的每个存储库和分支创建和维护作业。


首先,将build步骤包装到node中会浪费执行器插槽。您的上游执行者将无故闲着。

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

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

因此,您打算写的可能是

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


除了上述答案外:我想通过传递给第二个管道的简单参数开始工作,并在https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow上找到答案。

所以我用了:

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


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

github上的例子

这项工作必须存在于詹金斯并且可以参数化。
至于分支,我想你可以从git中读取它


您可以使用Jenkins Pipeline中的build job步骤(最低Jenkins要求:2.130)。

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

如何使用build

  • job:要构建的下游作业的名称。可能是另一项Pipeline工作,但更常见的是自由泳或其他项目。

    • 如果作业与此上游Pipeline作业位于同一文件夹中,请使用简单名称;否则,请使用简单名称。
    • 您可以改用相对路径,例如../sister-folder/downstream
    • 或者您可以使用/top-level-folder/nested-folder/downstream之类的绝对路径

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

在我公司,我们的许多分支都包含" /"。您必须将" /"的任何实例替换为"%2F"(显示在作业的URL中)。

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

1
2
3
4
5
6
7
8
9
    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
            }
        }
    }

使用内部版本号作为参数触发另一个作业

1
2
3
4
5
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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)
        }
    }

或者:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    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
                    }
                }
            }
    }

为该任务使用构建作业插件,以便从jenkins文件触发其他作业。
您可以在执行中添加各种逻辑,例如并行,节点和代理选项以及触发外部作业的步骤。为此,我给出了一些易于阅读的菜谱示例。

1.使用条件示例从jenkins文件触发外部作业的示例:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 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')
     ]
    }
}