TriggerTemplate

TriggerTemplate 是 Tekton Triggers 中的一个强大组件,用于定义在检测到事件时应创建的资源蓝图。它充当事件驱动流水线的动作部分,明确指定应针对事件实例化哪些 Kubernetes 资源(通常是 TaskRuns 或 PipelineRuns)。

目录

术语说明

术语说明
TriggerTemplateTekton 资源,定义在检测到事件时应创建哪些资源。
ResourceTemplate在 TriggerTemplate 中定义的 Kubernetes 资源规范,用于创建资源。
ParameterTriggerTemplate 中的变量,可通过 TriggerBindings 从事件负载中填充数据。
$(tt.params.x)用于在资源模板中引用参数的语法。
generateNameKubernetes 元数据字段,通过添加随机后缀创建唯一名称的资源。

为什么需要 TriggerTemplate

事件驱动资源创建的挑战

在响应外部事件的 CI/CD 系统中,创建资源时会遇到以下挑战:

  1. 动态资源创建:需要根据每个事件的具体信息创建资源,如流水线运行。
  2. 参数化:不同事件需要传递不同参数给流水线。
  3. 可复用性:相同的资源创建模式常常需要在多个事件中复用。
  4. 模板化:为每种事件类型手动创建资源容易出错且难以扩展。

如果没有 TriggerTemplates,解决这些问题将需要:

  • 为每个事件编写自定义脚本生成 Kubernetes 资源
  • 处理复杂的参数替换逻辑
  • 在不同事件处理器中重复定义资源
  • 手动同步事件数据与资源创建

TriggerTemplate 如何解决这些问题

TriggerTemplate 提供了一种声明式、Kubernetes 原生的方式来:

  1. 定义资源蓝图:明确指定事件发生时应创建哪些资源。
  2. 参数化资源:使用从事件中提取的参数定制资源。
  3. 保证一致性:对类似事件以相同结构创建资源。
  4. 职责分离:将事件检测(EventListener)和数据提取(TriggerBinding)与资源创建解耦。
  5. 支持复用:定义一次模板,多处触发器复用。

这种方法为事件检测后的动作定义提供了清晰、声明式的方式,使 CI/CD 系统更易维护和扩展。

优势

  • 声明式定义:使用 Kubernetes 原生 YAML 定义要创建的资源
  • 参数化:动态使用事件数据定制资源
  • 复用性:模板定义一次,多触发器复用
  • 职责分离:事件检测、数据提取与资源创建清晰分离
  • 默认值支持:为可能缺失的参数提供默认值
  • 动态命名:生成唯一命名资源避免冲突
  • 多资源支持:单个事件可创建多个资源
  • 资源校验:资源在运行时创建前进行校验

适用场景

TriggerTemplates 在以下场景中至关重要:

  1. 自动化 CI/CD 流水线:代码推送或拉取请求开启时自动创建流水线运行。
  2. 多环境部署:使用相同模板,通过不同参数部署到不同环境。
  3. 事件驱动工作流:响应外部系统事件(如问题更新、监控告警)创建资源。
  4. 动态资源创建:根据事件特定参数(如提交 ID、分支名)生成资源。
  5. 参数化测试:基于事件类型创建不同参数的测试流水线。
  6. 作为运行时配置模板:为重复执行的 Pipelines 提供标准化运行时配置(参数、工作区、安全上下文等),用户可通过前端 UI 选择匹配模板快速生成符合场景需求的 pipelinerun 实例。

约束与限制

  • TriggerTemplates 中的参数只能是字符串类型
  • 使用 JSON 对象作为参数时需谨慎处理
  • 资源校验发生在运行时,而非创建时
  • 默认服务账户权限可能需扩展以支持非 Tekton 资源
  • 嵌入资源必须包含在使用它们的 PipelineRun 或 TaskRun 中
  • 带数字前缀的参数名需特殊处理

原则

TriggerTemplate 结构

TriggerTemplate 主要包含两个部分:

  1. 参数定义:声明可在资源模板中使用的参数
  2. 资源模板:定义要创建的 Kubernetes 资源
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: example-template
spec:
  params:
    - name: param1
      description: 参数 1 的描述
      default: default-value  # 可选默认值
  resourcetemplates:
    - apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        generateName: example-pipeline-run-
      spec:
        pipelineRef:
          name: example-pipeline
        params:
          - name: pipeline-param
            value: $(tt.params.param1)

参数处理

TriggerTemplates 中参数遵循以下原则:

  1. 声明:必须在 params 部分声明参数名,且可选描述和默认值。
  2. 引用:在资源模板中通过 $(tt.params.parameter-name) 语法引用参数。
  3. 默认值:若 TriggerBinding 未提供参数,则使用默认值(如有)。
  4. 字符串值:所有参数值均视为字符串,即使表示数字或 JSON 对象。
  5. 特殊字符:带数字前缀或特殊字符的参数在资源模板中可能需加引号。

资源模板创建流程

