Skip to content
Latchkey

CIにおけるWebhookとは?

webhookは、イベントが起きたとき - pushのように - システムが送信するHTTPリクエストで、別のシステムが即座に反応できるようにします。たとえばCIのpipelineを開始するなどです。

変更をpollingするのは無駄で遅いです。webhookはこれを逆転させます。CIが"何か新しいものは?"と尋ねる代わりに、ソースシステムがイベントの発生した瞬間にそれをpushします。このイベント駆動モデルこそ、git pushが即座にビルドをトリガーする仕組みです。

webhookの仕組み

ソースシステムにURLを登録します。選んだイベントが発火すると、システムは何が起きたかを記述するpayloadとともにそのURLへHTTP POSTを送信します。受信側はそれをparseして動作します - たとえばpipelineの実行をキューに入れるなどです。

CIでの一般的な用途

  • push、pull request、tagでビルドやデプロイをトリガーする。
  • 実行が失敗したときにチャットやインシデントツールに通知する。
  • オンデマンドでrunnerをプロビジョニングするためにマネージドrunnerプラットフォームを起こす。

簡単な例

pushイベントはJSONのpayload(repo、branch、commit)をあなたのエンドポイントへPOSTします。handlerはそれを検証し、そのcommitのためにpipelineをキューに入れます - git pushをpollingなしで数秒のうちに実行中のビルドへと変えるのです。

webhookの保護

webhookのエンドポイントは公開されてアクセス可能なので、各リクエストを検証しましょう。共有シークレットで計算した署名をチェックし、一致しないpayloadは無視します。検証がなければ、誰でもイベントを偽造できてしまいます。

配信の現実に対処する

webhookは順序が入れ替わって届いたり、複数回配信されたり、timeout後に再送されたりすることがあります。handlerをべき等にし、素早く応答しましょう(重い処理は非同期で行う)。そうすれば遅いhandlerが重複配信を引き起こすことはありません。

重要なポイント

  • webhookはpollではなく、イベント駆動のHTTPコールバックです。
  • CIではビルドをトリガーし、通知を送り、runnerをプロビジョニングします。
  • 署名を検証し、リトライに対してhandlerをべき等にしましょう。

関連ガイド