🐙

GitHub Webhookはどう動くのか?

git push → HTTP POST → CI/CDトリガー

GitHub WebhookはRepository Settings > WebhooksでURLを登録すると動作します。イベント発生時にGitHubがそのURLにJSONペイロードと共にHTTP POSTを送信します。X-Hub-Signature-256ヘッダーでHMAC署名を含み、リクエストの真正性を検証できます。受信サーバーは10秒以内に200 OKを返す必要があり、失敗時はGitHubが自動リトライします。

構造ダイアグラム

事前設定
👤
リポジトリオーナー
Settings → Webhooks → Add
🐙
GitHub
URL + Secretを保存
イベント発生時
👨‍💻
開発者
git push
🐙
GitHub
pushイベント検知
HTTP POST
X-Hub-Signature-256
X-GitHub-Event: push
🖥️
マイサーバー
署名検証 CI/CDトリガー
署名検証(セキュリティ必須!):
expected = HMAC-SHA256(secret, body)
actual = request.headers["X-Hub-Signature-256"]
secure_compare(expected, actual) # true → 正常
注意事項
  • 10秒以内に200 OKを返す必要あり(重い処理はバックグラウンドで)
  • 失敗時GitHubが自動リトライ(最大3回)
  • Settings → Webhooksで送信ログ確認可能
  • ローカル開発時はngrokが必要(公開URLがないため)

動作フロー

1

Repository SettingsでWebhook URL + Secretを登録

2

開発者がgit pushを実行(またはPR作成、Issueなど)

3

GitHubが登録されたURLにHTTP POSTを送信(JSONペイロード)

4

X-Hub-Signature-256ヘッダーでHMAC-SHA256署名を含む

5

受信サーバーが署名検証後にイベント処理(CI/CDトリガーなど)

6

サーバーが200 OKを返却(10秒以内、失敗時はGitHubがリトライ)

メリット

  • 設定が非常に簡単
  • イベント種類を細かく選択可能
  • 失敗時の自動リトライ
  • GitHub UIで送信ログを確認可能

デメリット

  • 公開URL必須(ローカル開発時はngrokが必要)
  • 10秒タイムアウト(重い処理は非同期で)
  • 署名検証の実装が必要
  • イベント順序保証なし

ユースケース

CI/CD自動ビルド(Jenkins、GitHub Actions) Slack/Discord通知 自動デプロイトリガー コードレビューBot