Interceptor
Interceptor 是 Tekton Triggers 中一个强大的组件,用于在事件数据到达 TriggerBindings 和 TriggerTemplates 之前进行处理和过滤。它充当传入 webhook 事件的守门员和转换器,允许你验证、过滤和修改事件数据,确保只有相关事件触发你的流水线。
目录
术语说明
我们为什么需要 Interceptors
事件处理的挑战
在响应外部事件的 CI/CD 系统中,会遇到以下几个挑战:
- 事件验证:需要验证外部 webhook,确保其来自可信来源。
- 事件过滤:并非所有事件都应触发流水线,需要根据事件类型或内容进行过滤。
- 数据转换:原始 webhook 负载通常包含多余数据或需要重构。
- 安全问题:如果没有适当验证,webhook 端点可能容易被滥用。
如果没有 Interceptors,解决这些问题需要:
- 针对每个 webhook 源编写自定义验证代码
- 在流水线定义中嵌入复杂逻辑
- 在脚本中手动过滤和转换数据
- 为每个集成单独实现安全机制
Interceptors 如何解决这些问题
Interceptors 提供了一种标准化、声明式的方法来:
- 验证事件:验证 webhook 签名和令牌,确保真实性。
- 过滤事件:仅处理基于类型、内容或其他条件的相关事件。
- 转换数据:提取、修改或添加数据,使其更适合流水线使用。
- 增强安全性:在所有 webhook 集成中实施一致的安全策略。
- 模块化逻辑:将事件处理逻辑与流水线执行分离。
这种方法实现了事件接收、处理和流水线执行之间的清晰分离,使你的 CI/CD 系统更易维护且更安全。
优势
- 增强安全性:在处理前验证 webhook 的真实性
- 降低流水线复杂度:将过滤和转换逻辑移出流水线
- 标准化处理:对不同来源的事件进行一致处理
- 灵活性:可串联多个 interceptor 以满足复杂处理需求
- 可扩展性:可创建自定义 interceptor 以实现特殊处理需求
- 可复用性:定义一次 interceptor,可在多个触发器中复用
- 声明式配置:使用 Kubernetes 资源配置事件处理
适用场景
Interceptor 在以下场景中至关重要:
-
安全的 webhook 处理:需要验证 webhook 事件来自可信来源时。
-
条件流水线执行:仅在特定事件类型或内容(如仅针对 main 分支的 push 事件)触发流水线时。
-
数据丰富:需要添加计算值或从复杂事件负载中提取特定数据时。
-
多源集成:集成多个 webhook 提供商(GitHub、GitLab、Bitbucket)并实现一致处理时。
-
自定义事件处理:实现标准 interceptor 之外的特殊事件处理逻辑时。
约束与限制
- Interceptor 会增加事件处理的开销
- 复杂的 CEL 表达式可能难以调试
- 自定义 interceptor 需要额外的部署和管理
- 推荐使用 HTTPS,HTTP 支持将在未来版本中移除
- Interceptor 必须妥善保护以防止未授权访问
原则
Interceptor 架构
Interceptor 位于 EventListener 和 Trigger 处理流水线之间:
- EventListener 接收 webhook 事件
- Interceptors 处理并过滤事件
- TriggerBindings 从处理后的事件中提取数据
- TriggerTemplates 使用提取的数据创建资源
Interceptor 可以串联,每个 interceptor 接收前一个的输出,实现复杂的处理流水线,每个 interceptor 执行特定功能。
Interceptor 类型
Tekton Triggers 支持两种 interceptor 实现:
-
独立 Interceptor:作为独立的 Kubernetes 服务实现
- Interceptor:命名空间范围的自定义资源
- ClusterInterceptor:集群范围的自定义资源
- 更灵活且易于扩展
- 可用任何支持 HTTP 服务的语言实现
-
内置 Interceptor:包含在 EventListener Pod 中
- GitHub、GitLab、Bitbucket、CEL 等
- 保留以兼容旧版本
- 使用简单但扩展性较差
Interceptor 结构
一个基本的 Interceptor 资源结构如下:
在 Trigger 中引用示例:
配置示例
GitHub Interceptor 示例
GitLab Interceptor 结合 CEL 示例
自定义 Interceptor 示例
-
创建自定义 interceptor 的 Deployment:
-
创建自定义 interceptor 的 Service:
-
注册自定义 interceptor:
与 Interceptor 相关的重要参数说明
CEL 表达式
CEL(Common Expression Language)是 CEL interceptor 中用于过滤和转换事件数据的强大工具。
适用场景
- 基于复杂条件过滤事件
- 从事件负载中提取特定数据
- 基于现有数据创建新字段
- 实现条件逻辑
约束与限制
- 复杂表达式可能难以调试
- 功能受限于 CEL 本身提供的能力
- 非常复杂的表达式可能影响性能
原则/参数说明
常见 CEL 模式:
- 访问 body 字段:
body.repository.full_name - 访问 header 字段:
header.X-GitHub-Event - 字符串操作:
body.ref.split('/')[2] - 条件判断:
body.action in ['opened', 'reopened', 'synchronize'] - 布尔逻辑:
body.pull_request.base.ref == 'main' && body.action == 'opened'
配置示例
HTTPS 配置
建议使用 HTTPS 运行 interceptor 以增强安全性,未来版本将强制要求。
适用场景
- 生产环境
- 处理敏感数据
- 满足安全合规要求
约束与限制
- 需要妥善管理证书
- 相较 HTTP 需要额外配置
原则/参数说明
配置 interceptor 使用 HTTPS:
- 为 interceptor 添加
server/type: https标签 - 提供用于证书验证的 CA bundle
- 确保 interceptor 服务配置为提供 HTTPS 服务