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

はじめに

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

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

【KubernetesでCI/CD】Tektonとは
はじめにKubernetesでCI/CDができるTektonについてどんなものなのか、ローカルで使うために何をしたらいいのかまとめました。ローカル上でKubernetesが動いていることが前提となっています。今回はDocker Desk...

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

【KubernetesでCI/CD】Tekton動かしてみる
はじめに簡単な例を使って、Tekton Pipelineを動かしてみたいと思います。Tektonについては下記を参考にしてください。また、Tekton Pipeline使うまでの準備も紹介しています。本記事では、Tekton Pip...

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を作成します。

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

【KubernetesでCI/CD】Tekton動かしてみる
はじめに簡単な例を使って、Tekton Pipelineを動かしてみたいと思います。Tektonについては下記を参考にしてください。また、Tekton Pipeline使うまでの準備も紹介しています。本記事では、Tekton Pip...

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

マニフェストはそれぞれtask-hello.yamltask-goodbye.yamlpipeline-hello-goodbye.yamlで以下のようになります。

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: hello
spec:
  params:
    - name: username
      type: string
      description: param from pipeline
  steps:
    - name: hello
      image: ubuntu
      command:
        - echo
      args:
        - $(params.username)
        - "Hello World!"
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: goodbye
spec:
  steps:
    - name: goodbye
      image: ubuntu
      script: |
        #!/bin/bash
        echo "Goodbye World!"
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: hello-goodbye
spec:
  params:
    - name: username
      type: string
      description: param from pipelinerun
  tasks:
    - name: hello
      params:
        - name: username
          value: $(params.username)
      taskRef:
        name: hello
    - name: goodbye
      runAfter:
        - hello
      taskRef:
        name: goodbye

マニフェストを反映します。

❯ kubectl apply -f task-hello.yaml
task.tekton.dev/hello configured

❯ kubectl apply -f task-goodbye.yaml
task.tekton.dev/goodbye configured

❯ kubectl apply -f pipeline-hello-goodbye.yaml
pipeline.tekton.dev/hello-goodbye configured

TriggerTemplateの作成

PipelineRunを実行するTriggerTemplateを作成します。

TriggerTemplateでは実行するPipelineRunを指定します。

マニフェストhello-goodbye-pipeline-template.yamlは以下の通りです。ここでは、TriggerBindingから受け取るパラメータusernameとPipelineに渡すパラメータusernameを指定しています。

apiVersion: triggers.tekton.dev/v1alpha1
kind: TriggerTemplate
metadata:
  name: hello-goodbye-pipeline-template
spec:
  params:
    - name: username
  resourcetemplates:
    - apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        generateName: hello-goodbye-run-
      spec:
        params:
          - name: username
            value: $(tt.params.username)
        pipelineRef:
          name: hello-goodbye

マニフェストを反映します。

❯ kubectl apply -f hello-goodbye-pipeline-template.yaml
triggertemplate.triggers.tekton.dev/hello-goodbye-pipeline-template created

作成したTriggerTemplateを確認してみます。

❯ tkn triggertemplate describe hello-goodbye-pipeline-template
Name:        hello-goodbye-pipeline-template
Namespace:   default

⚓ Params

 NAME         DESCRIPTION   DEFAULT VALUE
 ∙ username                 ---

📦 ResourceTemplates

 NAME    GENERATENAME         KIND          APIVERSION
 ∙ ---   hello-goodbye-run-   PipelineRun   tekton.dev/v1beta1

TriggerBindingの作成

イベントからのパラメータをTriggerTemplateに渡す役割をするTriggerBindingを作成します。

マニフェストhello-goodbye-pipeline-binding.yamlは以下の通りです。body.usernameでパラメータを抽出しています。

apiVersion: triggers.tekton.dev/v1alpha1
kind: TriggerBinding
metadata:
  name: hello-goodbye-pipeline-binding
spec:
  params:
    - name: username
      value: $(body.username)

マニフェストを反映します。

❯ kubectl apply -f hello-goodbye-pipeline-binding.yaml
triggerbinding.triggers.tekton.dev/hello-goodbye-pipeline-binding created

EventListenerの作成

イベントを検知するEventListenerを作成します。

まずはEventListenerで利用するServiceAccountを作成しておきます。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tekton-triggers-example-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: triggers-example-eventlistener-binding
subjects:
- kind: ServiceAccount
  name: tekton-triggers-example-sa
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: tekton-triggers-eventlistener-roles
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: triggers-example-eventlistener-clusterbinding
subjects:
- kind: ServiceAccount
  name: tekton-triggers-example-sa
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: tekton-triggers-eventlistener-clusterroles
❯ kubectl apply -f rbac.yaml
serviceaccount/tekton-triggers-example-sa created
rolebinding.rbac.authorization.k8s.io/triggers-example-eventlistener-binding created
clusterrolebinding.rbac.authorization.k8s.io/triggers-example-eventlistener-clusterbinding created

EventListenerのマニフェストhello-goodbye-listener.yamlは下記の通りです。トリガーで必要なTriggerBindingとTriggerTemplateを指定しています。

apiVersion: triggers.tekton.dev/v1alpha1
kind: EventListener
metadata:
  name: hello-goodbye-listener
spec:
  serviceAccountName: tekton-triggers-example-sa
  triggers:
    - name: hello-goodbye-trigger
      bindings:
        - ref: hello-goodbye-pipeline-binding
      template:
        ref: hello-goodbye-pipeline-template

マニフェストを反映します。

❯ kubectl apply -f hello-goodbye-listener.yaml
eventlistener.triggers.tekton.dev/hello-goodbye-listener created

以上で必要なリソースは全て作成できました。

イベントからPipelineの実行

EventListenerにリクエストを送ってパイプラインを実行させたいと思います。

Serviceを確認するとEventListenerが確認できます。

❯ kubectl get service
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
el-hello-goodbye-listener   ClusterIP   10.103.53.88    <none>        8080/TCP,9000/TCP   4m28s

EventListenerのServiceをポートフォワードします。

❯ kubectl port-forward service/el-hello-goodbye-listener 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

curlでlocalhostにリクエストを送ります。

❯ curl -X POST -H 'Context-Type: application/json' http://localhost:8080 -d '{"username": "masa"}'

PipelineRunを確認すると新しく実行されているのが確認できます。

❯ tkn pipelinerun list
NAME                      STARTED          DURATION     STATUS
hello-goodbye-run-wdjwk   53 seconds ago   15 seconds   Succeeded

PipelineRunのログを確認するとリクエストで渡したパラメータが反映されているのが確認できます。

❯ tkn pipelinerun logs hello-goodbye-run-wdjwk
[hello : hello] masa Hello World!

[goodbye : goodbye] Goodbye World!

また、下記でEventListenerのログも確認できます。

❯ tkn eventlistener logs hello-goodbye-listener

参考

タイトルとURLをコピーしました