条件分支
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函数来动态判断。
如下示例中,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自动会判断依赖传递。