git push prod master

J’utilise git pour mettre mon code sur le serveur de production. Je ne sais pas si c’est une bonne ou un mauvaise pratique. Probablement une pratique OK.

Pour ce faire, j’utilise les hooks de git. Les hooks, ce sont des scripts qui sont exécutables à un moment précis. Par exemple, il y a le hook pre-commit, qui s’exécute après que vous entriez la commande git commit et avant de valider réellement le commit. Je l’utilise par exemple pour faire une validation syntaxique de mon code avant que le commit ne soit ajouter à l’historique (si la validation ne passe pas, le commit n’est pas publié).

Le hook qui nous intéresse ici est le hook post-update, qui s’exécute après que le dépôt ait été mis à jour.

Le fonctionnement

Pour mettre en prod le code, l’astuce est la suivante.

Sur ma machine locale, j’ai ajouter comme remote un dépôt classique origin (GitHub, BitBucket, GitLab…) et un autre dépôt prod présent sur mon serveur de production.

Sur mon serveur, j’ai donc ce dépôt dans une partie privée, et un clone de ce dépôt dans la partie du serveur où doit se situer le code (/var/www par exemple).

Dans le dépôt privée, j’ai ajouté mon hook post-update, qui se charge de faire faire un fetch à mon clone public, en supprimant au passage les fichiers inutiles en prod.

Le setup

Côté serveur

Prenons un exemple d’architecture sur le serveur.

home
|-- www

Dans le dossier /var, je clone le dépôt git du projet en brut.

git clone --bare mon-projet@127.0.0.1

L’arborescence se retrouve modifiée comme ceci.

var
-- mon-projet.git
-- www

Dans le dossier /var/www, je clone le dépôt git présent sur le serveur

git clone /var/mon-projet.git

J’ajoute le script post-update dans le dossier hooks du dépôt brut.

#!/bin/bash

HOME_DIR='/var'

PROD_DIR="$HOME_DIR/www/"

if [ -d $PROD_DIR ]
then
	cd $PROD_DIR
else
	echo "Le dossier n'existe pas."
	exit 1
fi

echo $'\n━━━━━━━━━━━━ MISE EN PRODUCTION ━━━━━━━━━━━━\n'

#GIT
unset GIT_DIR
echo $'\n━━━ Git fetch and force apply ━━━━━━━━━━━━━━━━━━━━━'
git fetch --all
git reset --hard origin/master

# COMPOSER
echo $'\n━━━ Composer install ━━━━━━━━━━━━━━━━━━━━━━━'
composer install --no-dev

#CLEANING
echo $'\n━━━ Cleaning working directory ━━━━━━━━━━━━━'
echo $'Deleting dev files and silencing .git folder...\n'
rm -rf src .gitignore *.json *.lock *.md
echo "<?php // Silence is golden." > .git/index.php

Et je n’oublie pas de le rendre exécutable.

chmod +x /var/mon-projet.git/hooks/post-update

Côté client

Dans mon dossier de travail, j’ajoute le dépôt brut du serveur comme remote.

git remote add prod ssh://user@server-ip/var/mon-projet.git

C’est tout. Il suffit maintenant de faire un git push prod master pour que

  • le code soit synchronisé avec le dépôt brut du serveur de production,
  • le serveur de production synchronise le dossier public et efface les fichiers inutiles en prod.
CatégoriesdevÉtiquettes