🐙
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