
# 条件分支
GCS支持条件分支功能，基础原理是 **根据每个步骤的condition字段来判断当前步骤是否执行**。根据业务使用场景分为简单条件分支和复杂条件分支。
- 简单条件分支，即在流程执行前，已经确定某个值是true还是false，从而可以确定对应的步骤是否需要执行。一般情况下，简单条件分支适用于condition字段，后跟布尔类型的值，做为判断。
- 复杂条件分支，即在流程执行过程中，根据流程执行的结果才能判断对应的步骤是否需要执行。一般情况下，复杂条件分支可以使用[check_result](https://support.huaweicloud.com/tr-gcs/gcs_tr_03_0004.html)函数来判断执行结果，并配合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函数](https://support.huaweicloud.com/tr-gcs/gcs_tr_03_0004.html)来动态判断。
图1复杂条件分支示例   
![](https://support.huaweicloud.com/tr-gcs/zh-cn_image_0165153136.png)
如下示例中，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
```
![](https://support.huaweicloud.com/tr-gcs/public_sys-resources/note_3.0-zh-cn.png)
check_result的第二个参数可以使用 inputs变量，详细请参见[check_result](https://support.huaweicloud.com/tr-gcs/gcs_tr_03_0004.html)函数。示例如下：
```
condition: check_result(job-a, ${my_var})
```
#### 依赖传递
如果流程为 A-\>B-\>C，当步骤B由于条件不满足而不需要执行时，由于依赖原因，那么步骤C不管condition是否为true也不需要执行。
即：
A -\> B (**condition为false时** ) -\> C (**自动不需要执行**)
所以不需要为每个Job重复写condition条件，GCS自动会判断依赖传递。
