Arrêter un changement cassé avant qu’il parte
Une boutique garde ses prix dans un fichier. Quelqu’un efface le prix du thé par erreur et pousse. Toute l’équipe a maintenant une liste cassée.
Un contrôle lancé au moment du push aurait dit non. Les équipes réelles en utilisent toute la journée.
À la fin de cette leçon
Remarque
Je peux faire lancer un contrôle par Git avant qu’un push passe.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Crochet | un script que Git lance à un moment précis |
| Contrôle | un test qui réussit ou échoue |
| Code de sortie | le nombre par lequel un programme finit, 0 pour réussi |
| CI | un serveur qui lance des contrôles à chaque push |
| Exécuteur | la machine qui fait le travail d’une CI |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un crochet est un script lancé par Git
Git cherche dans le dossier .git/hooks des scripts qui portent des noms précis. Un script nommé pre-push se lance juste avant un push. S’il finit par un code de sortie différent de zéro, Git arrête le push.
Le script doit être exécutable. Ici, le contrôle cherche le prix du thé dans prix.txt.
Créer un dossier partagé où pousser
git init --bare -b main partage.gitAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le cloner sous le nom magasin
git clone partage.git magasinAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire un fichier de deux prix
printf 'Cafe 1.50\nThe 1.20\n' > magasin/prix.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le contrôle
printf '#!/bin/sh\ngrep -q "The" prix.txt || { echo "controle echoue : pas de prix du The"; exit 1; }\necho "controle reussi"\n' > magasin/.git/hooks/pre-pushAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Rendre le contrôle exécutable
chmod +x magasin/.git/hooks/pre-pushAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Choisir le fichier
git -C magasin add prix.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
L’enregistrer
git -C magasin commit -m "Ajouter les prix"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pousser et voir le contrôle se lancer
git -C magasin push -u origin mainAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un contrôle qui échoue refuse le push
Cassez maintenant le fichier exprès. Supprimez la ligne du thé et enregistrez. Le contrôle échoue, et Git refuse le push : le commit cassé reste sur votre ordinateur.
Vous annulez ensuite le mauvais commit avec git revert, vu dans la leçon sur annuler une erreur, et vous poussez de nouveau.
Supprimer la ligne du thé
sed -i '/The/d' magasin/prix.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Enregistrer l’erreur
git -C magasin commit -am "Retirer le the par erreur"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Essayer de le pousser
git -C magasin pushAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Annuler l’erreur
git -C magasin revert --no-edit HEADAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pousser de nouveau
git -C magasin pushAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
On croit souvent qu’un crochet fait partie du projet, donc que toute l’équipe l’a. Ce n’est pas vrai. Un crochet vit dans .git, et un clone ne le copie pas. Chacun peut le sauter avec --no-verify. Une équipe a besoin du même contrôle sur le serveur.
La CI lance le même contrôle
CI veut dire intégration continue : un serveur qui lance des contrôles à chaque push. Vous écrivez les étapes dans un fichier gardé dans le dépôt, donc chaque clone a les mêmes règles.
Dans Gitea, le fichier vit dans .gitea/workflows. Le serveur confie chaque tâche à un exécuteur. Le résultat s’affiche sur la pull request : la personne qui relit voit tout de suite un échec.
Exemple travaillé : un fichier de workflow
| Ligne du fichier | Ce qu’elle dit |
|---|---|
| `name: check` | le nom affiché sur la page |
| `on: [push]` | se lancer à chaque push |
| `runs-on: ubuntu-latest` | le genre de machine à utiliser |
| `- uses: actions/checkout@v4` | récupérer d’abord les fichiers du projet |
| `- run: grep -q The prix.txt` | le contrôle lui-même, le même test que le crochet |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le Gitea du labo n’a pas d’exécuteur
Ce fichier fait le travail du crochet. Chaque étape se lance dans l’ordre, et une étape qui finit par un code différent de zéro fait échouer la tâche.
Le Gitea du labo accepte le fichier et note une exécution pour chaque push, mais elle reste en attente. Aucun exécuteur n’est branché, donc rien ne la fait. Une vraie équipe en branche un.