doc-locale/fr-fr/administration/server_hooks.md
{{< details >}}
{{< /details >}}
{{< history >}}
{{< /history >}}
Les hooks serveur Git exécutent une logique personnalisée sur le serveur GitLab. Vous pouvez les utiliser pour exécuter des tâches liées à Git, telles que :
Les hooks serveur Git utilisent les hooks côté serveur Git pre-receive, post-receive et update.
Les administrateurs GitLab configurent les hooks serveur à l'aide de la commande gitaly, qui permet également de :
Si vous n'avez pas accès à la commande gitaly, les alternatives aux hooks serveur incluent :
Pour les instances GitLab Helm chart, consultez les informations sur les hooks serveur globaux dans le chart Gitaly.
[!note] Geo ne réplique pas les hooks serveur sur les nœuds secondaires.
/var/opt/gitlab/gitaly/config.toml sur les instances du package Linux), et le chemin relatif du dépôt pour le dépôt.Pour définir des hooks serveur pour un dépôt :
Créer une archive tar contenant les hooks personnalisés :
Écrivez le code pour que le hook serveur fonctionne comme prévu. Les hooks serveur Git peuvent être dans n'importe quel langage de programmation. Assurez-vous que le shebang en haut reflète le type de langage. Par exemple, si le script est en Ruby, le shebang est probablement #!/usr/bin/env ruby.
pre-receive, le nom de fichier doit être pre-receive sans extension.pre-receive, le nom du répertoire doit être pre-receive.d. Placez les fichiers du hook dans ce répertoire.Assurez-vous que les fichiers de hook serveur sont exécutables et ne correspondent pas au modèle de fichier de sauvegarde (*~). Les hooks serveur doivent se trouver dans un répertoire custom_hooks à la racine de l'archive tar.
Créez l'archive des hooks personnalisés avec la commande tar. Par exemple, tar -cf custom_hooks.tar custom_hooks.
Exécutez la sous-commande hooks set avec les options requises pour définir les hooks Git pour le dépôt. Par exemple :
cat custom_hooks.tar | sudo -u git -- /opt/gitlab/embedded/bin/gitaly hooks set --storage <storage> --repository <relative path> --config <config path>
Un chemin vers une configuration Gitaly valide pour le nœud est requis pour se connecter au nœud et fourni à l'option --config.
L'archive tar des hooks personnalisés doit être transmise via stdin. Par exemple :
cat custom_hooks.tar | sudo -u git -- /opt/gitlab/embedded/bin/gitaly hooks set --storage <storage> --repository <relative path> --config <config path>
Si vous utilisez Gitaly Cluster (Praefect), vous devez exécuter la sous-commande hooks set sur tous les nœuds Gitaly.
Si vous avez implémenté le code du hook serveur correctement, il doit s'exécuter lors du prochain déclenchement du hook Git.
Si vous utilisez Gitaly Cluster (Praefect), un dépôt individuel peut être répliqué vers plusieurs stockages Gitaly dans Praefect. Par conséquent, les scripts de hook doivent être copiés sur chaque nœud Gitaly qui possède une réplique du dépôt. Pour ce faire, suivez les mêmes étapes de configuration des hooks de dépôt personnalisés pour la version applicable et répétez l'opération pour chaque stockage.
L'emplacement où copier les scripts dépend de l'endroit où les dépôts sont stockés. Les nouveaux dépôts sont créés en utilisant des chemins de réplica générés par Praefect qui ne sont pas le chemin de stockage haché. Pour identifier le chemin de réplica, interrogez les métadonnées du dépôt Praefect en utilisant l'option -relative-path pour spécifier le chemin de stockage haché GitLab attendu.
Pour créer un hook Git qui s'applique à tous les dépôts, définissez un hook serveur global. Les hooks serveur globaux s'appliquent également à :
<id>.wiki.git.<id>.design.git.Avant de créer un hook serveur global, vous devez choisir un répertoire pour celui-ci.
{{< tabs >}}
{{< tab title="Linux package (Omnibus)" >}}
Le répertoire est défini dans gitlab.rb sous gitaly['configuration'][:hooks][:custom_hooks_dir]. Vous pouvez soit :
/var/opt/gitlab/gitaly/custom_hooks en le décommentant.{{< /tab >}}
{{< tab title="Self-compiled (source)" >}}
gitaly/config.toml sous la section [hooks]. Cependant, GitLab utilise la valeur custom_hooks_dir dans gitlab-shell/config.yml si la valeur dans gitaly/config.toml est vide ou inexistante./home/git/gitlab-shell/hooks.{{< /tab >}}
{{< /tabs >}}
Pour créer un hook serveur global pour tous les dépôts :
pre-receive, le nom du répertoire doit être pre-receive.d.#!) en haut reflète le type de langage. Par exemple, si le script est en Ruby, le shebang est probablement #!/usr/bin/env ruby.*~).Si le code du hook serveur est correctement implémenté, il doit s'exécuter lors du prochain déclenchement du hook Git. Les hooks sont exécutés dans l'ordre alphabétique par nom de fichier dans les sous-répertoires de type de hook.
Pour supprimer les hooks serveur, transmettez une archive tar vide à hook set pour indiquer que le dépôt ne doit contenir aucun hook. Par exemple :
cat empty_hooks.tar | sudo -u git -- /opt/gitlab/embedded/bin/gitaly hooks set --storage <storage> --repository <relative path> --config <config path>
GitLab peut exécuter des hooks serveur en chaîne. GitLab recherche et exécute les hooks serveur dans l'ordre suivant :
<project>.git/custom_hooks/<hook_name> : Hooks par projet. Cet emplacement est conservé pour des raisons de compatibilité ascendante.<project>.git/custom_hooks/<hook_name>.d/* : Emplacement pour les hooks par projet.<custom_hooks_dir>/<hook_name>.d/* : Emplacement pour tous les fichiers de hook globaux exécutables, à l'exception des fichiers de sauvegarde d'éditeur.Dans un répertoire de hooks serveur, les hooks :
Vous pouvez transmettre n'importe quelle variable d'environnement aux hooks serveur, mais vous ne devez vous appuyer que sur les variables d'environnement prises en charge.
Les variables d'environnement GitLab suivantes sont prises en charge pour tous les hooks serveur :
| Variable d'environnement | Description |
|---|---|
GL_ID | Identifiant GitLab de l'utilisateur ou de la clé SSH qui a initié le push. Par exemple, user-2234 ou key-4. |
GL_PROJECT_PATH | Chemin du projet GitLab. |
GL_PROTOCOL | Protocole utilisé pour ce changement. L'un des suivants : http (Git push via HTTP), ssh (Git push via SSH), ou web (toutes les autres actions). |
GL_REPOSITORY | ID du projet GitLab avec un préfixe project-. Par exemple, project-1234 |
GL_USERNAME | Nom d'utilisateur GitLab de l'utilisateur qui a initié le push. |
Les variables d'environnement Git suivantes sont prises en charge pour les hooks serveur pre-receive et post-receive :
| Variable d'environnement | Description |
|---|---|
GIT_ALTERNATE_OBJECT_DIRECTORIES | Répertoires d'objets alternatifs dans l'environnement de quarantaine. |
GIT_OBJECT_DIRECTORY | Chemin du projet GitLab dans l'environnement de quarantaine. |
GIT_PUSH_OPTION_COUNT | Nombre d'options push. |
GIT_PUSH_OPTION_<i> | Valeur d'une option push spécifique où <i> va de 0 à une valeur inférieure à celle définie dans GIT_PUSH_OPTION_COUNT. |
Lorsque les hooks serveur rejettent un push, fournissez des messages d'erreur clairs pour aider les utilisateurs à comprendre pourquoi le push a été rejeté et comment résoudre le problème. Les messages d'erreur personnalisés apparaissent dans l'interface GitLab et dans le terminal de l'utilisateur lorsqu'un hook refuse un push.
Sans messages d'erreur personnalisés, les utilisateurs ne voient que des messages génériques tels que (pre-receive hook declined). Des messages d'erreur clairs aident les utilisateurs à :
Pour afficher un message d'erreur personnalisé, votre script doit :
stdout ou le stderr du script.GL-HOOK-ERR: sans aucun caractère avant le préfixe.Par exemple :
# Bad: Generic message
echo "GL-HOOK-ERR: Commit rejected.";
# Good: Specific message with action
echo "GL-HOOK-ERR: Commit rejected: Commit message must include an issue reference (for example, #1234).";
Lorsque vous travaillez avec des hooks serveur Git, vous pourriez rencontrer les problèmes suivants.
pre-receive hook declined {#error-pre-receive-hook-declined}Lorsqu'un utilisateur pousse vers un dépôt GitLab, il peut recevoir un message d'erreur contenant (pre-receive hook declined). Par exemple :
! [remote rejected] main (pre-receive hook declined)
error: failed to push some refs to 'https://gitlab.example.com/group/project'
Cette erreur indique qu'un hook pre-receive a rejeté le push. Les hooks pre-receive s'exécutent avant la mise à jour de toute référence dans le dépôt. Git fournit trois hooks côté serveur qui peuvent rejeter les pushs :
pre-receive : S'exécute avant la mise à jour de toute référence. Peut rejeter l'ensemble du push.update : S'exécute une fois par branche mise à jour. Peut rejeter des branches individuelles.post-receive : S'exécute après la mise à jour de toutes les références. Ne peut pas rejeter les pushs, mais peut provoquer des erreurs si le hook échoue.L'erreur (pre-receive hook declined) provient généralement du hook pre-receive ou update. Pour identifier le problème :
Vérifiez la sortie immédiatement avant le message (pre-receive hook declined). La sortie contient souvent des informations sur la raison pour laquelle le push a été rejeté. Par exemple :
remote: GitLab: The default branch of a project cannot be deleted.
! [remote rejected] main (pre-receive hook declined)
Consultez les journaux Gitaly pour plus de détails sur la raison de l'échec du hook :
sudo grep PreReceiveHook /var/log/gitlab/gitaly/current | jq .
Si le dépôt a des hooks serveur personnalisés configurés, examinez le code du hook personnalisé pour détecter des problèmes.
Les causes courantes des échecs de hook pre-receive sont les suivantes :
git push --mirror lorsque le dépôt source a une branche par défaut différente de celle du dépôt cible.Pour aider les utilisateurs à comprendre les échecs de hook, utilisez des messages d'erreur personnalisés pour fournir un retour clair sur la raison pour laquelle un push a été rejeté. Les messages d'erreur personnalisés apparaissent dans l'interface GitLab et dans le terminal de l'utilisateur.