Déploiement Web simplissime : rsync

Le déploiement automatisé réduit à sa plus simple expression

En complément de mon article sur la configuration d’un poste de développement PHP avec VirtualBox, Vagrant, puPHPet, et Symfony 3.x ; voici un guide pour réaliser des déploiements simples au possible grâce à rsync.

L’objectif de cet article est de vous permettre de réaliser des déploiements automatisés le plus rapidement possible et avec un minimum de configuration.

Dans le cadre d’un projet Web, projet PHP classique ou projet Symfony, plusieurs stratégies de déploiement peuvent être utilisées : copie manuelle, ftp, ssh, hook github, voir outil intégré au projet où à l’IDE que vous utilisez (PhpStorm, NetBeans,…).

L’idée ici est de présenter une méthode qui marche dans tous les cas de figure, les seuls pré-requis étant les deux points suivants :

  • Pouvoir exécuter la commande rsync localement (Linux, Mac OS, Cygwin, MinGW sur windows) ET sur le serveur distant
  • Disposer d’un accès SSH au serveur distant

La commande rsync

Si vous ne connaissez pas l’utilisation de cette commande, qui permet de synchroniser deux systèmes de fichiers (source, destination), je vous invite à lire (même en diagonale) cette page explicative.

Pour résumer, la commande suivante nous permettra de synchroniser la liste des fichiers présents dans l’emplacement source avec les fichiers présents dans l’emplacement destination :

$ rsync source destination

On utilisera de plus les options -a, -z, et -v respectivement pour la récursion, la compression et le mode verbeux. Ce qui donnerait, à la racine du dossier des sources de notre projet web :

$ rsync -avz . user@serveur:dossier

Voilà qui suffirait pour copier les fichiers modifiés de votre poste de développement vers votre serveur de production. Pour avoir un peu plus de flexibilité et pouvoir indiquer facilement les fichiers à ne pas copier, on va ajouter un fichier à la racine du projet.

Le fichier .rsyncignore

Rendez vous à la racine de votre projet et créez-y un fichier appelé .rsyncignore, qui servira à contenir la liste des fichiers que vous voulez ignorer lors de vos déploiements.

Le fichier pourrait techniquement s’appeler n’importe comment, mais on décide de garder la “convention” des fichiers .ignore que sont .gitignore, .svnignore, .slugignore, etc…

exemple de fichier .rsyncignore

La nouvelle commande permettant de déployer nos fichiers devient donc, après ajout de l’option exclude-from qui permet de spécifier une liste d’exclusion :

$ rsync -avz --exclude-from '.rsyncignore' . user@remote:remotedir

Et voilà ! En une commande, on déploie nos fichiers vers notre serveur. Mais comme c’est toujours trop de travail de taper cette commande, on va encore simplifier la chose en créant un script shell permettant d’exécuter cette commande, entre autres.

Le script de déploiement

Rendez vous à la racine de votre projet et créez-y un fichier appelé deploy.sh, qui servira à lancer les différentes commandes à exécuter à chaque déploiement :

#!/bin/sh

rsync -avz --exclude-from '.rsyncignore' . user@remote:remotedir
ssh user@remote 'cd remotedir; php bin/console cache:clear --env=prod'

La première ligne lance rsync de manière à synchroniser les fichiers depuis le poste local vers le serveur distant, en se servant de la liste d’exclusions du fichier .rsyncignore crée précédemment.

La deuxième ligne se connecte via SSH au serveur distant ; va dans le dossier de notre application et va lancer la commande de vidage du cache de l’application Symfony pour l’environnement de production.

Après avoir rendu le fichier exécutable (chmod +x), il ne vous reste plus qu’à lancer le déploiement :

$ ./deploy.sh

Et vous avez d’une pierre deux coups, à la fois la copie des fichiers et l’effacement du cache de l’application. Malgré tout vous remarquerez que le script va vous demander le mot de passe pour se connecter au serveur distant vers lequel vous envoyez vos fichiers, nous allons améliorer ça tout de suite.

Echange de clés SSH

Pour éviter que le script de déploiement ne nous demande notre mot de passe d’accès au serveur distant à chaque fois que nous lançons la commande, il suffit de faire connaître notre clé publique auprès du serveur distant.

Nous allons donc générer un couple de clé publique / privée, puis copier notre clé publique sur le serveur distant sur lequel nous déployons nos fichiers.

Générer votre couple clé privée/publique :

$ ssh-keygen -t dsa

Puis envoyez là sur le serveur distant :

$ cat ~/.ssh/id_dsa.pub | ssh user@remote 'cat - > ~/.ssh/authorized_keys'

Vous pouvez donc désormais relancer votre déploiement qui s’effectuera cette fois sans interruption :

$ ./deploy.sh

Si vous avez besoin de plus amples détails sur la génération et l’échange de clés, vous pouvez vous référer à cet article ou encore celui-là.

Le cas particulier d’AWS

Les versions standards de containers EC2 d’Amazon Web Services utilisent un fichier .PEM pour permettre de se connecter en SSH.

Pour utiliser notre script rsync afin de déployer nos fichiers vers un container EC2, il nous faudra simplement indiquer dans notre commande rsync le chemin vers le fichier .PEM en question, soit :

rsync -avz 'ssh -i /chemin/fichier.PEM' 
--exclude-from '.rsyncignore' . user@remote:remotedir

C’est tout pour aujourd’hui, bon déploiement !

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.