Tekton Trigger TriggerTemplate 基础

发布时间 2023-12-05 15:15:46作者: 小吉猫

TriggerTemplate  概述

TriggerTemplate 是一种资源,它指定您想要在 EventListener 检测到事件时实例化和/或执行的资源(例如 TaskRun 或 PipelineRun)的蓝图。它公开了您可以在资源模板中的任何位置使用的参数。

TriggerTemplates 支持的资源

v1alpha1 v1beta1
Pipeline Pipeline
PipelineRun PipelineRun
Task Task
TaskRun TaskRun
ClusterTask ClusterTask
Condition  
PipelineResource

TriggerTemplates 资源规范

TriggerTemplate CRD遵循Kubernetes resource API规范,其spec字段主要由以下两个嵌套字段组成
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: pipeline-template
spec:
  params:                                   # 当前TriggerTemplate的参数,从TriggerBinding接受传值
  - name: gitrevision
    description: The git revision
    default: main
  resourcetemplates:                       # 用于定义资源模板,通常用于定义PipelineRun或TaskRun资源,资源的名称通常要使用generateName定义其前缀,而非使用name直接指定
  - apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      generateName: simple-pipeline-run-
    spec:
      pipelineRef:
        name: simple-pipeline
      params:
      - name: message
        value: $(tt.params.message)        # resourcetemplates中的资源模板中的参数,通过引用TriggerTemplate的参数值完成实例化。引用格式: $(tt.params.<NAME>)。

TriggerTemplates 注意事项

Tekton 将以下标签添加到 TriggerTemplate 内的所有资源模板:

tekton.dev/eventlistenter:<EventListenerName> 帮助进行housekeeping和垃圾收集。
tekton.dev/triggers-eventid:<EventID> 用于跟踪特定事件创建的资源。
为了支持任意资源类型,Tekton 在内部将资源模板解析为字节 blob。因此,Tekton 仅在处理事件时而不是在创建 TriggerTemplate 时验证这些资源。因此,您只能在 TriggerTemplate 中指定 Tekton 资源。
从 Tekton Pipelines 0.8.0 开始,您可以将资源定义直接嵌入到 TriggerTemplate 定义中。为了防止创建和使用资源之间出现竞争条件,您必须将每个资源定义嵌入到使用该资源的 PipelineRun 或 TaskRun 中
$(uid) 变量对于您在 TriggerTemplate 中指定的资源模板隐式可用,具有随机值,就像 KubernetesgenerateName 元数据字段生成的后缀一样。这对于使用内部引用的资源模板非常有用。

TriggerTemplates Parameters

TriggerTemplate 允许您声明由关联的 TriggerBinding 和/或 EventListener 提供的参数,如下所示:
在 TriggerTemplate 定义的 params 部分中声明您的参数。
您必须指定名称,并且可以选择指定描述和默认值。
如果 Tekton 在关联的 TriggerBinding 中找不到相应的值,或者无法成功从 HTTP 标头或正文负载中提取该值,则它会为 TriggerTemplate 的 params 数组中的每个条目应用默认字段的值。
可以在 TriggerTemplate 的资源模板部分中引用 tt.params 以使 TriggerTemplate 可重用。
当您在资源模板定义中指定参数时,Tekton 会将指定的字符串替换为参数名称,例如 $(tt.params.name)。因此,简单的字符串和数值替换可以直接在 YAML 文件中正常工作。但是,如果字符串具有数字前缀,例如 123abcd,Tekton 可能会将其误解为数字并引发错误。在这种情况下,请将受影响的参数键用引号 (") 括起来。

TriggerTemplates JSON 对象

Tekton 不再将引号 (") 替换为转义引号 (\"),并且不对资源模板中的变量执行任何转义。如果您将 JSON 对象作为变量嵌入到模板中,则不得用引号 (") 将它们括起来。如果您有使用转义引号的现有 TriggerTemplate,请添加注释来解决此行为更改。

JSON 对象

{
  "title": "this is \"demo\" body",
  "object": {
    "name": "testing"
  }
}
如果您的 TriggerBinding 引用 $(body.title),那么 Tekton 将其作为this is a \"demo\" body插入到您的 TriggerTemplate 中。要解决此问题,请按如下方式注释 TriggerTemplate
apiVersion: triggers.tekton.dev/v1alpha1
kind: TriggerTemplate
metadata:
  name: escaped-tt
  annotations:
    triggers.tekton.dev/old-escape-quotes: "true"
spec:
  params:
  - name: title
    description: The title from the incoming body
这样,Tekton 将值作为 this is a \""demo\"" body 传递,这本身不是有效的 JSON 代码;但是,如果您在资源模板中使用带有 $(body.object) 的值,并专门将其作为带引号的字符串传递,则此解决方法将恢复正常操作。这对于解析命令中包含 JSON 代码的字符串也很有用。

TriggerTemplate 示例

 

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: pipeline-template
spec:
  params:
  - name: gitrevision
    description: The git revision
    default: main
  - name: gitrepositoryurl
    description: The git repository url
  - name: message
    description: The message to print
    default: This is the default message
  - name: contenttype
    description: The Content-Type of the event
  resourcetemplates:
  - apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      generateName: simple-pipeline-run-
    spec:
      pipelineRef:
        name: simple-pipeline
      params:
      - name: message
        value: $(tt.params.message)
      - name: contenttype
        value: $(tt.params.contenttype)
      - name: git-revision
        value: $(tt.params.gitrevision)
      - name: git-url
        value: $(tt.params.gitrepositoryurl)
      workspaces:
      - name: git-source
        emptyDir: {}

参考文档

https://tekton.dev/docs/triggers/triggertemplates/