doc-locale/fr-fr/user/project/integrations/webhooks.md
{{< details >}}
{{< /details >}}
Les webhooks connectent GitLab à vos autres outils et systèmes grâce à des notifications en temps réel. Lorsque des événements importants se produisent dans GitLab, les webhooks envoient ces informations directement à vos applications externes. Créez des workflows d'automatisation en réagissant aux merge requests, aux poussées de code et aux mises à jour de tickets.
Grâce aux webhooks, votre équipe reste synchronisée au fur et à mesure que les modifications se produisent :
Divers événements dans GitLab peuvent déclencher des webhooks. Par exemple :
GitLab.com applique des limites pour les webhooks, notamment :
Pour GitLab Self-Managed, les administrateurs peuvent modifier ces limites.
GitLab limite les déclencheurs de webhook pour les événements push qui incluent plusieurs modifications :
push_event_hooks_limit via l'API des paramètres d'application.Si vous poussez fréquemment plusieurs tags ou branches simultanément et avez besoin de notifications webhook, contactez votre administrateur GitLab pour augmenter cette limite.
{{< details >}}
{{< /details >}}
Les webhooks de groupe sont des callbacks HTTP personnalisés qui envoient des notifications pour les événements de tous les projets d'un groupe et de ses sous-groupes.
Vous pouvez configurer des webhooks de groupe pour écouter :
Si vous configurez des webhooks identiques dans un groupe et dans un projet de ce groupe, les deux webhooks sont déclenchés pour les événements de ce projet. Cela permet une gestion flexible des événements à différents niveaux de votre organisation GitLab.
Créez et configurez des webhooks dans GitLab pour les intégrer au workflow de votre projet. Utilisez ces fonctionnalités pour configurer des webhooks répondant à vos besoins spécifiques.
{{< history >}}
webhook_signing_token. Activé par défaut.{{< /history >}}
[!flag] La disponibilité de cette fonctionnalité est contrôlée par un feature flag. Pour plus d'informations, consultez l'historique.
Pour les nouveaux webhooks, utilisez un signing token plutôt qu'un jeton secret. Le signing token calcule une signature HMAC-SHA256 sur la charge utile, permettant à votre endpoint de vérifier à la fois l'authenticité et l'intégrité de la requête. Le jeton secret ne fournit qu'une valeur en texte brut dans un en-tête, ce qui offre des garanties plus faibles. Le jeton secret n'est pas recommandé pour les nouveaux webhooks.
Créez un webhook pour envoyer des notifications sur les événements de votre projet ou groupe.
Prérequis :
Pour créer un webhook :
X-Gitlab-Token et offre des garanties de sécurité plus faibles qu'un signing token. Utilisez plutôt le signing token pour les nouveaux webhooks.{{< history >}}
webhook_signing_token. Activé par défaut.{{< /history >}}
[!flag] La disponibilité de cette fonctionnalité est contrôlée par un feature flag. Pour plus d'informations, consultez l'historique.
Utilisez un signing token pour vérifier que les charges utiles des webhooks proviennent de GitLab et n'ont pas été altérées. Contrairement au jeton secret, le signing token est utilisé pour calculer une signature HMAC-SHA256 sur la charge utile. Cela signifie que les destinataires peuvent vérifier indépendamment à la fois l'authenticité et l'intégrité de la charge utile reçue.
La livraison des webhooks GitLab suit la spécification Standard Webhooks. Chaque requête webhook inclut les en-têtes webhook-id et webhook-timestamp. Lorsqu'un signing token est configuré, GitLab inclut également l'en-tête webhook-signature avec la signature HMAC-SHA256. Chaque signature a le format v1,{base64_signature}. L'en-tête peut contenir plusieurs signatures séparées par des espaces. GitLab envoie actuellement une seule signature, mais cela peut changer à l'avenir. La signature est calculée sur la chaîne {message_id}.{timestamp}.{body}, où :
{message_id} est la valeur de l'en-tête webhook-id.{timestamp} est la valeur de l'en-tête webhook-timestamp.{body} est le corps brut de la requête JSON.Pour vérifier la signature dans votre endpoint webhook :
webhook-id, webhook-timestamp et webhook-signature.webhook-signature sur les espaces pour obtenir la liste des signatures."{message_id}.{timestamp}.{body}".whsec_, puis décodez le reste en base64.v1,.Exemple en Ruby :
require 'base64'
require 'openssl'
def valid_signature?(signing_token, message_id, timestamp, body, received_signatures)
raw_key = Base64.strict_decode64(signing_token.delete_prefix('whsec_'))
message = "#{message_id}.#{timestamp}.#{body}"
digest = OpenSSL::HMAC.digest('sha256', raw_key, message)
expected = "v1,#{Base64.strict_encode64(digest)}"
received_signatures.split(' ').any? do |sig|
ActiveSupport::SecurityUtils.secure_compare(expected, sig)
end
end
Exemple en Python :
import base64
import hashlib
import hmac
def valid_signature(signing_token, message_id, timestamp, body, received_signatures):
raw_key = base64.b64decode(signing_token.removeprefix('whsec_'))
message = f"{message_id}.{timestamp}.{body}".encode('utf-8')
digest = hmac.new(raw_key, message, hashlib.sha256).digest()
expected = "v1," + base64.b64encode(digest).decode('utf-8')
return any(
hmac.compare_digest(expected, sig)
for sig in received_signatures.split(' ')
)
Le signing token fonctionne aux côtés du jeton secret existant. Vous pouvez configurer les deux sur le même webhook :
X-Gitlab-Token est toujours envoyé si un jeton secret est configuré.webhook-signature et webhook-id sont envoyés si un signing token est configuré.Pour migrer un webhook existant utilisant le jeton secret vers un signing token sans interruption de service, configurez les deux tokens sur le même webhook pendant la transition. Mettez à jour votre récepteur pour vérifier la signature lorsque webhook-signature est présent et revenir au jeton secret dans le cas contraire.
Une fois que votre récepteur gère correctement les signatures, vous pouvez supprimer le jeton secret des paramètres du webhook.
Pour prévenir les attaques par rejeu, validez que l'horodatage dans webhook-timestamp est récent avant de traiter la charge utile.
Le signing token n'est jamais renvoyé par l'API.
Masquez les parties sensibles des URL de webhook pour renforcer la sécurité. Les parties masquées sont remplacées par des valeurs configurées lors de l'exécution des webhooks, ne sont pas journalisées et sont chiffrées au repos dans la base de données.
Pour masquer les parties sensibles d'une URL de webhook :
a-z), des chiffres (0-9) ou des underscores (_).Les valeurs masquées apparaissent cachées dans l'interface utilisateur. Par exemple, si vous avez défini les variables path et value, l'URL du webhook peut ressembler à ceci :
https://webhook.example.com/{path}?key={value}
{{< history >}}
custom_webhook_headers. Activé par défaut.custom_webhook_headers supprimé.{{< /history >}}
Ajoutez des en-têtes personnalisés aux requêtes webhook pour l'authentification auprès des services externes. Vous pouvez configurer jusqu'à 20 en-têtes personnalisés par webhook.
Les en-têtes personnalisés doivent :
Les en-têtes personnalisés s'affichent dans Événements récents avec des valeurs masquées.
{{< history >}}
custom_webhook_template. Activé par défaut.custom_webhook_template supprimé.custom_webhook_template_serialization. Désactivé par défaut.custom_webhook_template_serialization activé par défaut.custom_webhook_template_serialization supprimé dans GitLab 18.10.{{< /history >}}
Créez un modèle de charge utile personnalisé pour votre webhook afin de contrôler les données envoyées dans le corps de la requête.
Pour créer un modèle de webhook personnalisé :
Utilisez des champs de la charge utile d'un événement dans votre modèle. Par exemple :
{{build_name}} pour un événement de job{{deployable_url}} pour un événement de déploiementPour accéder aux propriétés imbriquées, utilisez des points pour séparer les segments de chemin.
Pour ce modèle de charge utile personnalisé :
{
"event": "{{object_kind}}",
"project_name": "{{project.name}}"
}
La charge utile de requête résultante pour un événement push est :
{
"event": "push",
"project_name": "Example"
}
Les modèles de webhook personnalisés ne peuvent pas accéder aux propriétés dans les tableaux.
Filtrez les événements push envoyés à votre endpoint webhook par nom de branche. Utilisez l'une de ces options de filtrage :
Pour filtrer à l'aide d'un schéma avec joker :
*-stable pour correspondre aux branches se terminant par -stable.production/* pour correspondre aux branches dans l'espace de nommage production/.Pour filtrer à l'aide d'une expression rationnelle :
Par exemple, pour exclure la branche main, utilisez :
\b(?:m(?!ain\b)|ma(?!in\b)|mai(?!n\b)|[a-l]|[n-z])\w*|\b\w{1,3}\b|\W+
{{< details >}}
{{< /details >}}
{{< history >}}
{{< /history >}}
Configurez les webhooks pour prendre en charge le TLS mutuel en définissant un certificat client global au format PEM.
Prérequis :
Pour configurer le TLS mutuel pour les webhooks :
{{< tabs >}}
{{< tab title="Linux package (Omnibus)" >}}
Modifiez /etc/gitlab/gitlab.rb :
gitlab_rails['http_client']['tls_client_cert_file'] = '<PATH TO CLIENT PEM FILE>'
gitlab_rails['http_client']['tls_client_cert_password'] = '<OPTIONAL PASSWORD>'
Enregistrez le fichier et reconfigurez GitLab :
sudo gitlab-ctl reconfigure
{{< /tab >}}
{{< tab title="Docker" >}}
Modifiez docker-compose.yml :
version: "3.6"
services:
gitlab:
image: 'gitlab/gitlab-ee:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
gitlab_rails['http_client']['tls_client_cert_file'] = '<PATH TO CLIENT PEM FILE>'
gitlab_rails['http_client']['tls_client_cert_password'] = '<OPTIONAL PASSWORD>'
Enregistrez le fichier et redémarrez GitLab :
docker compose up -d
{{< /tab >}}
{{< tab title="Self-compiled (source)" >}}
Modifiez /home/git/gitlab/config/gitlab.yml :
production: &base
http_client:
tls_client_cert_file: '<PATH TO CLIENT PEM FILE>'
tls_client_cert_password: '<OPTIONAL PASSWORD>'
Enregistrez le fichier et redémarrez GitLab :
# For systems running systemd
sudo systemctl restart gitlab.target
# For systems running SysV init
sudo service gitlab restart
{{< /tab >}}
{{< /tabs >}}
Après la configuration, GitLab présente ce certificat au serveur lors des négociations TLS pour les connexions webhook.
Configurez les pare-feu pour le trafic webhook en fonction de la façon dont GitLab envoie les webhooks :
Les webhooks sont envoyés de façon synchrone depuis les nœuds Rails lorsque vous testez ou réessayez un webhook dans l'interface utilisateur.
Lors de la configuration des pare-feu, assurez-vous que les nœuds Sidekiq et Rails peuvent envoyer du trafic webhook.
Surveillez et maintenez vos webhooks configurés dans GitLab.
Consultez l'historique des requêtes webhook pour surveiller leurs performances et résoudre les problèmes.
Prérequis :
Pour afficher l'historique des requêtes d'un webhook :
La section Événements récents affiche toutes les requêtes effectuées vers un webhook au cours des deux derniers jours. Le tableau inclut :
200-299internal error pour les livraisons échouéesPrérequis :
Chaque requête webhook dans Événements récents possède une page Détails de la requête. Cette page contient le corps et les en-têtes de :
Pour inspecter les détails de la requête et de la réponse d'un événement webhook :
Pour envoyer à nouveau la requête avec les mêmes données et le même en-tête Idempotency-Key, sélectionnez Renvoyer la requête. Si l'URL du webhook a changé, vous ne pouvez pas renvoyer la requête. Vous pouvez également renvoyer la requête par programmation via l'API des webhooks de projet.
Testez un webhook pour vous assurer qu'il fonctionne correctement ou pour réactiver un webhook désactivé.
Prérequis :
push events, votre projet doit avoir au moins un commit.Pour tester un webhook :
Les tests ne sont pas pris en charge pour certains types d'événements des webhooks de projet et de groupe. Pour plus d'informations, consultez l'issue 379201.
Utilisez cette référence technique pour :
Implémentez des endpoints récepteurs de webhook rapides et stables pour garantir une livraison fiable des webhooks.
Les récepteurs lents, instables ou mal configurés peuvent être désactivés automatiquement. Les réponses HTTP non valides sont traitées comme des requêtes échouées.
Pour optimiser vos récepteurs webhook :
200 ou 201 :
4xx) uniquement pour les webhooks mal configurés.400 ou ignorez la charge utile.500 pour les événements gérés.{{< history >}}
auto_disabling_web_hooks.{{< /history >}}
[!flag] La disponibilité de cette fonctionnalité est contrôlée par un feature flag. Pour plus d'informations, consultez l'historique.
GitLab désactive automatiquement les webhooks de projet ou de groupe qui échouent quatre fois consécutives.
Pour afficher les webhooks désactivés automatiquement :
Dans la liste des webhooks, les webhooks désactivés automatiquement s'affichent comme :
Les webhooks sont temporairement désactivés s'ils échouent quatre fois consécutives. Si les webhooks échouent 40 fois consécutives, ils sont définitivement désactivés.
Un échec se produit lorsque :
4xx ou 5xx.Les webhooks temporairement désactivés sont initialement désactivés pendant une minute, avec une durée qui s'étend lors des échecs ultérieurs jusqu'à 24 heures. Après l'expiration de cette période, ces webhooks sont automatiquement réactivés.
Les webhooks sont définitivement désactivés s'ils échouent 40 fois consécutives. Contrairement aux webhooks temporairement désactivés, ces webhooks ne sont pas automatiquement réactivés.
Les webhooks définitivement désactivés dans GitLab 17.10 et versions antérieures ont subi une migration de données. Ces webhooks peuvent afficher quatre échecs dans Événements récents même si l'interface utilisateur indique qu'ils ont 40 échecs.
Pour réactiver un webhook désactivé, envoyez une requête de test. Le webhook est réactivé si la requête de test renvoie un code de réponse dans la plage 2xx.
{{< history >}}
X-Gitlab-Webhook-UUID introduit dans GitLab 16.2.Idempotency-Key introduit dans GitLab 17.4.webhook-id et webhook-timestamp introduits dans GitLab 19.0.webhook-signature introduit dans GitLab 19.0 avec un flag nommé webhook_signing_token. Activé par défaut.{{< /history >}}
GitLab inclut les en-têtes suivants dans les requêtes webhook envoyées à votre endpoint.
[!flag] La disponibilité de l'en-tête
webhook-signatureest contrôlée par un feature flag. Pour plus d'informations, consultez l'historique.
| En-tête | Description | Exemple |
|---|---|---|
Idempotency-Key | Identifiant unique cohérent entre les nouvelles tentatives de webhook. Disponible pour des raisons de compatibilité ascendante ; préférez webhook-id. | "f5e5f430-f57b-4e6e-9fac-d9128cd7232f" |
User-Agent | Agent utilisateur au format "Gitlab/<VERSION>". | "GitLab/15.5.0-pre" |
webhook-id | Identifiant de message unique cohérent entre les nouvelles tentatives de webhook. Égal à Idempotency-Key. | "f5e5f430-f57b-4e6e-9fac-d9128cd7232f" |
webhook-signature | Liste de signatures HMAC-SHA256 séparées par des espaces, chacune au format v1,{base64_signature}. Inclus uniquement lorsqu'un signing token est configuré. | "v1,abc123def456==" |
webhook-timestamp | Horodatage Unix (secondes depuis l'époque) au moment où la requête a été générée. | "1744578123" |
X-Gitlab-Event-UUID | Identifiant unique pour les webhooks non récursifs. Les webhooks récursifs (déclenchés par des webhooks précédents) partagent la même valeur. | "13792a34-cac6-4fda-95a8-c58e00a3954e" |
X-Gitlab-Event | Nom du type de webhook. Correspond aux types d'événements au format "<EVENT> Hook". | "Push Hook" |
X-Gitlab-Instance | Nom d'hôte de l'instance GitLab qui a envoyé le webhook. | "https://gitlab.com" |
X-Gitlab-Token | Jeton secret pour le webhook, envoyé en texte brut. Inclus uniquement lorsqu'un jeton secret est configuré. | "my-secret-token" |
X-Gitlab-Webhook-UUID | Identifiant unique pour chaque webhook. | "02affd2d-2cba-4033-917d-ec22d5dc4b38" |
GitLab réécrit les références d'image relatives en URL absolues dans les corps des webhooks.
Si la référence d'image originale dans une merge request, un commentaire ou une page wiki est :

La référence d'image réécrite dans le corps du webhook serait :

Cet exemple suppose :
gitlab.example.com.123.GitLab ne réécrit pas les URL d'image lorsque :