事件被检测和处理时:

  1. EventListener 接收事件
  2. 拦截器(如配置)处理和过滤事件
  3. TriggerBindings 从事件中提取数据
  4. TriggerTemplate 接收提取的参数
  5. 在资源模板中进行参数替换
  6. 创建带替换值的 Kubernetes 资源

每个创建的资源都会带有以下标签以追踪来源:

  • tekton.dev/eventlistener: <EventListenerName>
  • tekton.dev/triggers-eventid: <EventID>

运行时配置模板

  1. 标签约定
  • triggertemplate.triggers.tekton.dev/usage: runtime-config

    必须设置为 runtime-config,以标识模板用途。

  • tekton.dev/pipeline: <pipeline-name>

    关联模板到特定流水线。

  • triggertemplate.triggers.tekton.dev/runtime-config-default: "true"

    可选,标记模板为流水线的默认配置;若存在多个默认模板,则选择创建时间最新的。

  1. 资源模板约定
  • spec.resourcetemplates 中只能定义一个 PipelineRun 资源。
  • 必须包含 pipelineRef 引用目标流水线。
  • 支持 PipelineRun 的所有运行时配置字段,如 paramsworkspacespodTemplate 等。

配置示例

基础 CI 流水线模板

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: ci-pipeline-template
spec:
  params:
    - name: git-revision
      description: Git 提交 SHA
    - name: git-repo-url
      description: Git 仓库 URL
    - name: git-repo-name
      description: Git 仓库名称
  resourcetemplates:
    - apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        generateName: $(tt.params.git-repo-name)-ci-
      spec:
        pipelineRef:
          name: ci-pipeline
        params:
          - name: revision
            value: $(tt.params.git-revision)
          - name: repo-url
            value: $(tt.params.git-repo-url)
        workspaces:
          - name: source
            emptyDir: {}

多环境部署模板

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: deploy-template
spec:
  params:
    - name: environment
      description: 部署环境
      default: development
    - name: image-tag
      description: 部署的镜像标签
    - name: app-name
      description: 应用名称
  resourcetemplates:
    - apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        generateName: deploy-$(tt.params.app-name)-$(tt.params.environment)-
      spec:
        pipelineRef:
          name: deployment-pipeline
        params:
          - name: target-environment
            value: $(tt.params.environment)
          - name: image-tag
            value: $(tt.params.image-tag)
          - name: application
            value: $(tt.params.app-name)

多资源模板示例

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: multi-resource-template
spec:
  params:
    - name: git-revision
      description: Git 提交 SHA
  resourcetemplates:
    - apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        generateName: build-pipeline-
      spec:
        pipelineRef:
          name: build-pipeline
        params:
          - name: revision
            value: $(tt.params.git-revision)
    - apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        generateName: test-pipeline-
      spec:
        pipelineRef:
          name: test-pipeline
        params:
          - name: revision
            value: $(tt.params.git-revision)

运行时配置模板示例

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: deploy-pipeline-staging-config
  labels:
    triggertemplate.triggers.tekton.dev/usage: runtime-config
    tekton.dev/pipeline: deploy-pipeline
    triggertemplate.triggers.tekton.dev/runtime-config-default: true
spec:
  resourcetemplates:
    - apiVersion: tekton.dev/v1
      kind: PipelineRun
      metadata:
        generateName: deploy-pipeline-staging-
      spec:
        pipelineRef:
          name: deploy-pipeline
        params:
          - name: environment
            value: "staging"
          - name: replicas
            value: "2"
        workspaces:
          - name: config
            configMap:
              name: staging-config

与 TriggerTemplate 相关的重要参数说明

参数替换

参数替换是 TriggerTemplates 动态和可复用的核心机制。

适用场景

  • 将提交 SHA 插入 PipelineRuns
  • 在流水线参数中使用仓库 URL 和分支名
  • 向流水线传递事件元数据
  • 使用事件特定信息定制资源名称

约束与限制

  • 仅支持字符串值
  • JSON 对象需特殊处理
  • 带数字前缀的参数可能需加引号

原则/参数说明

参数替换语法为 $(tt.params.parameter-name),其中 parameter-name 是 TriggerTemplate params 部分定义的参数名。

例如:

params:
  - name: git-revision
    description: Git 提交 SHA
resourcetemplates:
  - apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    spec:
      params:
        - name: revision
          value: $(tt.params.git-revision)

JSON 处理

在 TriggerTemplates 中处理 JSON 数据时需注意特殊事项。

适用场景

  • 向流水线传递复杂数据结构
  • 处理包含嵌套 JSON 的 webhook 负载
  • 创建需要 JSON 配置的资源

约束与限制

  • JSON 对象必须作为字符串处理
  • 引号转义较为复杂
  • 旧模板可能需特殊注解支持

原则/参数说明

处理 JSON 对象时:

  1. 在资源模板中使用 JSON 参数时,不要加引号包裹。
  2. 对于需要转义引号的旧模板,添加注解:
    metadata:
      annotations:
        triggers.tekton.dev/old-escape-quotes: "true"

参考资料