更新时间:2021-12-08 GMT+08:00
分享

条件分支

GCS支持条件分支功能,基础原理是 根据每个步骤的condition字段来判断当前步骤是否执行。根据业务使用场景分为简单条件分支和复杂条件分支。

  • 简单条件分支,即在流程执行前,已经确定某个值是true还是false,从而可以确定对应的步骤是否需要执行。一般情况下,简单条件分支适用于condition字段,后跟布尔类型的值,做为判断。
  • 复杂条件分支,即在流程执行过程中,根据流程执行的结果才能判断对应的步骤是否需要执行。一般情况下,复杂条件分支可以使用check_result函数来判断执行结果,并配合condition字段确定对应的步骤是否需要执行。

简单条件分支示例

所谓简单,就是在执行流程时,提前可以决定哪些步骤要不要执行,和软件中的if/else语法类似。例如完整流程为 A->B,运行流程时,输入给B步骤的condition条件为false,那么B步骤不需要执行。

如下示例中,如果job-a的condition值为false,则commands命令不会执行。

inputs:
  bool-var:
    default: true
    description: 布尔值输入变量
    type: bool
workflow:
  job-a:
    tool: nginx:latest
    condition: ${bool-var}  # <==通过变量,决定步骤是否执行。相当于 if(bool-var)
    commands:
      - echo run-job-a

复杂条件分支示例

所谓复杂,就是流程运行过程中,基于运行结果才决定下一步骤要不要执行,和软件中if/else或是switch/case语法类似。例如: A步骤检测样本是否合格,如果合格则执行B步骤;如果不合格则执行C步骤。

因为需要根据上一个步骤的“执行结果”来判断下一步骤的condition值是true还是false,所以GCS使用了check_result函数来动态判断。

图1 复杂条件分支示例

如下示例中,job-a的结果为pass,则job-b将会执行,job-c和job-d不会执行。

workflow:
  job-a:
    tool: nginx:latest
    commands:
      - echo pass  # <== 执行结果以标准std_out体现
  job-b:
    tool: nginx:latest
    condition: check_result(job-a, "pass")  # <==判断job-a的结果,等于pass才执行。
    commands:
      - echo run-job-b
  job-c:
    tool: nginx:latest
    condition: check_result(job-a, "npass")  # <==判断job-a的结果,等于npass才执行。
    commands:
      - echo run-job-c
  job-d:
    tool: nginx:latest
    condition: check_result(job-a, "failed")  # <==判断job-a的结果,等于failed才执行。
    commands:
      - echo run-job-d

check_result的第二个参数可以使用 inputs变量,详细请参见check_result函数。示例如下:

condition: check_result(job-a, ${my_var})

依赖传递

如果流程为 A->B->C,当步骤B由于条件不满足而不需要执行时,由于依赖原因,那么步骤C不管condition是否为true也不需要执行。

即:

A -> B (condition为false时) -> C (自动不需要执行)

所以不需要为每个Job重复写condition条件,GCS自动会判断依赖传递。

相关文档