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).