【KubernetesでCI/CD】Tektonのパラメーターを理解する

2021.11.21
2024.03.24
CI/CD
TektonTekton PipelineTekton Trigger

はじめに

Tektonでのパラメーターがどのように設定され、どのように受け渡しがされるのかを実際に動かしながら理解していきたいと思います。

Tekton PipelineとTekton Triggerについては使える環境が前提となっています。インストールについては下記を参照してください。

【KubernetesでCI/CD】Tektonとは

【KubernetesでCI/CD】Tektonとは

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

また、Tekton PipelineとTekton Triggerの基本的な概念と動きについては説明しませんので、下記を参照ください。

【KubernetesでCI/CD】Tekton動かしてみる

【KubernetesでCI/CD】Tekton動かしてみる

はじめに 簡単な例を使って、Tekton Pipelineを動かしてみたいと思います。 Tek

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

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

はじめに Tektonの中から**Tekton Triggerにフォーカスして、簡単なパイプライ

Tektonのパラメーター

今回は下記の3つのパターンでパラーメーターをどう指定するかを動かしながら理解していきます。

  • TaskRun -> Task
  • PipelineRun -> Pipeline -> Task
  • EventListener -> TriggerBinding -> TriggerTemplate -> Pipeline -> Task

TaskRunからTaskまで

まずは最もシンプルなTaskRunからTaskへのパラメーターの渡し方を確認してみます。

マニフェスト

TaskとTaskRunのマニフェストtask-hello.yamltask-run-hello.yamlは下記の通りです。TaskRunでパラメーターを指定して、そのパラメーターをTaskで使えるようになります。

1apiVersion: tekton.dev/v1beta1
2kind: Task
3metadata:
4  name: task-hello
5spec:
6  params:
7    - name: my-name # 受け取るパラメーター
8      type: string # パラメーターの型(string or array)
9      description: My name which steps use # 説明
10      default: unknown # パラメーターをもらえなかった時のデフォルト値
11  steps:
12    - name: echo-hello-my-name
13      image: ubuntu
14      command:
15        - "echo"
16      args:
17        - "hello $(params.my-name)" # パラメーターの利用(展開)
1apiVersion: tekton.dev/v1beta1
2kind: TaskRun
3metadata:
4  generateName: hello-run-
5spec:
6  params:
7    - name: my-name # Taskに渡すパラメーター
8      value: masa # パラメーターに代入する値
9  taskRef:
10    name: task-hello

TaskRunで渡したパラメーターはTask側で受け取れるように同じ名前のパラメーターをTaskのspec.paramsで指定してあげる必要があります。

動作確認

それぞれのマニフェストを反映します。

1kubectl apply -f task-hello.yaml
2kubectl create -f task-run-hello.yaml

TaskRunが生成されたのがわかります。

1taskrun.tekton.dev/hello-run-chp9q created

生成されたTaskRunのログを確認してみると、TaskRunで設定したパラメーターの値がTaskで利用できているのがわかります。

1tkn taskrun logs hello-run-chp9q
1[echo-hello-my-name] hello masa

PipelineRunからTaskまで

次に少し拡張してPipelineRunからTaskまでのパラメーターの渡し方を確認します。

基本的な使い方はTaskと同じで、受け取るパラメーターと渡すパラメーターを指定しながら、PipelineRunからPipeline、そしてPipelineからTaskへと値を渡していきます。

マニフェスト

それぞれのマニフェストtask-hello.yamltask-greeting.yamlpipeline-hello-greeting.yamlpipelineRun-hello-greeting.yamlは下記の通りです。

