
post-receive est un hook proposé par GIT qui permet d’exécuter des actions à chaque push.
Ce script ne peut être installé que sur un dépôt de type bare (créé avec git init --bare
). En général ce genre de dépôt se retrouve sur les serveurs uniquement.
Dans l’exemple vous aller voir pas à pas la procédure pour créer le dépôt, le dossier de déploiement et le script post-receive.
Le scénario est le suivant, vous avez un projet GIT qui doit être déployer sur un serveur WEB (apache, Linux) et vous souhaiter automatiser tout cela.
Les pré-requis sont, un accés SSH au serveur (avec ou sans clé SSH).
Créer le dépot ‘bare’ sur le serveur : cd dossierDest && git init --bare
Ajouter ce dépôt en tant que remote ‘PROD’ sur votre poste : git remote add PROD user@serveur:
pathDepot
A partir de la vous pouvez push/pull sur ce remote avec : git pull PROD master
ou git push PROD master
C’est cette commande qui sera utilisée ensuite pour déployer le site
Sur le serveur dans le dossier du dépots, allez dans le dossier hooks et créer un fichier post-receive avec le contenu ci-dessous. Adapter les variables à votre environnement.
Le script ‘post-receive’ commenté
#!/bin/bash # script de publication du site lors d'un push dans le depot # nom du projet PROJET="monProjet" # path du depot bare git sur le serveur REPO="/home/git/monProjet" # dossier de destination, celui utilisé par le virtualhost apache en général DEST="/home/git/exports/monProjet" # dossier pour stocker un zip # avant chaque deploiement un zip de l'ancienne version est créé BACK="/home/git/_backups" # date du jour au format aaaammjj-hhmm TODAY=`date +"%Y%m%d-%H%M"` # nom du zip ARCHIVE="$BACK/$PROJET-$TODAY.tgz" echo "Backup du site existant dans $ARCHIVE" tar czf $ARCHIVE $DEST if [ -d "$DEST" ]; then echo "Export des fichiers 'master' pour le deployement" cd $DEST git --work-tree=. --git-dir=$REPO checkout -f master else echo "Dossier $DEST introuvable, post-receive stop!" fi
Modifier le fichier post-receive pour qu’il soit exécutable : chmod +x post-receive
Maintenant si vous faite depuis votre poste : git push PROD master
, dans le log vous verrez les commandes du post-receive
[master 566d125] test push serveur prod 1 file changed, 1 insertion(+), 1 deletion(-) Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 8 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 276 bytes | 276.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 remote: Backup du site existant dans /xxx/git/_backups/xxxxxx-20230211-1037.tgz remote: tar: Suppression de « / » au début des noms des membres remote: Export des fichiers 'master' pour le deployement remote: Déjà sur 'master' To xx.xx.xx.xx:zzzzzzzz 7fa4ae4..566d125 master -> master
En résumé, avec git push
, vous mettez à jour le dépôt principal (origin). Pour mettre en production vos modifications vous utiliser : git push PROD master
Pour chaque déploiement, le script créé un fichier zip dans le dossier $BACKUP
. Si besoin vous pouvez ainsi restaurer une version précédente en cas de problème sur le déploiement.