在执行请求中传递运行时参数

您可以在工作流执行请求中传递运行时参数,并使用工作流变量访问这些参数。

设置接收运行时参数的工作流

如需设置工作流以接收作为执行请求的一部分向其传递的运行时参数,请执行以下操作:

  1. 按照步骤创建新工作流,或者选择一个现有工作流进行更新,但暂时不要部署。

  2. 在工作流的定义中添加一个 params 字段。确保将参数名称放在方括号内,并将主工作流放在 main 块中:

    YAML

    main:
      params: [ARG_NAME]
      steps:
        ...
    

    JSON

    {
      "main": {
        "params": ["ARG_NAME"],
        "steps": [
          ...
        ]
        ...
      }
    }
      

    main 块接受单个参数,该参数是任何有效的 JSON 数据类型的名称,例如数组、对象或字符串。

    最佳做法是传入具有多个已指定参数的对象,以便更轻松地理解其用途以及添加参数。然后,您可以使用点表示法访问参数。

    其他子工作流可以有多个参数。

    例如,以下工作流会向您以运行时参数传递其姓名的用户返回“Hello”问候语:

    YAML

    main:
      params: [args]
      steps:
        - step1:
            assign:
              - outputVar: ${"Hello, " + args.firstName + " " + args.lastName + "!"}
        - step2:
            return: ${outputVar}
    

    JSON

    {
      "main": {
        "params": [
          "args"
        ],
        "steps": [
          {
            "step1": {
              "assign": [
                {
                  "outputVar": "${\"Hello \" + args.firstName + \" \" + args.lastName}"
                }
              ]
            }
          },
          {
            "step2": {
              "return": "${outputVar}"
            }
          }
        ]
      }
    }
      
  3. 部署您的工作流以完成创建或更新。

在执行请求中传递数据

将工作流设置为接收运行时参数后,您可以在执行请求中将 JSON 格式的字符串(例如 {"firstName":"Workflows","lastName":"User"})传递给工作流。

控制台

  1. 如需执行工作流,请在 Google Cloud 控制台中,转到工作流页面:

    进入 Workflows

  2. Workflows 页面上,选择一个工作流以转到其详情页面。

  3. 工作流详细信息页面上,选择 执行

  4. 在显示的“执行工作流”页面上,在“输入”区域中输入包含参数名称和参数值的 JSON 字符串(例如 {"firstName":"Workflows","lastName":"User"}):

    使用示例 JSON 字符串填充的输入区域

  5. 点击执行

    执行详细信息页面上,您可以查看执行结果,包括输出 Hello, Workflows User!、执行 ID 和状态,以及工作流执行的当前步骤或最后一步。如需了解详情,请参阅访问工作流执行结果

gcloud

--data 标志添加到用于执行工作流的 gcloud workflow execute 命令中。此标志使用 JSON 字符串格式的数据。例如,如需将 firstNamelastName 传递给上一个示例工作流,请执行以下操作:

gcloud workflows run WORKFLOW_NAME \
--data='{"firstName":"FIRST","lastName":"LAST"}'

替换以下内容:

  • WORKFLOW_NAME:工作流的名称
  • FIRST:您要传递给 firstName 的工作流的字符串
  • LAST:您要传递给 lastName 的工作流的字符串

输出应类似如下所示:

Waiting for execution [9379b067-306a-4db1-a58d-c9fc99aebfd4] to complete...done.
argument: '{"firstName":"Workflows","lastName":"User"}'
endTime: '2022-07-19T13:52:47.659199466Z'
name: projects/1051295516635/locations/us-central1/workflows/workflow-6/executions/9379b067-306a-4db1-a58d-c9fc99aebfd4
result: '"Hello, Workflows User!"'
startTime: '2022-07-19T13:52:47.623862835Z'
state: SUCCEEDED
status:
  currentSteps:
  - routine: main
    step: step2
workflowRevisionId: 000002-138

客户端库

根据客户端库语言,您可以在执行请求中传递运行时参数。

例如,使用 JavaScript:

