Tester un webhook GitHub

Tester un webhook GitHub, sans déployer.

Collez une URL de capture Tracehook comme Payload URL d'un webhook GitHub et lisez l'événement tel que GitHub l'envoie : X-GitHub-Event, X-GitHub-Delivery, X-Hub-Signature-256 et le corps complet, en direct. Sans compte, chiffré, effacé après 24 h.

  • X-GitHub-Event
  • X-GitHub-Delivery
  • X-Hub-Signature-256
  • Content-Type

Où coller l'URL

Quatre étapes, aucune configuration côté serveur. Remplacez <domaine> et <votre-id> par les valeurs de votre session.

  1. 1

    Créez une URL de capture (bouton ci-dessous). Vous obtenez une adresse de la forme https://<domaine>/h/<votre-id>. Vous pouvez y ajouter un sous-chemin, par exemple /github.

  2. 2

    Sur GitHub, ouvrez votre dépôt → Settings → Webhooks → « Add webhook » (même chemin au niveau d'une organisation).

  3. 3

    Collez l'URL de capture dans « Payload URL ». Choisissez « Content type : application/json », renseignez un « Secret » si vous voulez tester la signature, puis les événements à recevoir.

  4. 4

    Enregistrez : GitHub envoie immédiatement un événement ping. Il apparaît dans votre session Tracehook ; chaque push, pull request ou issue suivra.

À quoi ressemble la requête reçue

Les headers ci-dessous sont ceux que GitHub documente sur chaque livraison. Tracehook les affiche dans l'ordre reçu, avec le corps brut.

X-GitHub-Event

Type d'événement : ping, push, pull_request, issues, …

X-GitHub-Delivery

Identifiant unique (GUID) de la livraison, aussi visible dans « Recent Deliveries ».

X-Hub-Signature-256

sha256=<HMAC-SHA256 du corps brut avec votre secret>. Présent seulement si un secret est configuré.

Content-Type

application/json si vous l'avez choisi ; sinon application/x-www-form-urlencoded avec le JSON dans un champ payload.

Forme du corps (exemple, valeurs fictives)
{
  "zen": "…",
  "hook_id": 123456789,
  "hook": {
    "type": "Repository",
    "id": 123456789,
    "events": ["push", "pull_request"],
    "config": { "content_type": "json", "url": "https://<domaine>/h/<votre-id>/github" }
  },
  "repository": { "full_name": "org/repo", "…": "…" },
  "sender": { "login": "…", "…": "…" }
}

Pièges fréquents

Ce qui explique la plupart des « le webhook n'arrive pas » ou « signature invalide ».

Content type par défaut : formulaire

Par défaut GitHub envoie application/x-www-form-urlencoded avec le JSON dans un champ payload. Si votre handler attend du JSON brut, choisissez « application/json » dans la configuration du webhook. Tracehook affiche les deux formes (onglets Body et Raw).

Signature sur le corps brut

X-Hub-Signature-256 est calculée sur les octets exacts du corps. Comparez avec une fonction à temps constant et sans re-sérialiser le JSON. Le corps brut est disponible dans l'onglet Raw.

Pas de secret, pas de signature

Si le champ « Secret » est vide, le header X-Hub-Signature-256 est absent. Un handler qui l'exige répondra en erreur : renseignez le secret ou assouplissez le test.

L'événement ping n'est pas un push

Le premier événement reçu à la création est ping (X-GitHub-Event: ping). Son corps n'a ni commits ni ref : ne le confondez pas avec un échec de livraison.

Rejouer depuis GitHub ou depuis Tracehook

Settings → Webhooks → Recent Deliveries permet de renvoyer une livraison (« Redeliver »). Vous pouvez aussi copier la requête en cURL depuis Tracehook et la rejouer vers votre serveur local.

Exemple curl

Pour vérifier que votre URL de capture reçoit bien une requête de cette forme, sans attendre le fournisseur.

curl -X POST https://<domaine>/h/<votre-id>/github \
  -H 'Content-Type: application/json' \
  -H 'X-GitHub-Event: ping' \
  -H 'X-GitHub-Delivery: 72d3162e-cc78-11e3-81ab-4c9367dc0958' \
  -H 'X-Hub-Signature-256: sha256=<signature-fictive>' \
  -d '{"zen":"Keep it logically awesome.","hook_id":123456789,"repository":{"full_name":"org/repo"}}'

Cette commande imite la forme d'un événement ping GitHub (valeurs fictives, signature non valide). Pour un vrai événement signé, passez par la configuration du dépôt.

Limites à connaître

Une valeur, partout.

  • 50dernières requêtes par session
  • 1 Mopar requête, headers compris (413 au-delà)
  • 24 hsans activité, puis tout est effacé

Détails sur le chiffrement et la rétention : Sécurité & données. Routes, flux SSE et codes d'erreur : référence API. Autre fournisseur : tester un webhook Stripe.

Votre prochain webhook GitHub, vous le lirez en direct.

Sans inscription