Déployer un projet GIT avec ‘post-receive’

Classé dans : Programmation | 0

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.