控制工作流中的执行顺序

本页面介绍了如何使用跳转操作来控制工作流步骤的运行顺序。基本跳转操作允许您定义要在工作流中运行的下一步。条件跳转操作是在基本跳转操作的基础上构建的,允许您使用条件表达式通过工作流控制执行顺序。例如,仅当来自另一个工作流步骤的变量或响应符合特定条件时,您才能运行某些步骤。

本页面上的示例使用将返回星期几的示例 API。

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 存在您希望在其中更改执行顺序的工作流。如需了解如何创建和部署工作流,请参阅创建和更新工作流

使用跳转操作更改执行顺序

默认情况下,所有工作流都会进行排序,其中每个步骤都按您在工作流的源代码中定义的顺序运行。您可以选择使用跳转操作替换此默认顺序。

基本跳转操作

您可以使用基本跳转操作,指定要在工作流中运行的下一步。

控制台

  1. 打开 Google Cloud Console 中的“工作流”页面:
    转到“工作流”页面

  2. 选择您要在其中更改现有步骤执行顺序的工作流的名称。

  3. 修改工作流页面上,选择下一步以转到工作流编辑器。

  4. 在步骤结尾添加 next 字段,以指示工作流跳转到特定步骤:

    - step_a:
        ...
        next: STEP_NAME
    - step_b:
        ...
    - next_step:
        ...
    

    STEP_NAME 替换为您希望工作流执行的下一步的名称。例如 next_step

  5. 选择部署

gcloud

  1. 使用您所选的文本编辑器打开工作流的定义文件。

  2. 在步骤结尾添加 next 字段,以指示工作流跳转到特定步骤:

    - step_a:
        ...
        next: STEP_NAME
    - step_b:
        ...
    - next_step:
        ...
    

    STEP_NAME 替换为您希望工作流执行的下一步的名称。例如 next_step

  3. 保存工作流文件。

  4. 如需部署工作流,请输入以下命令:

    gcloud workflows deploy WORKFLOW_NAME \
    --source=WORKFLOW_FILE.YAML
    

    请替换以下内容:

    • WORKFLOW_NAME:必填。您的工作流的名称。

    • WORKFLOW_FILE.YAML:必填。工作流的源文件。

示例

例如,以下面的工作流为例,其步骤无序:

- get_time:
   call: http.get
   args:
       url:  https://us-central1-workflowsample.cloudfunctions.net/datetime
   result: currentTime
- return_daylight_savings_bool:
   return: ${daylightSavings}
- get_daylight_savings_bool:
   assign:
       - daylightSavings: ${currentTime.body.isDayLightSavingsTime}

为步骤 get_timeget_daylight_savings_bool 添加 next 字段,以便工作流按正确的顺序执行:

- get_time:
   call: http.get
   args:
       url:  https://us-central1-workflowsample.cloudfunctions.net/datetime
   result: currentTime
   next: get_daylight_savings_bool
- return_daylight_savings_bool:
   return: ${daylightSavings}
- get_daylight_savings_bool:
   assign:
       - daylightSavings: ${currentTime.body.isDayLightSavingsTime}
   next: return_daylight_savings_bool

条件跳转操作

您可以使用条件跳转操作来确定要在工作流中执行的下一步。条件跳转操作使用 switch 块,当符合特定条件时,会跳转到指定步骤。每个 switch 块最多可包含 10 个条件。

控制台

  1. 打开 Google Cloud Console 中的“工作流”页面:
    转到“工作流”页面

  2. 选择要添加 switch 块的工作流的名称。

  3. 修改工作流页面上,选择下一步以转到工作流编辑器。

  4. 定义工作流页面会显示工作流的当前定义。如需修改工作流,使其根据条件语句执行特定步骤,请添加使用 switch 块的步骤:

    - SWITCH_STEP_NAME:
       switch:
           - condition: ${EXPRESSION_ONE}
             next: STEP_A
           - condition: ${EXPRESSION_TWO}
             next: STEP_B
           ...
       next: STEP_C
    - STEP_A
       ...
    - STEP_B
       ...
    - STEP_C
       ...

    请替换以下内容:

    • SWITCH_STEP_NAME:包含 switch 块的步骤的名称。

    • EXPRESSION_ONE:要进行求值的第一个表达式。如果此表达式的计算结果为 true,则工作流接下来会执行 STEP_A。如果此表达式的计算结果为 false,则工作流将对下一个表达式求值。

    • EXPRESSION_TWO:要进行求值的第二个表达式。如果此表达式的计算结果为 true,则工作流接下来会执行 STEP_B。如果此表达式的计算结果为 false,则工作流会执行 STEP_C

    • STEP_ASTEP_BSTEP_C:占位符步骤名称。

  5. 选择部署

gcloud

  1. 使用您所选的文本编辑器打开您的工作流定义。

  2. 如需修改工作流,使其根据条件语句执行特定步骤,请添加使用 switch 块的步骤:

    - SWITCH_STEP_NAME:
       switch:
           - condition: ${EXPRESSION_ONE}
             next: STEP_A
           - condition: ${EXPRESSION_TWO}
             next: STEP_B
           ...
       next: STEP_C
    - STEP_A
       ...
    - STEP_B
       ...
    - STEP_C
       ...

    请替换以下内容:

    • SWITCH_STEP_NAME:包含 switch 块的步骤的名称。

    • EXPRESSION_ONE:要进行求值的第一个表达式。如果此表达式的计算结果为 true,则工作流接下来会执行 STEP_A。如果此表达式的计算结果为 false,则工作流将对下一个表达式求值。

    • EXPRESSION_TWO:要进行求值的第二个表达式。如果此表达式的计算结果为 true,则工作流接下来会执行 STEP_B。如果此表达式的计算结果为 false,则工作流会执行 STEP_C

    • STEP_ASTEP_BSTEP_C:占位符步骤名称。

    switch 语句可以根据需要设置任意数量的条件。

  3. 保存工作流文件。

  4. 如需部署工作流,请输入以下命令:

    gcloud workflows deploy WORKFLOW_NAME \
    --source=WORKFLOW_FILE.YAML
    

    请替换以下内容:

    • WORKFLOW_NAME:必填。您的工作流的名称。

    • WORKFLOW_FILE.YAML:必填。工作流的源文件。

示例

例如,以下工作流使用切换块来控制工作流的执行顺序:

- getCurrentTime:
    call: http.get
    args:
        url:  https://us-central1-workflowsample.cloudfunctions.net/datetime
    result: currentTime
- conditionalSwitch:
    switch:
        - condition: ${currentTime.body.dayOfTheWeek == "Friday"}
          next: friday
        - condition: ${currentTime.body.dayOfTheWeek == "Saturday" OR currentTime.body.dayOfTheWeek == "Sunday"}
          next: weekend
    next: workWeek
- friday:
    return: "It's Friday! Almost the weekend!"
- weekend:
    return: "It's the weekend!"
- workWeek:
    return: "It's the work week."

在本例中,switch 块有两个条件。解析器会依次评估每个条件,如果条件表达式的结果为 true,则会调用该条件的 next 步骤。如果不满足任何这些条件,工作流便会调用 switch 块外部的 next 字段指定的步骤,在本例中为步骤 workWeek

例如,如果星期几为 "Saturday",则工作流会跳转至步骤 weekend 并返回消息 "It's the weekend!"。工作流不会因为条件跳转操作跳过了步骤 friday 而不执行该步骤,并且工作流不会因为 return 在步骤 weekend 结束时停止执行工作流而不执行步骤 workWeek

后续步骤