• Share on Google+

Il m’arrive très souvent de travailler sur des projets nécessitant des mises à jours régluières, parfois quotidiennes. Il devient alors intéressant de mettre en place un workflow de déploiement, afin de pouvoir mettre en ligne facilement et rapidement.

Avant de commencer, je précise bien qu’il existe une multitude de technologies permettant de déployer son code en ligne. La plus connue est Capistrano et a de très nombreux atouts, mais j’ai choisi Github parce que c’est une technique facile à mettre en place et indépendante de tout environnement de développement (Capistrano étant développé en ruby).

Cet article va donc vous permettre de mettre en place un workflow de déploiement rapide sur un dédié, sans conflit avec votre workflow actuel. Concrêtement, vous aurez juste une remote supplémentaire sur laquelle vous pourrez pousser votre code (par exemple, git push prod master). Nous utiliserons les hooks Github pour automatiser certaines tâches, qui se déclencheront après une modification précise sur le repo git.

Configurer le serveur

Tout d’abord, admettons que votre site soit masuperstartup.com et que votre dossier racine sur votre serveur dédié soit ~/ (dossier de l’utilisateur). Je précise bien que la nomenclature utilisée ci-dessous est un choix personnel, libre à vous d’utiliser l’arborescence que vous désirez.

Vous allez devoir créer 2 dossiers :

  • ~/www/masuperstartup.com, dossier qui contiendra le code qui sera executé par votre serveur web. C’est vers ce dossier que vous devrez faire pointer votre virtual host Apache / Nginx.
  • ~/www/masuperstartup.com.git, dossier qui contiendra le repository de votre site.

En commandes (je suis dans le dossier wwww) :

mkdir masuperstartup.com
mkdir masuperstartup.com.git
cd masuperstartup.com.git
git init --bare 

La dernière commande va nous servir à initialiser notre repo git, et l’option --bare permet d’utiliser uniquement le version control.

Mettre le repo et les hooks en place

Le repo git que vous venez de créer contient un dossier hooks, qui contient des fichiers qui correspondent à des comportement que vous pouvez executer en fonction d’actions effectuées sur le repo. En voici quelques-uns :
pre-push, executé pendant un push, juste avant que les objets soient transférés (utile pour nettoyer un cache, par exemple).
post-merge, executé juste après un merge.
post-update, executé après une mise à jour des fichiers. C’est celui va nous intéresser.

Une documentation plus précise sur les hooks est disponible ici : https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks.

On va donc créer le fichier post-update et le rendre executable :

touch post-update
chmod +x post-update

Dès qu’une mise à jour sera faite sur le code de ce repo, le script sera executé.

Préparer le dossier de déploiement

Nous allons maintenant faire en sorte que le code copié sur le repository configuré plus haut soit copié automatiquement dans le dossier lié à notre virtual host. On se rend donc dans le dossier en question, et on intialise un repo git (sans le –bare, car ce dossier va contenir les sources).

cd ~/www/masuperstartup.com
git init

Facile, non ? Maintenant, on va rajouter une remote qui va correspondre au repository mise en place plus haut.

git remote add origin {chemin en absolu vers le repo}

Le chemin en absolu vers le repo sera, dans notre cas, /home/tristan/www/masuperstartup.com.git. À ce stade, tout est configuré correctement sur votre serveur.

Écrire le script de déploiement

Il nous reste encore à écrire le script de déploiement.

#!/bin/bash
echo "-- PUSHING IN PRODUCTION ..."
cd ~/www/masuperstartup.com
git pull origin master
echo "-- PUSHED IN PRODUCTION !"

La première ligne sert à rendre le code executable, la deuxième et la dernière sont simplement des indications quant au déploiement. Les plus importantes sont la 3ème et 4ème : on se rend dans le dossier crée à la partie précédente, et on fait uniquement un pull de la remote origin.

Nous pouvons ensuite mettre en place des scripts un peu plus complexes. Par exemple, pour un serveur de preprod en Laravel, ce script réinitialisera l’autoload, mettra les dépendences à jour, et réinstallera la base de données.

#!/bin/bash
echo "-- PUSHING IN PRODUCTION ..."
cd ~/www/masuperstartup.com
git pull origin master
php /usr/local/bin/composer dump-autoload
php /usr/local/bin/composer install
php /usr/local/bin/composer update
php artisan migrate:refresh --seed
echo "-- PUSHED IN PRODUCTION !"

Déployer !

Il ne vous reste plus qu’à vous rendre dans votre ordinateur, dans votre dossier de travail, et à rajouter une remote qui correspond au dossier git sur votre dédié. Ici, c’est la même commande que sur votre dédié, en utilisant ssh et en en changeant le nom de la remote (ici je l’appelle prod, mais vous pouvez l’appeler preprod, live, beta …) :

git remote add prod ssh://{utilisateur}@{mon ip}/{chemin vers le repo}

Admettons, j’ai un serveur d’IP 10.10.10.10 (fonctionne aussi avec un nom de domaine), mon user s’appelle tristan, et le chemin vers le repo est /home/tristan/www/masuperstartup.com.git. Voilà la commande que je vais devoir executer :

git remote add prod ssh://tristan@10.10.10.10/home/tristan/www/masuperstartup.com.git

Vous l’avez deviné, vous n’avez qu’à faire un git push prod master, et votre code sera automatiquement envoyé vers le dédié, et le script executé.