【KubernetesでCI/CD】Tekton Triggerをローカルで試してみる
はじめに
Tektonの中からTekton Triggerにフォーカスして、簡単なパイプラインを実行してみたいと思います。
Tekton Triggerは使えるようになっていることが前提になります。インストール方法は下記で紹介しています。
【KubernetesでCI/CD】Tektonとは
はじめに KubernetesでCI/CDができる**Tektonについてどんなものなのか**、
また、Tektonで作成するKubernetesのカスタムリソースであるTaskとPipelineについては詳しく説明していません。TaskとPipelineについては下記で紹介しています。
【KubernetesでCI/CD】Tekton動かしてみる
はじめに 簡単な例を使って、Tekton Pipelineを動かしてみたいと思います。 Tek
Tekton Triggerとは
Tekton Triggerとは、イベントをトリガーにCI/CDパイプラインを実行できるTektonのコンポーネントです。
イベントからパラメータを読み取り、TaskRunやPipelineRunに渡すことができます。
Tekton Triggerには以下のようなカスタムリソースがあります。
カスタムリソース | 説明 |
---|---|
EventListener | イベントを検知し、トリガーを実行する。 |
TriggerTemplate | TaskRunやPipelineRunなどのトリガーとなるリソースを実行する。 |
TriggerBinding | TriggerTemplate にイベントからのパラメータを渡す。また、 TriggerTemplate 経由でさらにTaskRunやPipelineRunにパラメータを渡すことができる。 |
実際に動かしてみる
実際にTekton Triggerをローカルで動かしてみます。
本来であればGithubなどからwebhookを受信してトリガーを実行するのがよくあるパターンかと思いますが、今回は試しに動かしてみたいだけなのでローカルで完結するようにします。具体的には、curlでリクエストをlocalhostに送信してトリガーを実行させます。
Tekton Triggerの動きをざっくり説明すると、
EventListener
がイベントを検知TriggerBinding
でイベントからパラメータを取得TriggerTemplate
からPipelineを実行
という流れになります。
TaskとPipelineの作成
TaskとPipelineを作成します。
大まかな内容は下記で試したパイプラインと同じものになります。
【KubernetesでCI/CD】Tekton動かしてみる
はじめに 簡単な例を使って、Tekton Pipelineを動かしてみたいと思います。 Tek
唯一異なるのは、イベントから受け取ったパラメータを表示するようにしています。
マニフェストはそれぞれtask-hello.yaml
とtask-goodbye.yaml
とpipeline-hello-goodbye.yaml
で以下のようになります。
1apiVersion: tekton.dev/v1beta1
2kind: Task
3metadata:
4 name: hello
5spec:
6 params:
7 - name: username
8 type: string
9 description: param from pipeline
10 steps:
11 - name: hello
12 image: ubuntu
13 command:
14 - echo
15 args:
16 - $(params.username)
17 - "Hello World!"
1apiVersion: tekton.dev/v1beta1
2kind: Task
3metadata:
4 name: goodbye
5spec:
6 steps:
7 - name: goodbye
8 image: ubuntu
9 script: |
10 #!/bin/bash
11 echo "Goodbye World!"
1apiVersion: tekton.dev/v1beta1
2kind: Pipeline
3metadata:
4 name: hello-goodbye
5spec:
6 params:
7 - name: username
8 type: string
9 description: param from pipelinerun
10 tasks:
11 - name: hello
12 params:
13 - name: username
14 value: $(params.username)
15 taskRef:
16 name: hello
17 - name: goodbye
18 runAfter:
19 - hello
20 taskRef:
21 name: goodbye
マニフェストを反映します。
1❯ kubectl apply -f task-hello.yaml
2task.tekton.dev/hello configured
3
4
5❯ kubectl apply -f task-goodbye.yaml
6task.tekton.dev/goodbye configured
7
8
9❯ kubectl apply -f pipeline-hello-goodbye.yaml
10pipeline.tekton.dev/hello-goodbye configured
TriggerTemplateの作成
PipelineRunを実行するTriggerTemplateを作成します。
TriggerTemplateでは実行するPipelineRunを指定します。
マニフェストhello-goodbye-pipeline-template.yaml
は以下の通りです。ここでは、TriggerBindingから受け取るパラメータusername
とPipelineに渡すパラメータusername
を指定しています。
1apiVersion: triggers.tekton.dev/v1alpha1
2kind: TriggerTemplate
3metadata:
4 name: hello-goodbye-pipeline-template
5spec:
6 params:
7 - name: username
8 resourcetemplates:
9 - apiVersion: tekton.dev/v1beta1
10 kind: PipelineRun
11 metadata:
12 generateName: hello-goodbye-run-
13 spec:
14 params:
15 - name: username
16 value: $(tt.params.username)
17 pipelineRef:
18 name: hello-goodbye
マニフェストを反映します。
1❯ kubectl apply -f hello-goodbye-pipeline-template.yaml
2triggertemplate.triggers.tekton.dev/hello-goodbye-pipeline-template created
作成したTriggerTemplateを確認してみます。
1❯ tkn triggertemplate describe hello-goodbye-pipeline-template
2Name: hello-goodbye-pipeline-template
3Namespace: default
4
5⚓ Params
6
7 NAME DESCRIPTION DEFAULT VALUE
8 ∙ username ---
9
10📦 ResourceTemplates
11
12 NAME GENERATENAME KIND APIVERSION
13 ∙ --- hello-goodbye-run- PipelineRun tekton.dev/v1beta1
TriggerBindingの作成
イベントからのパラメータをTriggerTemplateに渡す役割をするTriggerBindingを作成します。
マニフェストhello-goodbye-pipeline-binding.yaml
は以下の通りです。body.username
でパラメータを抽出しています。
1apiVersion: triggers.tekton.dev/v1alpha1
2kind: TriggerBinding
3metadata:
4 name: hello-goodbye-pipeline-binding
5spec:
6 params:
7 - name: username
8 value: $(body.username)
マニフェストを反映します。
1❯ kubectl apply -f hello-goodbye-pipeline-binding.yaml
2triggerbinding.triggers.tekton.dev/hello-goodbye-pipeline-binding created
EventListenerの作成
イベントを検知するEventListenerを作成します。
まずはEventListenerで利用するServiceAccountを作成しておきます。
1apiVersion: v1
2kind: ServiceAccount
3metadata:
4 name: tekton-triggers-example-sa
5---
6apiVersion: rbac.authorization.k8s.io/v1
7kind: RoleBinding
8metadata:
9 name: triggers-example-eventlistener-binding
10subjects:
11- kind: ServiceAccount
12 name: tekton-triggers-example-sa
13roleRef:
14 apiGroup: rbac.authorization.k8s.io
15 kind: ClusterRole
16 name: tekton-triggers-eventlistener-roles
17---
18apiVersion: rbac.authorization.k8s.io/v1
19kind: ClusterRoleBinding
20metadata:
21 name: triggers-example-eventlistener-clusterbinding
22subjects:
23- kind: ServiceAccount
24 name: tekton-triggers-example-sa
25 namespace: default
26roleRef:
27 apiGroup: rbac.authorization.k8s.io
28 kind: ClusterRole
29 name: tekton-triggers-eventlistener-clusterroles
1❯ kubectl apply -f rbac.yaml
2serviceaccount/tekton-triggers-example-sa created
3rolebinding.rbac.authorization.k8s.io/triggers-example-eventlistener-binding created
4clusterrolebinding.rbac.authorization.k8s.io/triggers-example-eventlistener-clusterbinding created
EventListenerのマニフェストhello-goodbye-listener.yaml
は下記の通りです。トリガーで必要なTriggerBindingとTriggerTemplateを指定しています。
1apiVersion: triggers.tekton.dev/v1alpha1
2kind: EventListener
3metadata:
4 name: hello-goodbye-listener
5spec:
6 serviceAccountName: tekton-triggers-example-sa
7 triggers:
8 - name: hello-goodbye-trigger
9 bindings:
10 - ref: hello-goodbye-pipeline-binding
11 template:
12 ref: hello-goodbye-pipeline-template
マニフェストを反映します。
1❯ kubectl apply -f hello-goodbye-listener.yaml
2eventlistener.triggers.tekton.dev/hello-goodbye-listener created
以上で必要なリソースは全て作成できました。
イベントからPipelineの実行
EventListenerにリクエストを送ってパイプラインを実行させたいと思います。
Serviceを確認するとEventListenerが確認できます。
1❯ kubectl get service
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3el-hello-goodbye-listener ClusterIP 10.103.53.88 <none> 8080/TCP,9000/TCP 4m28s
EventListenerのServiceをポートフォワードします。
1❯ kubectl port-forward service/el-hello-goodbye-listener 8080:8080
2Forwarding from 127.0.0.1:8080 -> 8080
3Forwarding from [::1]:8080 -> 8080
curl
でlocalhostにリクエストを送ります。
1❯ curl -X POST -H 'Context-Type: application/json' http://localhost:8080 -d '{"username": "masa"}'
PipelineRunを確認すると新しく実行されているのが確認できます。
1❯ tkn pipelinerun list
2NAME STARTED DURATION STATUS
3hello-goodbye-run-wdjwk 53 seconds ago 15 seconds Succeeded
PipelineRunのログを確認するとリクエストで渡したパラメータが反映されているのが確認できます。
1❯ tkn pipelinerun logs hello-goodbye-run-wdjwk
2[hello : hello] masa Hello World!
3
4[goodbye : goodbye] Goodbye World!
また、下記でEventListenerのログも確認できます。
1❯ tkn eventlistener logs hello-goodbye-listener