Utilisez et abusez des hooks de Git

Git

Git est un système de contrôle de version dont une des caractéristiques est de maintenir en parallèle plusieurs "états"/version d'un même dépôt. Chaque commande git va faire passer un fichier d'un "état" à un autre. Pour une bonne compréhension de chaque commande, vous pouvez vous référer à cet excellent site : http://ndpsoftware.com/git-cheatsheet.html

Les hooks de git vont permettre de lancer une action à quasiment chacune de ces commandes. Cette action est définie dans un script qui est appelé à la commande git correspondante.

.git/hooks

Le répertoire .git/hooks devra contenir le script que l'on souhaite lancer. Git se basera sur le nom du fichier pour lancer le script correspondant à l'action. Des fichiers d'exemple suivants sont déjà présents :

applypatch-msg.sample  pre-applypatch.sample      pre-push.sample
commit-msg.sample      pre-commit.sample          pre-rebase.sample
post-update.sample     prepare-commit-msg.sample  update.sample

Pour toute commande git qui aura une action en local, les scripts utilisés seront ceux présents en local. Pour les commandes qui entrainent une interaction avec le serveur git (remote), les scripts lancés seront ceux présents dans le .git/hooks du repo sur le serveur. Chaque développeur peut ainsi avoir ses propres scripts en local.

Voici quelques d'uasges assez simples :

  • au commit : vérifier que le message de commit est conforme aux spécifications prédéfinies.
  • au add : vérifier que le fichier ajouté contient les entêtes de copyright et de licence si besoin.
  • au push : mettre en prod

Les scripts peuvent être écrits en n'importe quel langage du moment qu'ils peuvent s'éxécuter sur la machine.

Je vais détailler la méthode que j'utilise pour mettre en prod un site statique. J'ai mis à disposition les playbooks ansible correspondants sur mon dépôt github : https://github.com/severinew/deploymywebsite

Mise à jour automatique au push

Pour un site statique, on peut facilement faire une mise en prod avec un hook de Git et lors du git push déposer le code dans le docroot. La commande push est celle qui va aller déposer le code que l'on a en local sur le dépôt remote (sur le serveur). Le script qui va s'appliquer doit donc être présent sur le serveur (là ou on a crée le dépôt avec l'option --bare) : il s'agit du script post-receive. Un exemple de script pour déposer le code dans le docroot :

#!/bin/bash
cd /path/to/docroot/
unset GIT_DIR
git pull
echo "Deploiement en prod"

Prérequis pour ce cas :

  • Le dépôt git remote et le site web se trouve sur le même serveur
  • Le docroot doit avoir les droits en écriture de l'utilisateur correspondant au dépôt git

Pour une mise en place facile d'un tel système, vous pouvez utiliser les playbooks ansible mis à disposition sur mon dépôt github : https://github.com/severinew/deploymywebsite Ces playbooks ont été écrits pour un VPS OVH sous Debian Jessie (Se référer au readme présent sur le dépôt pour plus de détails).


Article suivant : Docker From Scratch : Et si on arrêtait d'utiliser Docker comme une VM ?