The following workflow provides a concise overview of the Workflows syntax that can be used for quick reference. For more information, click the links in the workflow. You can also download the printable PDF:
main
: params
: [ args
] steps
:
# Runtime arguments
- read_runtime_args: assign
:
- arg1: ${args.arg1}
- arg2: ${args.arg2}
# Variables
and data types
- data_types: assign
:
- my_integer: 1 # 64 bit, signed
- my_double: 4.1 # 64 bit, signed floating point number
- my_string: "hello" # unicode <= 256 KB length
- my_boolean: true # true/false, True/False, TRUE/FALSE
- my_null: null
- my_list: ["zero","one","two"]
- my_map:
name: Alex
last_name: Taylor
birthYear: 1990
- conversion_functions: assign
:
- to_double: double("2.7") # string, integer to double
- to_int: int(2.7) # string, double to integer
- to_string: string(1.7) # int, double, boolean to string
# Boolean
- logical_ops: assign
:
- my_true: true
- my_false: false
- my_false: ${my_true and my_false}
- my_true: ${my_true or my_false}
- my_false: ${not my_true}
# Strings
- string_ops: assign
:
- my_string: "hello"
- string_len: ${len(my_string)}
- string_plus_string: ${my_string+" "+"world"}
- string_plus_int: ${my_string+" "+string(my_integer)}
- string_escaped: '${"a: " +my_string}'
# Lists
- list_ops: assign
:
- my_list: ["zero","one","two"]
- my_list_len: ${len(my_list)}
- key_exists: ${"Key1" in my_list}
- my_list[0]: 0
- idx: 0
- my_list[idx + 1]: 1
- my_list[my_list_len - 1]: 2
- my_list: ${list.concat(my_list, 3)}
- my_multi_dimen_list: [[10, 11, 12], [20, 21, 22]]
- my_multi_dimen_list[0][1]: "Value11"
# Maps
- map_ops: assign
:
- my_map: {"Key1": "hello"}
- map_len: ${len(my_map)}
- key_exists: ${"Key1" in my_map}
- key_list: ${keys(my_map)}
- key_is_null: ${default(map.get(my_map, "Key1"), "Couldn't find key!")}
- key_with_special_char: '${"fruit" + var.key["special!key"]}'
- key_str: "Key"
- my_map.Key1: "Value1"
- my_map["Key2"]: "Value2"
- my_map[key_str + "3"]: "Value3"
- my_nested_map: {"NestedMapKey": {"Key1":"Value1"}}
- my_nested_map.NestedMapKey.Key2: "Value2"
# Jumps
- step_with_next: assign
:
- fruit: "apple" next
: step_with_nested_steps
# Complete execution
- step_with_end: assign
:
- fruit: "apple" next
: end
# Nested steps
- step_with_nested_steps: steps
:
- nested_step_1: assign
:
- fruit: "apple"
- nested_step_2: assign
:
- fruit: "apple"
# Iteration
- for-in-list: steps
:
- assignList: assign
:
- list: [1, 2, 3, 4, 5]
- sum: 0
- loopList: for
:
value: v
in: ${list} steps
:
- sumList: assign
:
- sum: ${sum + v}
- for-in-map: steps
:
- assignMap: assign
:
- map: {1: 10, 2: 20, 3: 30}
- sum: 0
- loopMap: for
:
value: key
in: ${keys(map)} steps
:
- sumMap: assign
:
- sum: ${sum + map[key]}
- for-range: steps
:
- assignRange: assign
:
- sum: 0
- loopRange: for
:
value: v
range: [1, 9] steps
:
- sumRange: assign
:
- sum: ${sum + v}
# Parallel branches
- init: assign
:
- user: {}
- notification: {}
- parallel_branches: parallel
:
shared: [user, notification] branches
:
- getUser: steps
:
- getUserCall: call
: http.get args
:
url: ${"https://example.com/users/" + args.userId} result
: user
- getNotification: steps
:
- getNotificationCall: call
: http.get args
:
url: ${"https://example.com/notification/" + args.notificationId} result
: notification
# Parallel iteration
- init: assign
:
- total: 0
- parallel_loop: parallel
:
shared: [total] for
:
value: postId
in: ${args.posts} steps
:
- getPostCommentCount: call
: http.get args
:
url: ${"https://example.com/postComments/" + postId} result
: numComments
- add: assign
:
- total: ${total + numComments}
# Conditions
- switch_basic: switch
:
- condition
: ${my_integer < 10} next
: switch_embedded_steps
- condition
: ${my_boolean} next
: switch_embedded_steps
- condition
: true # optional, default condition next
: switch_embedded_steps next
: switch_embedded_steps
- switch_embedded_steps: switch
:
- condition
: ${my_integer < 10} steps
:
- stepA: assign
:
- fruit: "apple"
- stepB: assign
:
- fruit: "apple"
# Subworkflows
- call_subworkflow: call
: subworkflow_name_message args
:
first_name: "Alex"
last_name: "Taylor" result
: output
- call_subworkflow2: assign
:
- output2: ${subworkflow_name_message("Sherlock","Holmes")}
# Raise errors
- raise_custom_string_error: raise
: "Something went wrong."
- raise_custom_map_error: raise
:
code: 55
message: "Something went wrong."
# Catch errors
- try_retry_except: try
: steps
: # steps is only needed if multiple 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
# Retry steps
(optional)
# Either, you can use a retry with default policy
# retry
: ${http.default_retry}
# Or, you can use a more fine-grained policy
# retry
:
# predicate: ${http.default_retry_predicate}
# max_retries: 10
# backoff:
# initial_delay: 1
# max_delay: 90
# multiplier: 3 except
:
as: e steps
:
- known_errors: switch
:
- condition
: ${not("HttpError" in e.tags)} return
: "Connection problem."
- condition
: ${e.code == 404} return
: "Sorry, URL wasn't found."
- condition
: ${e.code == 403} return
: "Authentication error."
- unhandled_exception: raise
: ${e}
# Standard library
## Make an HTTP request
- http_get: call
: http.get args
:
url: https://en.wikipedia.org/w/api.php
headers:
Content-Type: "text/plain"
query:
action: opensearch
search: monday result
: wikiResult
- http_post: call
: http.post args
:
url: https://us-central1-myproject123.cloudfunctions.net/myfunc1
auth:
type: OIDC
body:
some_val: "Hello World"
another_val: 123 result
: the_message
## Function sys.log
- log: call
: sys.log args
:
data: ${wikiResult}
## Function sys.get_env
- get_env_vars: assign
:
- projectNumber: ${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
- projectID: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
- location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
- workflowId: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_ID")}
- workflowRevisionId: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_REVISION_ID")}
- workflowExecutionId: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
## Function sys.now
- get_now: assign
:
- now: ${sys.now()}
## Function sys.sleep
- wait: call
: sys.sleep args
:
seconds: 10
# Connectors
## Compute Engine API connector
- insert_machine: call
: googleapis.compute.v1.instances.insert args
:
project: ${projectID}
zone: europe-west1-b
body:
name: my-machine
machineType: zones/europe-west1-b/e2-small
disks:
- initializeParams:
sourceImage: "projects/debian-cloud/global/images/debian-10-buster-v20201112"
boot: true
autoDelete: true
networkInterfaces:
- network: "global/networks/default"
# Return from workflow
- return_multiple_values: return
:
my_integer: ${my_integer}
my_string: ${my_string}
my_true: ${my_true}
my_false: ${my_false}
my_list: ${my_list}
my_multi_dimen_list: ${my_multi_dimen_list}
my_map: ${my_map}
my_nested_map: ${my_nested_map}
- return_single_value: return
: ${my_integer}
# Subworkflow
subworkflow_name_message: params
: [first_name, last_name, country: "England"] steps
:
- prepareMessage: return
: ${"Hello " + first_name + " " + last_name + " from " + country + "."}

