您刚刚按照指南操作,以便在您的 GitLab 项目上创建或更新合并请求时启动您的 Tekton 管道(或任务)。因此,您配置了 GitLab 以将合并请求事件作为 webhook 发送。并且您部署了一些 Tekton 组件
- EventListener:接收来自 GitLab 的 webhook
- Trigger:每次 EventListener 从 GitLab 接收到新的 webhook 时启动您的 Pipeline
- Pipeline:从 GitLab 获取源代码并构建它
然后您注意到合并请求中的任何事件(新评论、标签更改)都会触发管道。这不是您期望的行为。毕竟,您不需要构建评论或标签。您只希望在有实际新代码要构建时才运行管道。以下是我如何使用 Tekton 的 CEL 拦截器为我的管道创建条件的方法。
准备好您的触发器
我希望您已经定义了一个触发器。它可能类似于下面的代码片段。
触发器的拦截器拒绝任何不是来自合并请求的内容。尽管如此,拦截器仍然无法区分代码和非代码更新(例如新评论)。
apiVersion: triggers.tekton.dev/v1beta1
kind: Trigger
metadata:
name: webhook-listener-trigger
spec:
interceptors:
# reject any payload that's not a merge request webhook
- name: "filter-event-types"
ref:
name: "gitlab"
kind: ClusterInterceptor
params:
- name: eventTypes
value:
- "Merge Request Hook"
bindings:
- ref: binding
template:
ref: template
添加 CEL 拦截器
cel
拦截器来了。此拦截器使用 CEL 表达式语言过滤 webhook 有效负载。如果过滤器表达式的计算结果为 true
,则管道启动。
在这里,我检查 webhook 有效负载的 JSON 正文中是否存在 object_attributes.oldrev
字段。如果 object_attributes.oldrev
存在,则意味着此事件是关于代码更改的。如果没有代码更改,则没有先前的修订 (oldrev
) 可以参考。
spec:
interceptors:
- name: "allow-code-changes-only"
ref:
name: cel
kind: ClusterInterceptor
params:
- name: filter
value: >
has(body.object_attributes.oldrev)
将新的拦截器添加到您的触发器。现在您的触发器看起来像这样
apiVersion: triggers.tekton.dev/v1beta1
kind: Trigger
metadata:
name: gitlab-listener-trigger
spec:
interceptors:
- name: "verify-gitlab-payload"
ref:
name: "gitlab"
kind: ClusterInterceptor
params:
- name: eventTypes
value:
- "Merge Request Hook"
- name: "allow-code-changes-only"
ref:
name: "cel"
kind: ClusterInterceptor
params:
- name: filter
value: >
has(body.object_attributes.oldrev)
bindings:
- ref: binding
template:
ref: template
部署这个新版本的触发器,享受自动化的力量。从现在开始,只有在有新代码要构建时,您的管道才会启动。
提示
您可以在 CEL 过滤器中设置的条件没有限制。
您可以检查合并请求当前是否已打开
body.object_attributes.state in ['opened']
您可以确保贡献者完成了他们在代码上的工作
body.object_attributes.work_in_progress == false
您只需要正确地连接多个条件
- name: filter
value: >
has(body.object_attributes.oldrev) &&
body.object_attributes.state in ['opened'] &&
body.object_attributes.work_in_progress == false
查看 合并请求事件 文档,从中获得启发来编写您自己的条件。
您可能需要 CEL 语言定义 来了解如何将您的想法转化为代码。
要评估字符串以外的类型,您需要了解 JSON 和 CEL 类型之间的映射。
评论已关闭。