如何在 Jenkins 中成功构建时触发参数化构建?

How to trigger parameterized build on successful build in Jenkins?

我有三个管道项目,项目-a、项目-b 和项目-c。 project-c 接受一个参数。在成功完成 project-a 或 project-b 后,我想使用参数触发 project-c 的构建。

我可以在 project-a 和 project-b 中使用以下代码在管道中执行此操作:

1
2
3
stage('trigger-project-c') {
    def job = build job: 'project-c', parameters: [[$class: 'StringParameterValue', name: 'MY_PARAM', value: 'somevalue']]
}

但这需要两个执行者。我希望 project-a 或 project-b 在使用参数运行 project-c 之前完全完成。


您的管道很可能如下所示:

1
2
3
4
5
6
7
8
9
10
11
node {
  stage('build') {
    // sh"make"
  }

  // ...

  stage('trigger-project-c') {
      def job = build job: 'project-c', parameters: [[$class: 'StringParameterValue', name: 'MY_PARAM', value: 'somevalue']]
  }
}

通过将所有内容package在 node 闭包中,下游作业 project-c 被内联触发,上游作业不会暂停/释放执行程序。

因此,长时间基本上什么都不做的事情不应该被package在 node 步骤中,以免阻塞执行程序。一个非常相似的情况是使用 input 步骤等待用户反馈。

相反,您的管道应该看起来像如下,这是 - 可以说 - 最佳实践(因为你不会阻止你的执行者):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
stage('build') {
  node {
    // sh"make"
  }
}

// or

node {
  stage('build') {
    // sh"make"
  }

  stage('unit') {
    // sh"make"
  }
} // node

// note: the following code is _not_ wrapped inside a `node` step
stage('trigger-project-c') {
  def job = build job: 'project-c', parameters: [[$class: 'StringParameterValue', name: 'MY_PARAM', value: 'somevalue']]
}

没有必要将 build 步骤package在 node 中,即阻止它的执行程序。对于其他步骤(如 sh),管道执行会触发错误并提醒您它不能在 node 分配之外运行。


将参数wait: false添加到build步骤中,无需等待下游作业即可继续管道执行。

编辑:如果您不关心此管道的其他下游作业的成功,这将有所帮助。如果您需要等到它完成后再继续自己的(上游作业)管道,请参阅我的其他答案。