(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Tekton/Kubernetes】curlコマンドをEventListenersに送ってPipelineをキックする

スポンサーリンク

はじめに

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コマンドを必要としないため、ご操作を防ぐ観点でも有用です。

以上、ご参考になれば幸いです。