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

Mar*_*son 4 jenkins jenkins-pipeline

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

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

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

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

Ste*_*ing 5

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

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

  // ...

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

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

因此,长时间本质上不执行任何操作的事情不应该包含在步骤中node,以免阻塞执行器。一个非常相似的情况是使用该input步骤等待用户反馈时。

相反,您的管道应该如下所示,可以说这是最佳实践(因为您不会阻止执行器):

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']]
}
Run Code Online (Sandbox Code Playgroud)

无需将build步骤包装在 中node,即为其阻止执行器。对于其他步骤(例如sh),管道执行将触发错误并提醒您它不能在node分配之外运行。