【KubernetesでCI/CD】Tekton Triggerをローカルで試してみる

2021.11.18
2024.03.24
CI/CD
TektonTekton Trigger

はじめに

Tektonの中からTekton Triggerにフォーカスして、簡単なパイプラインを実行してみたいと思います。

Tekton Triggerは使えるようになっていることが前提になります。インストール方法は下記で紹介しています。

【KubernetesでCI/CD】Tektonとは

【KubernetesでCI/CD】Tektonとは

はじめに KubernetesでCI/CDができる**Tektonについてどんなものなのか**、

また、Tektonで作成するKubernetesのカスタムリソースであるTaskとPipelineについては詳しく説明していません。TaskとPipelineについては下記で紹介しています。

unknown link

Tekton Triggerとは

Tekton Triggerとは、イベントをトリガーにCI/CDパイプラインを実行できるTektonのコンポーネントです。

イベントからパラメータを読み取り、TaskRunやPipelineRunに渡すことができます。

Tekton Triggerには以下のようなカスタムリソースがあります。

カスタムリソース説明
EventListenerイベントを検知し、トリガーを実行する。
TriggerTemplateTaskRunやPipelineRunなどのトリガーとなるリソースを実行する。
TriggerBindingTriggerTemplateにイベントからのパラメータを渡す。
また、TriggerTemplate経由でさらにTaskRunやPipelineRunにパラメータを渡すことができる。

実際に動かしてみる

実際にTekton Triggerをローカルで動かしてみます。

本来であればGithubなどからwebhookを受信してトリガーを実行するのがよくあるパターンかと思いますが、今回は試しに動かしてみたいだけなのでローカルで完結するようにします。具体的には、curlでリクエストをlocalhostに送信してトリガーを実行させます。

Tekton Triggerの動きをざっくり説明すると、

  1. EventListenerがイベントを検知
  2. TriggerBindingでイベントからパラメータを取得
  3. TriggerTemplateからPipelineを実行

という流れになります。

TaskとPipelineの作成

TaskとPipelineを作成します。

大まかな内容は下記で試したパイプラインと同じものになります。

unknown link

唯一異なるのは、イベントから受け取ったパラメータを表示するようにしています。

マニフェストはそれぞれtask-hello.yamltask-goodbye.yamlpipeline-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にリクエストを送ります。

1curl -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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee