CUE 操作符
这个文档介绍在工作流步骤的定义过程中,可以使用的 CUE 操作符。你需要引用 vela/op
包来使用这些操作符。
提示
在阅读本部分之前,请确保你已经了解如何自定义工作流 且学习掌握了 CUE 的基本知识
让该工作流步骤处于等待状态,直到条件被满足。
参数定义
#ConditionalWait: {
// +usage=If continue is false, the step will wait for continue to be true.
continue: bool
// +usage=Optional message that will be shown in workflow step status, note that the message might be override by other actions.
message?: string
}
用法示例
import "vela/op"
myRead: op.#Read & {
value: {
kind: "Deployment"
apiVersion: "apps/v1"
metadata: name: "test-app"
}
}
wait: op.#ConditionalWait & {
continue: myRead.value.status.phase == "running"
}
让该工作流步骤处于失败状态。
参数定义
#Fail: {
// +usage=Optional message that will be shown in workflow step status, note that the message might be override by other actions.
message?: string
}
用法示例
import "vela/op"
fail: op.#Fail & {
message: "error in the step"
}
在该步骤中输出日志,或者配置该步骤的日志来源。如果某个步骤定义中使用了 op.#Log
,那么你可以使用 vela workflow logs <name>
来查看该步骤的日志。
参数定义
#Log: {
// +usage=The data to print in the controller logs
data?: {...} | string
// +usage=The log level of the data
level: *3 | int
// +usage=The log source of this step. You can specify it from a url or resources. Note that if you set source in multiple op.#Log, only the latest one will work
source?: close({
// +usage=Specify the log source url of this step
url: string
}) | close({
// +usage=Specify the log resources of this step
resources?: [...{
// +usage=Specify the name of the resource
name?: string
// +usage=Specify the cluster of the resource
cluster?: string
// +usage=Specify the namespace of the resource
namespace?: string
// +usage=Specify the label selector of the resource
labelSelector?: {...}
}]
})
}
用法示例
import "vela/op"
myLog: op.#Log & {
data: "my custom log"
resources: [{
labelsSelector: {"test-key": "test-value"}
}]
}
往该工作流步骤状态的 Message 中写入信息。
参数定义
#Message: {
// +usage=Optional message that will be shown in workflow step status, note that the message might be override by other actions.
message?: string
}
用法示例
import "vela/op"
msg: op.#Message & {
message: "custom message"
}
用来在 workflow 的上下文中保存或者读取用户定义的数据
参数定义
#DoVar: {
// +usage=The method to call on the variable
method: *"Get" | "Put"
// +usage=The path to the variable
path: string
// +usage=The value of the variable
value?: _
}
用法示例
put: op.ws.#DoVar & {
method: "Put"
path: "foo.score"
value: 100
}
// 用户可以通过get.value拿到上面保存的数据(100)
get: op.ws.#DoVar & {
method: "Get"
path: "foo.score"
}
向指定 URL 发送 HTTP 请求。
参数定义
#HTTPDo: {
// +usage=The method of HTTP request
method: *"GET" | "POST" | "PUT" | "DELETE"
// +usage=The url to request
url: string
// +usage=The request config
request?: {
// +usage=The timeout of this request
timeout?: string
// +usage=The request body
body?: string
// +usage=The header of the request
header?: [string]: string
// +usage=The trailer of the request
trailer?: [string]: string
// +usage=The rate limiter of the request
ratelimiter?: {
limit: int
period: string
}
}
// +usgae=The tls config of the request
tls_config?: secret: string
// +usage=The response of the request will be filled in this field after the action is executed
response: {
// +usage=The body of the response
body: string
// +usage=The header of the response
header?: [string]: [...string]
// +usage=The trailer of the response
trailer?: [string]: [...string]
// +usage=The status code of the response
statusCode: int
}
}
用法示例
import "vela/op"
myRequest: op.#HTTPDo & {
method: "POST"
url: "http://my-url.com"
request: {
body: {
"hello": "body"
}
}
}
向指定 URL 发送 HTTP GET 请求。
参数定义
同 HTTPDo,但是 method
已被指定为 GET。
用法示例
参考 HTTPDo。
向指定 URL 发送 HTTP POST 请求。
参数定义
同 HTTPDo,但是 method
已被指定为 POST。
用法示例
参考 HTTPDo。
向指定 URL 发送 HTTP PUT 请求。
参数定义
同 HTTPDo,但是 method
已被指定为 PUT。
用法示例
参考 HTTPDo。
向指定 URL 发送 HTTP DELETE 请求。
参数定义
同 HTTPDo,但是 method
已被指定为 DELETE。
用法示例
参考 HTTPDo。
发送邮件。
参数定义
#SendEmail {
// +usage=The info of the sender
from: {
// +usage=The address of the sender
address: string
// +usage=The alias of the sender
alias?: string
// +usage=The password of the sender
password: string
// +usage=The host of the sender server
host: string
// +usage=The port of the sender server
port: int
}
// +usgae=The email address list of the recievers
to: [...string]
// +usage=The content of the email
content: {
// +usage=The subject of the email
subject: string
// +usage=The body of the email
body: string
}
}
用法示例
import "vela/op"
myEmail: op.#SendEmail & {
from: {
address: "hello@mail.com"
password: "password"
host: "myhost"
port: 465
}
to: ["world@mail.com", "next@workflow.com"]
content: {
subject: "Hello Vela"
body: "Hello Vela, this is a test email"
}
}
在 Kubernetes 集群中创建或者更新资源。
参数定义
#Apply: {
// +usage=The cluster to use
cluster: *"" | string
// +usage=The resource to apply
value: {...}
}
用法示例
import "vela/op"
myApply: op.#Apply & {
value: {
kind: "Deployment"
apiVersion: "apps/v1"
metadata: name: "test-app"
spec: {
replicas: 2
...
}
}
}
在 Kubernetes 集群中批量创建或者更新资源。
参数定义
#ApplyInParallel: {
// +usage=The cluster to use
cluster: *"" | string
// +usage=The resources to apply in parallel
value: [...{...}]
}
用法示例
import "vela/op"
myApply: op.#ApplyInParallel & {
value: [{
kind: "Deployment"
apiVersion: "apps/v1"
metadata: name: "test-app"
spec: {
replicas: 2
...
}
}, {
kind: "Deployment"
apiVersion: "apps/v1"
metadata: name: "test-app2"
spec: {
replicas: 2
...
}
}]
}
在 Kubernetes 集群中读取资源。
参数定义
#Read: {
// +usage=The cluster to use
cluster: *"" | string
// +usage=The resource to read, this field will be filled with the resource read from the cluster after the action is executed
value?: {...}
...
}
用法示例
import "vela/op"
myRead: op.#Read & {
value: {
kind: "Deployment"
apiVersion: "apps/v1"
metadata: name: "test-app"
}
}
在 Kubernetes 集群中列出资源。
参数定义
#List: {
// +usage=The cluster to use
cluster: *"" | string
// +usage=The resource to list
resource: {
// +usage=The api version of the resource
apiVersion: string
// +usage=The kind of the resource
kind: string
}
// +usage=The filter to list the resources
filter?: {
// +usage=The namespace to list the resources
namespace?: *"" | string
// +usage=The label selector to filter the resources
matchingLabels?: {...}
}
// +usage=The listed resources will be filled in this field after the action is executed
list?: {...}
...
}
用法示例
import "vela/op"
myList: op.#List & {
resource: {
kind: "Deployment"
apiVersion: "apps/v1"
}
filter: {
matchingLabels: {
"mylabel": "myvalue"
}
}
}
在 Kubernetes 集群中删除资源。
参数定义
#Delete: {
// +usage=The cluster to use
cluster: *"" | string
// +usage=The resource to delete
value: {
// +usage=The api version of the resource
apiVersion: string
// +usage=The kind of the resource
kind: string
// +usage=The metadata of the resource
metadata: {
// +usage=The name of the resource
name?: string
// +usage=The namespace of the resource
namespace: *"default" | string
}
}
// +usage=The filter to delete the resources
filter?: {
// +usage=The namespace to list the resources
namespace?: string
// +usage=The label selector to filter the resources
matchingLabels?: {...}
}
}
用法示例
import "vela/op"
myDelete: op.#Delete & {
resource: {
kind: "Deployment"
apiVersion: "apps/v1"
metadata: name: "my-app"
}
}
获取当前应用部署计划中所有组件对应的资源数据。
参数定义
#Load: {
// +usage=If specify `app`, use specified application to load its component resources otherwise use current application
app?: string
// +usage=The value of the components will be filled in this field after the action is executed, you can use value[componentName] to refer a specified component
value?: {...}
}
用法示例
import "vela/op"
// 该操作完成后,你可以使用 `load.value[componentName]` 来获取到对应组件的资源数据
load: op.#Load & {}
mycomp: load.value["my-comp"]
在 Kubernetes 集群中创建或者更新组件对应的所有资源。注意,在使用该操作前需要先用 Load
加载资源。
参数定义
#ApplyComponent: {
// +usage=The cluster to use
cluster: *"" | string
// +usage=The env to use
env: *"" | string
// +usage=The namespace to apply
namespace: *"" | string
// +usage=Whether to wait healthy of the applied component
waitHealthy: *true | bool
// +usage=The value of the component resource
value: {...}
// +usage=The patcher that will be applied to the resource, you can define the strategy of list merge through comments. Reference doc here: https://kubevela.io/docs/platform-engineers/traits/patch-trait#patch-in-workflow-step
patch?: {...}
}
用法示例
import "vela/op"
load: op.#Load & {}
apply: op.#ApplyComponent & {
value: load.value["my-comp"]
}
在 Kubernetes 集群中创建或者更新应用对应的所有资源。
参数定义
#ApplyApplication: {}
用法示例
import "vela/op"
apply: op.#ApplyApplication & {}
用于一组操作的组合,可以用于实现复杂的操作逻辑。
参数定义
#Steps: {}
用法示例
import "vela/op"
env: "prod"
app: op.#Steps & {
if env == "prod" {
load: op.#Load & {
component: "component-name"
}
apply: op.#Apply & {
value: load.value.workload
}
}
if env != "prod" {
request: op.#HTTPGet & {
url: "http://my-url.com"
}
}
}
向指定 Slack URL 发送请求。#Slack
实际上是对 #HTTPPost
的二次封装,我们将在下个版本废弃这个操作。你可以使用 #HTTPPost
替代,如:
import (
"vela/op"
"encoding/json"
)
message: {
"hello": "world"
}
mySlack: op.#HTTPPost & {
url: "slackURL"
request: {
body: json.Marshal(message)
header: "Content-Type": "application/json"
}
}
参数定义
#Slack: {
message: {...}
slackUrl: string
}
用法示例
import "vela/op"
myMessage: {
"hello": "world"
}
myRequest: op.#Slack & {
message: myMessage
slackUrl: "slackURL"
}
向指定 DingTalk URL 发送请求。#DingTalk
实际上是对 #HTTPPost
的二次封装,我们将在下个版本废弃这个操作。你可以使用 #HTTPPost
替代,请参考 Slack 操作中的例子。
参数定义
#DingTalk: {
message: {...}
dingUrl: string
}
用法示例
import "vela/op"
myMessage: {
"hello": "world"
}
myRequest: op.#DingTalk & {
message: myMessage
dingUrl: "dingURL"
}
向指定 Lark URL 发送请求。#Lark
实际上是对 #HTTPPost
的二次封装,我们将在下个版本废弃这个操作。你可以使用 #HTTPPost
替代,请参考 Slack 操作中的例子。
参数定义
#Lark: {
message: {...}
larkUrl: string
}
用法示例
import "vela/op"
myMessage: {
"hello": "world"
}
myRequest: op.#Lark & {
message: myMessage
larkUrl: "larkURL"
}
Last updated on 2023年8月4日 by Daniel Higuero