--- title: Built-in Workflow Steps --- This documentation will walk through the built-in workflow steps that you can use to design an application deployment process. ## deploy **Overview** Deploy components with policies. **Parameter** | Name | Type | Description | | :-------: | :----: | :-----------------------------------: | | auto | bool | Optional, default to true. If set to false, the workflow will suspend automatically before this step. | | policies | []string | Optional, the policies that used for this deployment. If not specified, the components will be deployed to the hub cluster. | | parallelism | int | Optional, defaults to 5. | **Example** ```yaml apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: deploy-workflowstep namespace: examples spec: components: - name: nginx-deploy-workflowstep type: webservice properties: image: nginx policies: - name: topology-hangzhou-clusters type: topology properties: clusterLabelSelector: region: hangzhou - name: topology-local type: topology properties: clusters: ["local"] namespace: examples-alternative workflow: steps: - type: deploy name: deploy-local properties: policies: ["topology-local"] - type: deploy name: deploy-hangzhou properties: # require manual approval before running this step auto: false policies: ["topology-hangzhou-clusters"] ``` ## suspend **Overview** Suspend the current workflow, we can use `vela workflow resume appname` to resume the suspended workflow. > For more information of `vela workflow`, please refer to [vela cli](../../cli/vela_workflow)。 **Parameter** > Notice that you need to upgrade to KubeVela v1.4 or higher to use `duration` parameter. | Name | Type | Description | | :---: | :---: | :---------: | | duration | string | Optional, the wait duration time to resume workflow such as "30s", "1min" or "2m15s" | **Example** ```yaml apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: first-vela-workflow namespace: default spec: components: - name: express-server type: webservice properties: image: crccheck/hello-world port: 8000 workflow: steps: - name: slack-message type: webhook-notification properties: slack: # the Slack webhook address, please refer to: https://api.slack.com/messaging/webhooks message: text: Ready to apply the application, ask the administrator to approve and resume the workflow. - name: manual-approval type: suspend # properties: # duration: "30s" - name: express-server type: apply-application ``` ## notification **Overview** Send notifications. You can use the notification to send email, slack, ding talk and lark. **Parameters** | Name | Type | Description | | :--------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | email | Object | Optional, please fulfill its from, to and content if you want to send email | | email.from.address | String | Required, the email address that you want to send from | | email.from.alias | String | Optional, the email alias to show after sending the email | | email.from.password | ValueOrSecret | Required, the password of the email, you can either specify it in value or use secretRef | | email.from.host | String | Required, the host of your email | | email.from.port | Int | Optional, the port of the email host, default to 587 | | email.to | []String | Required, the email address that you want to send to | | email.content.subject | String | Required, the subject of the email | | email.content.body | String | Required, the context body of the email | | slack | Object | Optional, please fulfill its url and message if you want to send Slack messages | | slack.url | ValueOrSecret | Required, the webhook address of Slack, you can choose to fill it directly in value or specify it in secret | | slack.message | Object | Required, the Slack messages you want to send, please follow [Slack messaging](https://api.slack.com/reference/messaging/payload) | | dingding | Object | Optional, please fulfill its url and message if you want to send DingTalk messages | | dingding.url | ValueOrSecret | Required, the webhook address of DingTalk, you can choose to fill it directly in value or specify it in secret | | dingding.message | Object | Required, the DingTalk messages you want to send, please follow [DingTalk messaging](https://developers.dingtalk.com/document/robots/custom-robot-access/title-72m-8ag-pqw) | | | lark | Object | Optional, please fulfill its url and message if you want to send Lark messages | | lark.url | ValueOrSecret | Required, the webhook address of Lark, you can choose to fill it directly in value or specify it in secret | | lark.message | Object | Required, the Lark messages you want to send, please follow [Lark messaging](https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN#8b0f2a1b) | | The `ValueOrSecret` format is: | Name | Type | Description | | :--------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | value | String | Optional, directly get the data from value | | secretRef.name | String | Optional, get data from secret, the name of the secret | | secretRef.key | String | Optional, get data from secret, the key of the secret | **Example** ```yaml apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: first-vela-workflow namespace: default spec: components: - name: express-server type: webservice properties: image: crccheck/hello-world port: 8000 traits: - type: ingress properties: domain: testsvc.example.com http: /: 8000 workflow: steps: - name: dingtalk-message type: notification properties: dingding: # the DingTalk webhook address, please refer to: https://developers.dingtalk.com/document/robots/custom-robot-access url: value: message: msgtype: text text: context: Workflow starting... - name: application type: apply-application - name: slack-message type: notification properties: slack: # the Slack webhook address, please refer to: https://api.slack.com/messaging/webhooks url: secretRef: name: key: message: text: Workflow ended. lark: url: value: message: msg_type: "text" content: "{\"text\":\" Hello KubeVela\"}" email: from: address: alias: password: # secretRef: # name: # key: value: host: port: to: - kubevela1@gmail.com - kubevela2@gmail.com content: subject: test-subject body: test-body ``` ## webhook **Overview** Send a request to the specified Webhook URL. If no request body is specified, the current Application body will be sent by default. **Parameter** | Name | Type | Description | | :-------: | :----: | :-----------------------------------: | | url | ValueOrSecret | Required, Webhook URL to be sent, you can choose to fill in value directly or get it from secretRef | | data | object | Optional, the data that needs to be sent | **Example** ```yaml apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: first-vela-workflow namespace: default spec: components: - name: express-server type: webservice properties: image: crccheck/hello-world port: 8000 workflow: steps: - name: express-server type: apply-application - name: webhook type: webhook properties: url: value: ``` ## apply-application **Overview** Apply all components and traits in Application. **Parameter** No arguments, used for custom steps before or after application applied. **Example** ```yaml apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: first-vela-workflow namespace: default spec: components: - name: express-server type: webservice properties: image: crccheck/hello-world port: 8000 traits: - type: ingress properties: domain: testsvc.example.com http: /: 8000 workflow: steps: - name: express-server type: apply-application ``` ## depends-on-app **Overview** Wait for the specified Application to complete. > `depends-on-app` will check if the cluster has the application with `name` and `namespace` defines in `properties`. > If the application exists, the next step will be executed after the application is running. > If the application do not exists, KubeVela will check the ConfigMap with the same name, and read the config of the Application and apply to cluster. > The ConfigMap is like below: the `name` and `namespace` of the ConfigMap is the same in properties. In data, the key is `name`, and the value is the yaml of the deployed application yaml. > ```yaml > apiVersion: v1 > kind: ConfigMap > metadata: > name: myapp > namespace: vela-system > data: > myapp: ... > ``` **Parameter** | Name | Type | Description | | :-------: | :----: | :------------------------------: | | name | string | The name of the Application | | namespace | string | The namespace of the Application | **Example** ```yaml apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: first-vela-workflow namespace: default spec: components: - name: express-server type: webservice properties: image: crccheck/hello-world port: 8000 traits: - type: ingress properties: domain: testsvc.example.com http: /: 8000 workflow: steps: - name: express-server type: depends-on-app properties: name: another-app namespace: default ``` ## apply-object **Overview** Apply Kubernetes native resources, you need to upgrade to KubeVela v1.1.4 or higher to enable `apply-object`. **Parameters** | Name | Type | Description | | :-------: | :----: | :-----------------------------------: | | value | Object | Required, Kubernetes native resources fields | | cluster | String | Optional, The cluster you want to apply the resource to, default is the current cluster. If you want to apply resource in different cluster, use `vela cluster join` to join the cluster first, and then specify the cluster | **Example** ```yaml apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: server-with-pvc namespace: default spec: components: - name: express-server type: webservice properties: image: crccheck/hello-world port: 8000 volumes: - name: "my-pvc" type: "pvc" mountPath: "/test" claimName: "myclaim" workflow: steps: - name: apply-pvc type: apply-object properties: # Kubernetes native resources fields value: apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myclaim namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 8Gi storageClassName: standard # the cluster you want to apply the resource to, default is the current cluster cluster: - name: apply-server type: apply-component properties: component: express-serve ``` ## read-object **Overview** Read Kubernetes native resources, you need to upgrade to KubeVela v1.1.6 or higher to enable `read-object`. **Parameters** | Name | Type | Description | | :-------: | :----: | :-----------------------------------: | | apiVersion | String | Required, The apiVersion of the resource you want to read | | kind | String | Required, The kind of the resource you want to read | | name | String | Required, The apiVersion of the resource you want to read | | namespace | String | Optional, The namespace of the resource you want to read, defaults to `default` | | cluster | String | Optional, The cluster you want to read the resource from, default is the current cluster. If you want to read resource in different cluster, use `vela cluster join` to join the cluster first, and then specify the cluster | **Example** ```yaml apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: read-object namespace: default spec: components: - name: express-server type: webservice properties: image: crccheck/hello-world port: 8000 workflow: steps: - name: read-object type: read-object outputs: - name: cpu valueFrom: output.value.data["cpu"] - name: memory valueFrom: output.value.data["memory"] properties: apiVersion: v1 kind: ConfigMap name: my-cm-name cluster: