GCP 工作流:附加到数组
GCP Workflows: append to array
使用 GCP / Google 工作流我想获取一个数组并对每个调用 http 端点的应用进行转换。为此,我正在寻找一种方法来应用转换,然后将结果重新 assemble 到另一个数组中。一种方法是 experimental.executions.map,但这是一个可能会发生变化的实验性功能,所以我有点犹豫是否要使用它。另一种方法是从一个空数组开始,并在应用转换时附加到该数组。有没有办法做到这一点?连接一个字符串似乎可行,但似乎没有内置的附加到数组的方法。我试过这样的东西,确实执行成功,但没有产生预期的结果:
main:
steps:
- assignVariables:
assign:
- sourceArray: ["one", "two", "three"]
- hashedArray: []
- hashedString: ""
- i: 0
- checkCondition:
switch:
- condition: ${i < len(sourceArray)}
next: iterate
next: returnResult
- iterate:
assign:
- hashedArray[i]: ${"#" + sourceArray[i]}
- hashedString: ${hashedString + "#" + sourceArray[i] + " "}
- i: ${i + 1}
next: checkCondition
- returnResult:
return:
- hashedString: ${hashedString}
- hashedArray: ${hashedArray}
实际结果:
[
{
"hashedString": "#one #two #three "
},
{
"hashedArray": []
}
]
预期结果:
[
{
"hashedString": "#one #two #three "
},
{
"hashedArray": ["#one", "#two", "#three"]
}
]
对于那些想知道如何使用实验性 experimental.executions.map 功能解决此问题的人,您可以这样做:
首先创建一个可调用的工作流来转换数组。我给这个工作流程起了一个名字 hash-item
。这个名字很重要,因为我们稍后会称它为 workflow_id
:
main:
params: [item]
steps:
- transform:
assign:
- hashed: ${"#" + item}
- returnResult:
return: ${hashed}
然后创建您的主工作流,它调用 hash-item
使用 experimental.executions.map
:
main:
steps:
- assignVariables:
assign:
- sourceArray: ["one", "two", "three"]
- transform:
call: experimental.executions.map
args:
workflow_id: hash-item
arguments: ${sourceArray}
result: result
- returnResult:
return: ${result}
用于执行主要工作流程的服务帐户需要 workflows.executions.create
权限(通常通过 roles/workflows.invoker
角色)。要分配它,您可以使用 Cloud SDK CLI 执行此操作:
gcloud projects add-iam-policy-binding <project-id> --member="serviceAccount:<service-account-email>" --role="roles/workflows.invoker"
执行主工作流程将输出所需的结果:
[
"#one",
"#two",
"#three"
]
注意:experimental.executions.map 是实验性的,因此可能会发生变化。
现在支持使用 list.concat:
将项目附加到列表
assign:
- listVar: ${list.concat(listVar, "new item")}
使用 GCP / Google 工作流我想获取一个数组并对每个调用 http 端点的应用进行转换。为此,我正在寻找一种方法来应用转换,然后将结果重新 assemble 到另一个数组中。一种方法是 experimental.executions.map,但这是一个可能会发生变化的实验性功能,所以我有点犹豫是否要使用它。另一种方法是从一个空数组开始,并在应用转换时附加到该数组。有没有办法做到这一点?连接一个字符串似乎可行,但似乎没有内置的附加到数组的方法。我试过这样的东西,确实执行成功,但没有产生预期的结果:
main:
steps:
- assignVariables:
assign:
- sourceArray: ["one", "two", "three"]
- hashedArray: []
- hashedString: ""
- i: 0
- checkCondition:
switch:
- condition: ${i < len(sourceArray)}
next: iterate
next: returnResult
- iterate:
assign:
- hashedArray[i]: ${"#" + sourceArray[i]}
- hashedString: ${hashedString + "#" + sourceArray[i] + " "}
- i: ${i + 1}
next: checkCondition
- returnResult:
return:
- hashedString: ${hashedString}
- hashedArray: ${hashedArray}
实际结果:
[
{
"hashedString": "#one #two #three "
},
{
"hashedArray": []
}
]
预期结果:
[
{
"hashedString": "#one #two #three "
},
{
"hashedArray": ["#one", "#two", "#three"]
}
]
对于那些想知道如何使用实验性 experimental.executions.map 功能解决此问题的人,您可以这样做:
首先创建一个可调用的工作流来转换数组。我给这个工作流程起了一个名字 hash-item
。这个名字很重要,因为我们稍后会称它为 workflow_id
:
main:
params: [item]
steps:
- transform:
assign:
- hashed: ${"#" + item}
- returnResult:
return: ${hashed}
然后创建您的主工作流,它调用 hash-item
使用 experimental.executions.map
:
main:
steps:
- assignVariables:
assign:
- sourceArray: ["one", "two", "three"]
- transform:
call: experimental.executions.map
args:
workflow_id: hash-item
arguments: ${sourceArray}
result: result
- returnResult:
return: ${result}
用于执行主要工作流程的服务帐户需要 workflows.executions.create
权限(通常通过 roles/workflows.invoker
角色)。要分配它,您可以使用 Cloud SDK CLI 执行此操作:
gcloud projects add-iam-policy-binding <project-id> --member="serviceAccount:<service-account-email>" --role="roles/workflows.invoker"
执行主工作流程将输出所需的结果:
[
"#one",
"#two",
"#three"
]
注意:experimental.executions.map 是实验性的,因此可能会发生变化。
现在支持使用 list.concat:
将项目附加到列表assign:
- listVar: ${list.concat(listVar, "new item")}