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

はじめに

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

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

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

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

【KubernetesでCI/CD】Tekton動かしてみる
はじめに簡単な例を使って、Tekton Pipelineを動かしてみたいと思います。Tektonについては下記を参考にしてください。また、Tekton Pipeline使うまでの準備も紹介しています。本記事では、Tekton Pip...
【KubernetesでCI/CD】Tekton Triggerをローカルで試してみる
はじめにTektonの中からTekton Triggerにフォーカスして、簡単なパイプラインを実行してみたいと思います。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で使えるようになります。

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

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

動作確認

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

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

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

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

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

tkn taskrun logs hello-run-chp9q
[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は下記の通りです。

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: task-hello
spec:
  params:
    - name: my-name # Pipelineから受け取るパラメーター
      type: string
      description: My name which steps use
      default: unknown
  steps:
    - name: echo-hello-my-name
      image: ubuntu
      command:
        - "echo"
      args:
        - "hello $(params.my-name)" # パラメーターの利用
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: task-greeting
spec:
  params:
    - name: my-name # Pipelineから受け取るパラメーター
      type: string
      description: My name which steps use
      default: unknown
    - name: greet # Pipelineから受け取るパラメーター
      type: string
      description: Greeting
      default: Hello
  steps:
    - name: echo-greeting-my-name
      image: ubuntu
      command:
        - "echo"
      args:
        - "$(params.greet) $(params.my-name)" # パラメーターの利用
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: pipeline-hello-greeting
spec:
  params:
    - name: my-name # PipelineRunから受け取るパラメーター
    - name: greet # PipelineRunから受け取るパラメーター
  tasks:
    - name: task-hello
      params:
        - name: my-name # Taskに渡すパラメーター
          value: "$(params.my-name)" # 受け取ったパラメーターの値を指定
      taskRef:
        name: task-hello
    - name: task-greeting
      params:
        - name: my-name # Taskに渡すパラメーター
          value: "$(params.my-name)" # 受け取ったパラメーターの値を指定
        - name: greet # Taskに渡すパラメーター
          value: "$(params.greet)" # 受け取ったパラメーターの値を指定
      taskRef:
        name: task-greeting
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  generateName: hello-greeting-run-
spec:
  params:
    - name: my-name # Pipelineに渡すパラメーター
      value: "masa"
    - name: greet # Pipelineに渡すパラメーター
      value: "Good eventing"
  pipelineRef:
    name: pipeline-hello-greeting

動作確認

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

kubectl apply -f task-hello.yaml
kubectl apply -f task-greeting.yaml
kubectl apply -f pipeline-hello-greeting.yaml
kubectl create -f pipelineRun-hello-greeting.yaml

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

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

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

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

[task-hello : echo-hello-my-name] hello masa

EventListenerからTaskまで

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

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

ServiceAccountの準備

まずはじめに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

TaskとPipelineの作成

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

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

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: task-hello
spec:
  params:
    - name: my-name # Pipelineから受け取るパラメーター
      type: string
      description: My name which steps use
      default: unknown
  steps:
    - name: echo-hello-my-name
      image: ubuntu
      command:
        - "echo"
      args:
        - "hello $(params.my-name)" # パラメーターの利用
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: task-greeting
spec:
  params:
    - name: my-name # Pipelineから受け取るパラメーター
      type: string
      description: My name which steps use
      default: unknown
    - name: greet # Pipelineから受け取るパラメーター
      type: string
      description: Greeting
      default: Hello
  steps:
    - name: echo-greeting-my-name
      image: ubuntu
      command:
        - "echo"
      args:
        - "$(params.greet) $(params.my-name)" # パラメーターの利用
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: pipeline-hello-greeting
spec:
  params:
    - name: my-name # TriggerTemplateから受け取るパラメーター
    - name: greet # TriggerTemplateから受け取るパラメーター
  tasks:
    - name: task-hello
      params:
        - name: my-name # Taskに渡すパラメーター
          value: "$(params.my-name)" # 受け取ったパラメーターの値を指定
      taskRef:
        name: task-hello
    - name: task-greeting
      params:
        - name: my-name # Taskに渡すパラメーター
          value: "$(params.my-name)" # 受け取ったパラメーターの値を指定
        - name: greet # Taskに渡すパラメーター
          value: "$(params.greet)" # 受け取ったパラメーターの値を指定
      taskRef:
        name: task-greeting

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

kubectl apply -f task-hello.yaml
kubectl apply -f task-greeting.yaml
kubectl apply -f pipeline-hello-greeting.yaml

Trigger

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

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

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

apiVersion: triggers.tekton.dev/v1alpha1
kind: TriggerTemplate
metadata:
  name: hello-greeting-pipeline-template
spec:
  params:
    - name: my-name # TriggerBindingから受け取るパラメーター
      description: My name which steps use
      default: unknown
    - name: greet # TriggerBindingから受け取るパラメーター
      description: Greeting
      default: Hello
  resourcetemplates:
    - apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        generateName: hello-greeting-run-
      spec:
        params:
          - name: my-name # Pipelineに渡すパラメーター
            value: "$(tt.params.my-name)"
          - name: greet # Pipelineに渡すパラメーター
            value: "$(tt.params.greet)"
        pipelineRef:
          name: pipeline-hello-greeting
apiVersion: triggers.tekton.dev/v1alpha1
kind: TriggerBinding
metadata:
  name: hello-greeting-pipeline-binding
spec:
  params:
    - name: my-name # TriggerTemplateに渡すパラメーター
      value: "$(body.name)" # イベントから値を抽出
    - name: greet # TriggerTemplateに渡すパラメーター
      value: "$(body.greet)" # イベントから値を抽出
apiVersion: triggers.tekton.dev/v1alpha1
kind: EventListener
metadata:
  name: hello-greeting-listener
spec:
  serviceAccountName: tekton-triggers-example-sa
  triggers:
    - name: hello-greeting-trigger
      bindings:
        - ref: hello-greeting-pipeline-binding
      template:
        ref: hello-greeting-pipeline-template

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

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

動作確認

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

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

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

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

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

tkn pipelinerun list

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

tkn pipelinerun logs hello-greeting-run-p77nd
[task-hello : echo-hello-my-name] hello masa

[task-greeting : echo-greeting-my-name] Good morning masa

まとめ

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

参考

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