// Execute workflow
try {
  const createExecutionRes = await client.createExecution({
    parent: client.workflowPath(projectId, location, workflow),
    execution: {
      argument: JSON.stringify({"firstName":"Workflows","lastName":"User"})
    }
});
const executionName = createExecutionRes[0].name;

或者,使用 Java:

// Creates the execution object.
CreateExecutionRequest request =
    CreateExecutionRequest.newBuilder()
        .setParent(parent.toString())
        .setExecution(Execution.newBuilder().setArgument("{\"firstName\":\"Workflows\",\"lastName\":\"User\"}").build())
        .build();

如需详细了解如何使用 Google API 客户端库执行工作流,请参阅执行工作流

REST API

  1. data 标志附加到用于执行工作流的命令。data 的值是一个 JSON 格式的字符串,它包含的参数的值是一个或多个转义的“参数-值”对。例如,如需将 firstNamelastName 传递给上一个示例工作流,请执行以下操作:

    curl --request POST \
       --header "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
       --header 'Content-Type: application/json' \
       --data '{"argument":"{\"firstName\":\"FIRST\",\"lastName\":\"LAST\"}"}' \
       "https://workflowexecutions.googleapis.com/v1/projects/PROJECT_NUMBER/locations/us-central1/workflows/WORKFLOW_NAME/executions"
    

    替换以下内容:

    • PROJECT_NUMBER:您的 Google Cloud 项目编号
    • WORKFLOW_NAME:工作流的名称
    • FIRST:您要传递给 firstName 工作流的字符串
    • LAST:您要传递给 lastName 工作流的字符串

    输出应类似如下所示:

    {
      "name": "projects/PROJECT_NUMBER/locations/us-central1/workflows/WORKFLOW_NAME/executions/EXECUTION_ID",
      "startTime": "2020-11-09T23:51:31.765761331Z",
      "state": "ACTIVE",
      "argument": "{\"firstName\":\"Workflows\",\"lastName\":\"User\"}",
      "workflowRevisionId": "000001-08c"
    }
     ```
    
  2. 如需获取执行结果,请运行以下命令:

    curl --request GET \
       --header "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
       --header 'Content-Type: application/json' \
       "https://workflowexecutions.googleapis.com/v1/projects/PROJECT_NUMBER/locations/us-central1/workflows/WORKFLOW_NAME/executions/EXECUTION_ID"
    

    EXECUTION_ID 替换为返回的第一个命令的输出中的 ID。

    此输出包含类似于以下内容的行:

    "argument": "{\"firstName\":\"Workflows\",\"lastName\":\"User\"}",
    "result": "\"Hello, Workflows User!\"",
    

如需详细了解如何使用 REST API 执行工作流,请参阅执行工作流

访问运行时参数

此示例会在执行请求的过程中访问传递给工作流的运行时参数。所有参数都存储在同一个映射中,声明为主工作流的参数。

运行此工作流时,请使用以下格式传入运行时参数:

{"firstName":"Sherlock", "lastName":"Holmes"}

YAML

main:
  params: [args]
  steps:
    - step1:
        assign:
          - outputVar: ${"Hello " + args.firstName + " " + args.lastName}
    - step2:
        return: ${outputVar}

JSON

{
  "main": {
    "params": [
      "args"
    ],
    "steps": [
      {
        "step1": {
          "assign": [
            {
              "outputVar": "${\"Hello \" + args.firstName + \" \" + args.lastName}"
            }
          ]
        }
      },
      {
        "step2": {
          "return": "${outputVar}"
        }
      }
    ]
  }
}

您可以将 default 与标准库函数 map.get 结合使用,以访问可选的运行时参数,并在找不到键时返回默认值。在以下示例中,如果未指定 region,则使用 northamerica-northeast1

YAML

  main:
      params: [input]
      steps:
      - init:
          assign:
            - region: ${default(map.get(input, "region"), "northamerica-northeast1")}
  

JSON

  {
    "main": {
      "params": [
        "input"
      ],
      "steps": [
        {
          "init": {
            "assign": [
              {
                "region": "${default(map.get(input, \"region\"), \"northamerica-northeast1\")}"
              }
            ]
          }
        }
      ]
    }
  }

后续步骤