1apiVersion: tekton.dev/v1beta1
2kind: Task
3metadata:
4  name: task-hello
5spec:
6  params:
7    - name: my-name # Pipelineから受け取るパラメーター
8      type: string
9      description: My name which steps use
10      default: unknown
11  steps:
12    - name: echo-hello-my-name
13      image: ubuntu
14      command:
15        - "echo"
16      args:
17        - "hello $(params.my-name)" # パラメーターの利用
18
1apiVersion: tekton.dev/v1beta1
2kind: Task
3metadata:
4  name: task-greeting
5spec:
6  params:
7    - name: my-name # Pipelineから受け取るパラメーター
8      type: string
9      description: My name which steps use
10      default: unknown
11    - name: greet # Pipelineから受け取るパラメーター
12      type: string
13      description: Greeting
14      default: Hello
15  steps:
16    - name: echo-greeting-my-name
17      image: ubuntu
18      command:
19        - "echo"
20      args:
21        - "$(params.greet) $(params.my-name)" # パラメーターの利用
1apiVersion: tekton.dev/v1beta1
2kind: Pipeline
3metadata:
4  name: pipeline-hello-greeting
5spec:
6  params:
7    - name: my-name # PipelineRunから受け取るパラメーター
8    - name: greet # PipelineRunから受け取るパラメーター
9  tasks:
10    - name: task-hello
11      params:
12        - name: my-name # Taskに渡すパラメーター
13          value: "$(params.my-name)" # 受け取ったパラメーターの値を指定
14      taskRef:
15        name: task-hello
16    - name: task-greeting
17      params:
18        - name: my-name # Taskに渡すパラメーター
19          value: "$(params.my-name)" # 受け取ったパラメーターの値を指定
20        - name: greet # Taskに渡すパラメーター
21          value: "$(params.greet)" # 受け取ったパラメーターの値を指定
22      taskRef:
23        name: task-greeting
1apiVersion: tekton.dev/v1beta1
2kind: PipelineRun
3metadata:
4  generateName: hello-greeting-run-
5spec:
6  params:
7    - name: my-name # Pipelineに渡すパラメーター
8      value: "masa"
9    - name: greet # Pipelineに渡すパラメーター
10      value: "Good eventing"
11  pipelineRef:
12    name: pipeline-hello-greeting

動作確認

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

1kubectl apply -f task-hello.yaml
2kubectl apply -f task-greeting.yaml
3kubectl apply -f pipeline-hello-greeting.yaml
4kubectl create -f pipelineRun-hello-greeting.yaml

PipelineRunが生成されたのがわかります。

1pipelinerun.tekton.dev/hello-greeting-run-n98jl created

生成されたPipelineRuのログを確認してみるとパラメーターが反映されているのがわかります。

1tkn pipelinerun logs hello-greeting-run-n98jl
1[task-greeting : echo-greeting-my-name] Good eventing masa
2
3[task-hello : echo-hello-my-name] hello masa

EventListenerからTaskまで

最後にEventListenerからTaskまでのパラメーターの動きを確認していきます。

やることは同じです。パラメーターを指定して、受け取るを繰り返します。ただし、TriggerTemplateでのパラメーター指定だけ少し特殊になります。

ServiceAccountの準備

まずはじめに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
1kubectl apply -f rbac.yaml

TaskとPipelineの作成

次にTaskとPipelineです。 こちらはPipelineで受け取るパラメーターがTriggerTemplateになりますが、内容としては変わりません。

マニフェストtask-hello.yamltask-greeting.yamlpipeline-hello-greeting.yamlは下記の通りです。

1apiVersion: tekton.dev/v1beta1
2kind: Task
3metadata:
4  name: task-hello
5spec:
6  params:
7    - name: my-name # Pipelineから受け取るパラメーター
8      type: string
9      description: My name which steps use
10      default: unknown
11  steps:
12    - name: echo-hello-my-name
13      image: ubuntu
14      command:
15        - "echo"
16      args:
17        - "hello $(params.my-name)" # パラメーターの利用
18
1apiVersion: tekton.dev/v1beta1
2kind: Task
3metadata:
4  name: task-greeting
5spec:
6  params:
7    - name: my-name # Pipelineから受け取るパラメーター
8      type: string
9      description: My name which steps use
10      default: unknown
11    - name: greet # Pipelineから受け取るパラメーター
12      type: string
13      description: Greeting
14      default: Hello
15  steps:
16    - name: echo-greeting-my-name
17      image: ubuntu
18      command:
19        - "echo"
20      args:
21        - "$(params.greet) $(params.my-name)" # パラメーターの利用
1apiVersion: tekton.dev/v1beta1
2kind: Pipeline
3metadata:
4  name: pipeline-hello-greeting
5spec:
6  params:
7    - name: my-name # TriggerTemplateから受け取るパラメーター
8    - name: greet # TriggerTemplateから受け取るパラメーター
9  tasks:
10    - name: task-hello
11      params:
12        - name: my-name # Taskに渡すパラメーター
13          value: "$(params.my-name)" # 受け取ったパラメーターの値を指定
14      taskRef:
15        name: task-hello
16    - name: task-greeting
17      params:
18        - name: my-name # Taskに渡すパラメーター
19          value: "$(params.my-name)" # 受け取ったパラメーターの値を指定
20        - name: greet # Taskに渡すパラメーター
21          value: "$(params.greet)" # 受け取ったパラメーターの値を指定
22      taskRef:
23        name: task-greeting

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

