10.4.5 自动触发任务
前面我们都是通过手动的方式创建 TaskRun/PipelineRun 触发流水线,本节我们讨论使用 Tekton Trigger 组件通过外部事件自动触发流水线。
外部事件
gitlab、github 的 Webhook 就是一种最常用的外部事件,通过 Trigger 组件监听这部分事件,而从实现在提交代码后自动运行某些任务。
通过 Trigger 构建自动流水线的流程如图 10-8 所示,它会先启动一个事件监听器 EventListener,然后通过 HTTP 方式暴露服务,接收来自外部事件推送。当接收到外部事件(例如 github push)时:
- 首先会由 Interceptors 进行有效性验证等处理:
- 无效的事件直接丢弃;
- 有效事件交给 TriggerBinding 处理。
- TriggerBinding 负责从事件内容中提取任务对应的参数,然后将参数传递给 TriggerTemplate。
- TriggerTemplate 根据预先定义的模版以及收到的参数创建 TaskRun 或者 PipelineRun 对象。
图 10-8 Tekton 触发任务工作流程 图片来源
接下来,我们配置一个触发器,接收来自 Github 的 Webhook 事件,关联前面定义的 Pipeline,实现代码测试、构建镜像自动化。
1. 创建触发器
使用 Tekton Triggers 之前,先安装对应的组件。
$ kubectl apply --filename https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml
查看 Triggers 组件安装状态,确定是否为 Running 状态。
$ kubectl get pods --namespace tekton-pipelines
NAME READY STATUS RESTARTS AGE
tekton-dashboard-69656879d9-7bbkl 1/1 Running 0 2d6h
tekton-pipelines-controller-67f4dc98d8-pgxrq 1/1 Running 0 22d
tekton-pipelines-webhook-59df55445c-jw76v 1/1 Running 0 22d
tekton-triggers-controller-779fc9f557-vj6xs 1/1 Running 0 17m
tekton-triggers-webhook-c77f8dbd6-ctmlm 1/1 Running 0 1
创建一个名为 github-listener 的 EventListener 资源对象,文件(github-push-listener.yaml)内容如下所示。
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
name: github-listener
spec:
serviceAccountName: tekton-triggers-github-sa
triggers:
interceptors:
- github:
secretRef: # 引用 github-secret 的 Secret 对象中的 secretToken 的值
secretName: github-secret
secretKey: secretToken
eventTypes:
- Push Hook # 只接收 GitLab Push 事件
- name: github-trigger
bindings:
- ref: github-push-binding
template:
ref: github-push-template
上面定义的 EventListener 用于监听 GitHub 上的 Push 事件,当有 Push 事件发生时,会触发一个名为 github-trigger 的操作,该操作会执行一个名为 github-push-template 的任务模板。在监听之前,会执行一个名为 github 的拦截器,用于验证 GitHub 事件,并使用提供的密钥进行身份验证。
将定义的 EventListener 资源提交到 Kubernetes 集群。
$ kubectl apply -f github-push-listener.yaml
2. 通过 TriggerBinding 提取事件参数
TriggerBinding 通过 $() 包裹的 JSONPath 表达式提取 Github Webhook 发送过来的数据,至于能够提取哪些参数值,你可以在官网帮助查看 github/gitlab 的 WebHook 的说明[1]。
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
name: github-push-binding
spec:
params:
- name: git-revision
value: $(body.checkout_sha)
- name: git-repository-url
value: $(body.repository.git_http_url)
接下在 TriggerTemplate 对象中通过参数来读取上面 TriggerBinding 中定义的参数值了。
3. 接收参数并关联 PipelineRun
定义一个如下所示的 TriggerTemplate 对象,声明一个 TaskRun 的模板。
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
name: github-pipeline-template
spec:
params: # 定义参数,和 TriggerBinding 中的保持一致
- name: repo
resourcetemplates:
- apiVersion: tekton.dev/v1beta1
kind: PipelineRun # 定义 PipelineRun 模板
metadata:
generateName: github-pipeline-run- # PipelineRun 名称前缀
spec:
pipelineRef:
name: github-pipeline
params:
- name: repo
value: $(tt.params.git-repository-url)
注意
TriggerTemplate 里的 Pipeline 也要使用 generateName,否则名字相同、内容也相同的 PipelineRun 就会被忽略掉。
提交到 Kubernetes 集群。
$ kubectl apply -f trigger-binding.yaml
4. 通过 Ingress 暴露服务
EventListener 创建完成后会生成一个名为 el-gitlab-listener 的 Service 对外暴露用于接收事件响应。我们通过 Ingress 对象绑定 tekton-trigger.thebyte.com.cn 将服务暴露到外网,yaml 文件内容如下(el-gitlab-listener.yaml)。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-wildcard-host
spec:
rules:
- host: "tekton-trigger.thebyte.com.cn"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: el-gitlab-listener
port:
number: 8080
提交到 Kubernetes 集群。
$ kubectl apply -f el-gitlab-listener.yaml
5. 设置 Github Webhook
上面我们已经设置完 EventListener,下面我们在 github 中为仓库设置 Webhook,如图 10-9 所示,填写 Playload Url、Secret 等信息。
图 10-9 设置 Github Webhook
配置完之后,推送代码,Github 将产生一个 Webhook 事件,请求 tekton-trigger.thebyte.com.cn,然后触发我们定义的流水线。
参见 https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#push-events ↩︎