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

时间:2017-01-07 12:09:00

标签: jenkins jenkins-pipeline

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

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

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

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

2 个答案:

答案 0 :(得分:4)

你的管道很可能是这样的:

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

  // ...

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

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

因此,长时间没有任何作用的事情不应该包含在node步骤中,以免阻止执行者。一个非常类似的情况是using the input step to wait for user feedback

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

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']]
}

无需在node中包含build步骤,即阻止执行程序。{p>对于其他步骤(如sh),管道执行会触发错误并提醒您无法在node分配之外运行。

答案 1 :(得分:1)

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

编辑:如果您不关心此管道的其他下游作业是否成功,这将有所帮助。如果你需要等到它完成然后继续自己的(上游作业)管道,那么看看我的另一个答案。