本产品受Google Cloud Platform服务条款的正式发布前产品条款的保护。正式上市前产品的支持可能有限,对正式上市前产品的更改可能与其他正式上市前版本不兼容。有关详细信息,请参阅发射阶段说明。
要创建工作流,您需要使用基于YAML的专有语法定义所需的执行步骤和顺序。此页是指定定义工作流的正确语法的参考。
...:表示为提高示例的清晰度和缩短长度而进行的省略,或者表示您可以添加更多对象、字段或参数。
在云SDK中使用工作流时,会保存为扩展名为.yaml的YAML文件。
每个工作流必须至少有一个步骤。默认情况下,Workflow会将步骤视为有序列表中的步骤,并一次执行一个步骤,直到所有步骤都运行完毕。例如,此工作流有两个步骤:
此类型的步骤允许您发出HTTP请求。HTTP和HTTPS请求均受支持。最常见的HTTP请求方法有一个内置的调用快捷方式(http.get和http.post),但是您可以通过将Call字段设置为http.request并使用Method字段指定请求类型来进行任何类型的HttpRequest。
-STEP_NAME:调用:{http.get|http.post|http.request}参数:URL:URL_VALUE[方法:REQUEST_METHOD][HEADER:KEY:VALUE...]。[BODY:KEY:VALUE...]。[查询:键:值...]。[身份验证:类型:{OIDC|OAuth2}][超时:VALUE_IN_SECONDS]。
方法:如果使用调用类型http.request,则为必填项。要使用的HTTP请求方法的类型。例如:
AUTH:可选。如果被调用的API需要身份验证,则为必填项。有关详细信息,请参阅发出经过身份验证的请求。
超时:可选。以秒为单位的时间。在引发异常之前允许请求运行的时间长度。
-getCurrentTime:call:http.get args:url:https://us-central1-workflowsample.cloudfunctions.net/datetime Result:currentTime-readWikipedia:call:http.get args:url:https://en.wikipedia.org/w/api.php查询:action:opensearch:${currentTime.body.dayOfTheWeek}结果:wikiResult-rereturn结果:返回:${wikiResult.body[1]}。
要初始化变量或更新现有变量,请使用变量赋值步骤。您可以在单个步骤中根据需要创建或更新任意多个变量。可以将变量分配给特定值或表达式的结果。
-ASSIGN_VARS:ASSIGN:-NUMBER:5-NUMBER_PLUS_ONE:${NUMBER+1}-OTHER_NUMBER:10-STRING:";hello";
在任何步骤结束时,您都可以使用下一步来定义工作流下一步应该执行的步骤:
您还可以通过使用切换块根据条件表达式在步骤之间跳转来控制工作流的执行顺序:
-STEP_NAME_A:开关:-条件:${Expression_A}下一步:STEP_NAME_B-条件:${Expression_B}下一步:STEP_NAME_C下一步:STEP_NAME_D
-STEP_NAME_A:开关:-条件:${表达式}步骤:-STEP_NAME_B:...-STEP_NAME_C:...。下一步:STEP_NAME_D。
-getCurrentTime:调用:https://us-central1-workflowsample.cloudfunctions.net/datetime获取参数:url:http.get参数:url:http.get参数:开关:-条件:${currentTime.body.dayOfTheWeek==";星期五&34;}下一个:星期五-条件:${currentTime.body.dayOfTheWeek=";星期六";或currentTime.body.dayOfTheWeek=";星期日"。快到周末了!-周末:返回:这是周末!-工作周:返回:这是工作日。";
有关使用跳转定义执行顺序的详细信息,请参阅控制工作流中的执行顺序。
当抛出异常、执行完所有步骤或使用关键字END或RETURN时,工作流的执行结束。
如果不需要返回值,请使用Next:End停止工作流的执行:
您可以在工作流中创建和分配变量,方法是使用分配步骤或将它们分配为HTTP调用步骤的结果。您可以使用内置解析器访问存储在avariable中的HTTP响应信息。
当APPLICATION/JSON类型的响应存储在变量中时,JSON响应将转换为您作为响应体访问的字典。工作流包括用于访问此数据的内置解析器。要从HTTP响应访问字段,请使用以下语法:
Body:使用Body字段访问HTTP响应的正文。使用Code字段访问HTTP响应代码。
PATH_TO_FIELD:您想要访问的JSON响应中字段的路径。可以仅仅是字段的名称,或者如果字段嵌套在对象中,则可以采用object1.object2.field的形式。
例如,如果API返回{";age";:50},并且工作流将响应存储在名为age_response的变量中,则如下所示:
工作流支持用于存储数据的阵列。可以通过两种不同的方式在工作流中定义数组。本节还介绍了遍历数组的语法。
可以在工作流中创建数组,方法是通过在赋值步骤中定义将数组作为步骤或结果返回。
HTTP请求通常将JSON响应作为数组返回,我们将其存储为工作流中的可用数组。在下面的示例中,我们向返回月份列表的示例API发出请求。我们将数组存储为名为monthsList的变量,然后返回数组的第三个元素:
您可以组合使用条件跳转、变量和len()函数来迭代数组。例如:
-定义:分配:-array:[";foo";,";ba";,";r";]-result:";";-i:0-check_Condition:开关:-Condition:${len(Array)>;I}Next:Iterate Next:Exit_Loop-Iterate:Assign:-Result:${result+array[i]}-i:${i+1}Next:Check_Condition-Exit_Loop:Return:Concat_Result:${result}。
表达式由工作流引擎计算,输出在执行时使用,例如将表达式的结果赋给变量或返回表达式的结果。
工作流语法支持AND、OR和NOT作为逻辑运算符。逻辑运算符只能用于布尔值或计算结果为布尔值的表达式。
这些表格显示了使用给定运算符和共享数据类型作为输入的表达式的结果。例如,在两个字符串上使用+运算符会生成一个字符串。
在INT或DOUBLE加法的情况下,如果结果值超出可用精度,则可能发生溢出。在字符串连接过程中,如果结果字符串超过字符串数据类型的允许长度,则操作将引发错误。
您可以使用子工作流来定义可以从主工作流中调用的逻辑,类似于编程语言中的例程或函数。它们允许您重复工作流中的步骤,而无需重复这些步骤并增加工作流定义中的行数。子工作流可以接受输入参数和返回值。
如果工作流有子工作流,则主工作流必须放在主块中。子工作流始终在工作流定义的主体之后定义:
Main:步骤:-Call_subWorkflow:Call:Name_Message参数:First_Name:";Sherlock";Last_Name:";Holmes";Result:Output-Return_Message:Return:${output}Name_Message:params:[First_Name,Last_Name]步骤:-PrepreMessage:Return:${";Hello";+First_Name+";";+Last_Name}。
工作流可以在遇到异常时重试步骤,而不是失败并结束执行尝试。工作流语法具有几种类型的内置错误处理策略:
引发异常会以失败状态停止执行,并将异常作为错误消息返回。异常可以是字符串,也可以是字典。
工作流会将返回状态代码400或以上的任何HTTP请求视为已发送。这会导致工作流执行失败,除非工作流捕获并处理错误。工作流使用TRY/EXCEPT结构进行错误处理:
ERROR_DICTIONARY:包含错误消息的字典变量的名称。对于HTTP请求,错误字典具有以下属性:
标签:错误标签。标记可以是以下任意字符串:ConnectionError:连接到API终结点时出错。例如,由于域名不正确、DNS解析问题等。
-Read_Item:Try:Call:http.get args:url:https://host.com/api Result:api_Response Except:AS:E步骤:-KNOWN_ERROR:Switch:-Condition:${not(";HttpError";in e.tag)}return:";连接问题。";-Condition:${e.code==404}return:";抱歉,找不到URL。";-Condition:${e.code==403}return:身份验证错误。";-unhanded_ception:引发:${e}-url_find:返回:${api_response.body}。
Try块可以包含多个步骤,允许它们共享相同的步骤,但用于错误处理的块除外:
-Read_Item:Try:Steps:-Step_a:Call:http.get args:url:https://host.com/api Result:api_Response1-Step_b:Call:http.get args:url:https://host.com/api2 Result:api_Response2...。例外:AS:E步骤:-已知错误:...。
您可以重试返回特定错误代码(例如,SpeciarHTTP状态代码)的步骤。重试语法允许您执行以下操作:
工作流具有可用于幂等步骤和非幂等步骤的默认重试策略。此外,可以修改默认重试策略,如果现有重试策略不适用于您的用例,您可以创建自定义重试策略。如果使用默认重试策略,则不需要指定谓词或定义重试配置值。
重试策略由定义应重试哪些错误代码的谓词和重试配置值的默认值组成。
-STEP_NAME:尝试:步骤:...。重试:[${http.default_retry}|${http.default_retry_non_idempotent}][谓词:${http.default_retry_dicate}|${http.default_retry_predicate_non_idempotent}][最大重试次数:重试次数][退避:初始延迟:延迟秒数最大延迟:最大延迟秒数乘数:延迟倍增数]。
重试:可输可不输。如果省略,则所有其他字段都是必填字段。选项包括${http.default_retry}和${http.default_retry_non_idempotent}。允许您指定要使用的默认重试策略。如果指定重试策略,请忽略重试块中的所有其他字段。
谓词:如果未选择默认重试策略,则为必填项。定义将重试哪些错误代码。选项包括${HTTP.DEFAULT_RETRY_PRODATE}、${http.default_retry_predicate_non_idempotent},或定义为子工作流的自定义谓词。
该步骤将总共重试八次。初始延迟为1秒,每次尝试延迟加倍,最大延迟为60秒。在这种情况下,后续尝试之间的延迟为:1、2、4、8、16、32、60和60(以秒为单位)。尝试八次后,该步骤被认为失败,并引发异常。
有两种默认重试策略可用:一种用于幂等步骤,另一种用于非幂等步骤。
默认重试策略由一个默认重试谓词和一组默认重试配置值组成。
注意:您应该只对幂等步骤(可以安全重复的步骤)使用此重试策略。
注意:您应该仅对非幂等步骤(不能安全重复的步骤)使用此重试策略。
为步骤类型(幂等或非幂等)选择适当的谓词,然后提供所需的重试配置值。例如,以下重试策略对非幂等步骤使用默认谓词,并定义自定义配置值:
-STEP_NAME:尝试:步骤:...。重试:谓词:${http.default_retry_predicate_non_idempotent}最大重试次数:10退避:初始延迟:1最大延迟:90乘数:3。
要创建自定义重试策略,请使用子工作流来定义谓词(将调用该策略的错误集)。然后调用谓词,并在主工作流的重试块中定义所需的重试配置值。
Main:-STEP_NAME:Try:Steps:...。重试:谓词:${RETRY_PRESTATE}MAX_RETRIES:NUMBER_OF_RETRIES BACKOFF:INITIAL_DELAY:DELAY_Second MAX_DELAY:MAX_DELAY_Second乘数:DELAY_MPLIERRETRY_PRODATE:PARAMS:[E]步骤:...。
例如,下面的代码实现一个自定义重试策略,该策略仅重试返回HTTP状态代码500的HTTP请求:
Main:步骤:-Read_Item:Try:Call:http.get参数:url:https://host.com/api结果:api_Response重试:谓词:${CUSTOM_RESPEATE}MAX_RETRIES:5退避:初始_延迟:2 MAX_DELAY:60乘数:2-LAST_STEP:返回:";确定";自定义_谓词:参数:[E]步骤:-WHAT_TO_REPEAT:开关:-条件:${e.code==500}返回:TRUE-否则:返回