【KubernetesでCI/CD】Tektonのパラメーターを理解する
はじめに
Tektonでのパラメーターがどのように設定され、どのように受け渡しがされるのかを実際に動かしながら理解していきたいと思います。
Tekton PipelineとTekton Triggerについては使える環境が前提となっています。インストールについては下記を参照してください。
unknown linkまた、Tekton PipelineとTekton Triggerの基本的な概念と動きについては説明しませんので、下記を参照ください。
【KubernetesでCI/CD】Tekton動かしてみる
はじめに 簡単な例を使って、Tekton Pipelineを動かしてみたいと思います。 Tek
【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.yaml
とtask-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.yaml
、task-greeting.yaml
、pipeline-hello-greeting.yaml
、pipelineRun-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.yaml
、task-greeting.yaml
、pipeline-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.yaml
、hello-greeting-listener.yaml
、hello-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
まとめ
- パラメーターは上流の概念から受け取り渡すことができる
- 指定がない時はデフォルト値になる
参考
- TaskRun Specifying Parameters
- Task Specifying Parameters
- Pipeline Specifying Parameters
- PipelineRun Specifying Parameters
- TriggerEvent Specifying Parameters
- TriggerBinding Specifying Parameters