はじめに
TektonではEventlistener用のPodにリクエストを送ることでTriggerTemplatesをベースにしたPipelineを起動することが可能です。
CICDをキックする方法にGithubへのpushなどはありますが、今回は最もシンプルにEventListenersにcurlコマンドを直接送る方法でCICDをキックする場合について解説します。
環境情報
- v1.20.8+IKS
- tektoncd:v0.14.2
事前準備の流れ
以下のリソースを展開することで受付準備ができます。
triggertemplate.triggers.tekton.dev triggerbinding.triggers.tekton.dev eventlistener.triggers.tekton.dev
尚、TriggerTemplateにはPipelineRunに付与するServiceAccountが必要でEventListenerにはTektonTriggers用のサービスアカウントが必要です。
EventListenerが正常に起動すると以下で記載した名前に沿って
kind: EventListener metadata: name: test-el
Deployment/Podが生成されます。
$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE test-el 1/1 1 1 x
$ kubectl get pod NAME READY STATUS RESTARTS AGE test-el-5858d776b6-2rfcc 1/1 Running 0 x
同Podに紐づくServiceはClusterIPのため、Ingressを作成するか
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEt test-el ClusterIP 172.21.251.199 <none> 8080/TCP 7h3m
以下のようにポートフォワードを行うことで
$ kubectl port-forward service/test-el 8080:8080
Podにアクセスできるようにします。
$ curl http://localhost:8080 {"eventListener":"test-el","namespace":"default","eventListenerUID":"","errorMessage":"Invalid event body format format: unexpected end of JSON input"}
CurlでPipelineを作成
TriggerBindingで事前に定義した項目の値を埋めた形でcurlコマンドを実行すると
$ curl -X POST -H 'Content-Type: application/json' http://localhost:8080 -d '{"xx":{"xx": "xx"}}'
EventListenerのPodに以下のようなログが出力されてPipelineが起動します。
{"level":"info","ts":".","logger":"eventlistener","caller":"resources/create.go:106","msg":"For event ID \"07ce3820-c008-43fa-838c-xx\" creating resource tekton.dev/v1beta1, Resource=pipelineruns","knative.dev/controller":"eventlistener"}
ちなみに上記はPipelineRunが生成されたことを示すのみであり、引数に与えた値に誤りがあった場合はPipelineRun側にてエラーが起きます。
そしてCurlのリクエストの構造が間違っている場合などはlevelがErrorとなりPiplelineRunは作成されません。
{"level":"error","ts":"xx","logger":"eventlistener","caller":"sink/validate_payload.go:39","msg":"Invalid event body format format: invalid character '}' ...
終わりに
PipelineRunをyamlファイルで記載して実行する場合はファイルを手動で直してkubctlを適用させる必要がありましたが、curlで行う場合はkubectlコマンドを必要としないため、ご操作を防ぐ観点でも有用です。
以上、ご参考になれば幸いです。