如何在Pipeline脚本中检索并限制并行触发的子作业的执行状态

71次阅读
没有评论

问题描述

在一个Pipeline脚本中执行了多个子作业,并希望在并行执行的作业中检索并控制其执行状态。具体来说,用户的问题是这样的:假设有5个数据(a、b、c、d、e)需要在3个作业(J1、J2、J3)中执行。他的Pipeline脚本的格式如下:

for (int i = 0; i < size; i++) {
  def index = i
  branches["branch${i}"] = {
    build job: 'SampleJob', parameters: [
      string(name: 'param1', value:'${data}'),
      string(name:'dummy', value: "${index}")]
  }
}
parallel branches

他遇到的问题是,假设数据3在作业1(J1)中执行失败,那么数据3的执行应该在并行执行的作业2(J2)和作业3(J3)中被阻止,不应该继续进行。

解决方案

为了检索并限制并行执行的子作业的执行状态,您可以使用build步骤返回的对象的result属性。以下是解决方案的步骤:

  1. 在Pipeline脚本中的适当位置,使用build步骤来触发子作业的执行,同时使用wait: true参数等待作业的执行完成。
  2. 使用返回的对象的result属性来检查子作业的执行结果,进而控制后续的执行流程。

下面是一个可能的解决方案示例:

for (int i = 0; i < size; i++) {
  def index = i
  branches["branch${i}"] = {
    def childJob = build job: 'SampleJob', parameters: [
      string(name: 'param1', value:'${data}'),
      string(name:'dummy', value: "${index}")], wait: true
    if (childJob.result.isBetterOrEqualTo(hudson.model.Result.FAILURE)) {
      error("Child job execution failed. Stopping further execution.")
    }
  }
}
parallel branches

在上面的示例中,我们在子作业执行之后使用childJob.result来检查作业的执行结果。如果作业的执行结果是失败(hudson.model.Result.FAILURE),则通过error步骤停止后续的执行。这将确保如果某个并行执行的子作业失败,后续的并行作业将被阻止。

请注意,这个解决方案使用了Jenkins的Pipeline脚本语法,您需要根据您的实际情况进行适当的调整和测试。

请注意,解决方案可能受到Jenkins版本的影响,建议根据您使用的Jenkins版本进行适当的验证和调整。

希望这个解决方案能帮助您解决问题。如果您仍然遇到困难,可以进一步查阅Jenkins官方文档或与社区寻求帮助。

正文完