TektonのWebhookルーティング

Tekton TriggersはWebリクエストからビルドパラメータを抽出し、Pipelineを起動する機能を提供しています。

EventListenerがHTTPリクエストを待ち受け、Triggerのルールに従ってPipelineを起動します。

  • HTTPリクエストは、JSONをPOSTする想定
  • InterceptorによりTriggerをルーティングする

Interceptorによるルーティング

EventListenerには複数のTriggerを定義でき、 CELインターセプターのfilterを利用すると起動するPipelineを分岐できます。
この点のドキュメントがなく、非常に分かりづらいポイントです。

apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
spec:
  triggers:
  - name: trigger-a
    interceptors:
    - ref:
        name: cel
      params:
      - name: filter
        value: "header.match('X-Tekton-Type', 'service-a')"
    bindings:
    - ref: binding-service-a
    template:
      ref: template-service-a
  - name: trigger-b
    interceptors:
    - ref:
        name: cel
      params:
      - name: filter
        value: "header.match('X-Tekton-Type', 'service-b')"
    bindings:
    - ref: binding-service-b
    template:
      ref: template-service-b

この例では、X-Tekton-Typeという独自定義のHTTPヘッダーにサービス名を指定することで、起動するPipelineを選択する構成にしています。

フィルタの対象は任意のHTTPリクエストパラメータを指定できます。
ヘッダーの場合、curlコマンドでは-H 'X-Tekton-Type:service-a'のように指定でき、クライアントスクリプトが分かりやすいメリットがあります。

リポジトリURLなどのパラメータは、リクエストボディのJSONに記載し、 Trigger Bindingで抽出します。

ポイント

実はルーティングはInterceptorで実装できます。
Interceptorは他にもgitプロバイダに対応するものがあり、ショートハンドを提供しています。

CELを利用すると、単なるgit hookのスクリプトからcurlなどでCI起動のリクエストをコールできます。

⁋ 2021/10/03↻ 2024/11/07
中馬崇尋
Chuma Takahiro