使用 CEL 创建条件式管道

使用 CEL 控制 Tekton 中自动化构建的发生时机。
1 位读者喜欢这篇文章。
Plumbing tubes in many directions

您刚刚按照指南操作,以便在您的 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 类型之间的映射。

标签
Avatar
我是 Red Hat 的一名软件工程师,致力于使用云原生开源技术的 CI/CD 和自动化。

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.