Abonnement aux Webhooks GitHub et traitement des événements

Un webhook est un moyen simple permettant à des applications d’être notifiées en temps réel d’un événement particulier qui se produit dans un service. GitHub offre, via les webhooks, la possibilité de recevoir divers événements qui surviennent dans nos repositories, comme les commits, la création de pull requests, de nouvelles issues
En s’abonnant à ces événements, nous pouvons rester informés des modifications dans nos repositories et déclencher des actions pour traiter ces informations.
Dans cet article, nous allons explorer la configuration d’un webhook GitHub à travers un exemple concret. Nous allons créer un script qui reçoit et traite un événement de webhook. Pour faciliter le développement et les tests, nous utiliserons des outils comme le serveur interne de PHP et Ngrok.

Script de traitement du webhook

D’abord, nous implémentons un script PHP qui recevra et traitera l’événement du webhook. Dans notre cas, l’application sera configurée pour écouter l’événement de création d’une issue. Pour ce faire, créons un fichier index.php avec le contenu suivant :


<?php

$payload = file_get_contents('php://input');

$data = json_decode($payload, true);

if (isset($data['action']) 
    && $data['action'] == 'opened' 
    && isset($data['issue'])) {
  
    $url = $data['issue']['html_url'];
    $title = $data['issue']['title'];
    $body = $data['issue']['body'] ?? '';
    
    $message = <<<EOT
		-- New Issue Created --
        URL: $url
		Title: $title
		Description: $body
		EOT;
  
    error_log($message);
    
    http_response_code(200);
    echo "Issue Event processed successfully!";
} else {
    http_response_code(400);
    echo "Invalid Event Type!";
}

Ce script va récupérer le contenu brut de la requête POST envoyée par le webhook, qui est en format JSON. Nous décodons ce JSON en un tableau associatif pour faciliter l’accès aux différentes données.
Nous vérifions ensuite si l’événement reçu est bien une création d’issue. Si c’est le cas, le titre, la description et l’URL de l’issue nouvellement créée sont extraits. Ces informations sont alors loggées dans le journal d’erreurs, mais elles pourraient aussi être enregistrées dans une base de données, envoyées par e-mail, ou traitées d’une autre manière selon les besoins spécifiques de l’application.
Pour tester notre script, nous allons utiliser le serveur interne de PHP. Il faut se placer dans le dossier où se trouve le script et exécuter la commande suivante :


php -S localhost:8000 -t .

Comme nous sommes en environnement de développement, il nous faut utiliser un outil de tunneling sécurisé comme Ngrok pour générer une URL publique pointant vers notre serveur local.
Vous pouvez télécharger et installer Ngrok depuis ce lien https://ngrok.com/download.
Une fois Ngrok installée, exécuter la commande suivante :


ngrok http 8000

Noter l’URL générée par Ngrok, nous en aurons besoin à l’étape de configuration du webhook.

ngrok

Configuration du webhook

Pour configurer le webhook dans notre repository GitHub, nous allons cliquer sur l’onglet Settings en haut de la page puis sur Webhooks dans la barre latérale gauche. Ensuite, nous cliquons sur le bouton Add webhook dans la page des webhooks pour renseigner le formulaire de configuration.

github webhook

Le formulaire nous permet de définir le champ Payload URL, sa valeur correspond à l’URL publique fournie par Ngrok. Nous pouvons également définir le type de contenu, il faut choisir application/json pour recevoir les données au format JSON. Enfin, nous cochons la case Issues pour que notre webhook soit déclenché uniquement par ce type d’événement. Pour des raisons de sécurité, il est même possible de définir un secret pour ne traiter que les requêtes provenant de ce webhook.

webhook configuration

Maintenant, chaque fois qu’une nouvelle Issue est créée dans notre repository, GitHub nous enverra une notification permettant de traiter l’événement en temps réel.

webhook delivery status

Nous avons appris à configurer un webhook, à créer un script pour traiter les données reçues, et à exploiter des outils comme le serveur interne de PHP et Ngrok pour tester nos configurations localement. Que ce soit pour automatiser des tâches ou simplement rester informé des changements dans un service, les webhooks sont un outil essentiel pour tout développeur. En maîtrisant l’utilisation des webhooks, vous pouvez améliorer grandement la gestion de vos projets.

Retour en haut