1kubectl apply -f task-hello.yaml
2kubectl apply -f task-greeting.yaml
3kubectl apply -f pipeline-hello-greeting.yaml

Trigger

次にTrigger関連のリソースを作成します。

マニフェストhello-greeting-pipeline-template.yamlhello-greeting-listener.yamlhello-greeting-listener.yamlは下記の通りです。

TriggerTemplateのresourcetemplatesの中ではtt.paramsでパラメーターを指定します。

1apiVersion: triggers.tekton.dev/v1alpha1
2kind: TriggerTemplate
3metadata:
4  name: hello-greeting-pipeline-template
5spec:
6  params:
7    - name: my-name # TriggerBindingから受け取るパラメーター
8      description: My name which steps use
9      default: unknown
10    - name: greet # TriggerBindingから受け取るパラメーター
11      description: Greeting
12      default: Hello
13  resourcetemplates:
14    - apiVersion: tekton.dev/v1beta1
15      kind: PipelineRun
16      metadata:
17        generateName: hello-greeting-run-
18      spec:
19        params:
20          - name: my-name # Pipelineに渡すパラメーター
21            value: "$(tt.params.my-name)"
22          - name: greet # Pipelineに渡すパラメーター
23            value: "$(tt.params.greet)"
24        pipelineRef:
25          name: pipeline-hello-greeting
1apiVersion: triggers.tekton.dev/v1alpha1
2kind: TriggerBinding
3metadata:
4  name: hello-greeting-pipeline-binding
5spec:
6  params:
7    - name: my-name # TriggerTemplateに渡すパラメーター
8      value: "$(body.name)" # イベントから値を抽出
9    - name: greet # TriggerTemplateに渡すパラメーター
10      value: "$(body.greet)" # イベントから値を抽出
1apiVersion: triggers.tekton.dev/v1alpha1
2kind: EventListener
3metadata:
4  name: hello-greeting-listener
5spec:
6  serviceAccountName: tekton-triggers-example-sa
7  triggers:
8    - name: hello-greeting-trigger
9      bindings:
10        - ref: hello-greeting-pipeline-binding
11      template:
12        ref: hello-greeting-pipeline-template

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

1kubectl apply -f hello-greeting-pipeline-template.yaml
2kubectl apply -f hello-greeting-pipeline-binding.yaml
3kubectl apply -f hello-greeting-listener.yaml

動作確認

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

1kubectl port-forward service/el-hello-greeting-listener 8080:8080

リクエストを送りPipelineRunを実行させます。ここの値がTaskで参照されるようになります。

1curl -X POST -H 'Context-Type: application/json' http://localhost:8080 -d '{"name": "masa", "greet": "Good morning"}'

生成されたPipelineの名前を確認します。

1tkn pipelinerun list

PipelineRunのログを確認するとリクエストを送ったパラメーターが反映されているのがわかります。

1tkn pipelinerun logs hello-greeting-run-p77nd
1[task-hello : echo-hello-my-name] hello masa
2
3[task-greeting : echo-greeting-my-name] Good morning masa

まとめ

  • パラメーターは上流の概念から受け取り渡すことができる
  • 指定がない時はデフォルト値になる

参考

Support

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

buy me a coffee
Share

Profile

author

Masa

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

buy me a coffee