小编典典

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

jenkins

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

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

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

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


阅读 437

收藏
2020-07-25

共1个答案

小编典典

您的管道很可能看起来像这样:

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步骤中,以免阻塞执行程序。一个非常相似的情况是使用该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']]
}

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

2020-07-25