Déploiement d’un site avec Rsync
Pour faire suite à l’article sur l’hébergement d’un site CakePHP sur OVH , nous allons aborder une méthode plus robuste que le FTP pour déployer notre site : la synchronisation des fichiers avec Rsync.
1. Présentation de Rsync
Rsync permet très simplement de synchroniser deux répertoires situés à des emplacements différents, sur la même machine ou un serveur distant. Fréquemment employé dans le monde UNIX pour les sauvegardes de fichiers, cet utilitaire peut également être utilisé comme outil de déploiement. Il propose entre autres avantages de ne copier que les modifications effectuées depuis la dernière synchronisation et de réduire ainsi considérablement le temps de copie des fichiers. De plus comme tout est automatisé, il n’y a plus de risque d’oublier un fichier lors de l’upload FTP et de se retrouver ainsi avec un site cassé, ce dont on ne se rendrait de plus pas forcément compte immédiatement.
OVH propose cette fonctionnalité à partir des hébergement de la gamme Plan, ceux-ci offrant la connexion SSH nécessaire à la copie sécurisée des fichiers. Le principe consiste à exécuter une ligne de commande depuis le dossier de notre application CakePHP. Rsync va alors construire la liste des fichiers modifiés, se connecter au serveur et transmettre les modifications.
2. Mise en place du script
La première chose à faire est d’installer rsync sur votre poste. Sur Linux ou Mac OS X il est normalement pré-installé, pour Windows une version appelée cwRsync est disponible sur le site d’ITeF!x (en anglais). Je n’ai personnellement pas testé la version Windows, à noter qu’il faudra aussi installer SSH, disponible pour Windows sur le site SSHWindows (en anglais).
Nous créons ensuite un script qui contient l’appel à rsync :
1 2 3 | # ./deploiement.sh #!/bin/bash rsync -avz -e ssh . "loginftp@ftp.domaine.com:/home.xx.yy/loginftp/dossier-eventuel" --exclude-from 'exclude.rsync' |
Les paramètres sont les suivants :
avzindique à rsync d’utiliser le mode archive pour parcourir le répertoire récursivement, préserver les permissions, compresser les données, etc.-e sshspécifie le mode de connexion au serveur.indique de démarrer la copie au répertoire courant, la racine de notre site dans laquelle nous avons enregistré le script-
loginftp@ftp.domaine.com:/home.xx.yy/loginftp/wwwreprésente le chemin distant où copier les données.loginftp: nécessaire pour SSH, rsync vous demandera votre mot de passe lors de la connexion (c’est le même que celui de votre compte FTP).home.xx.yy: répertoire où sont stockées vos données sur le serveur, il faut le remplacer par celui de votre compte. On peut le connaître en tapant ‘pwd’ à l’invite de commande une fois connecté en SSH. Sous Windows, il est conseillé d’utiliser le client SSH PuTTY (en anglais)dossier-eventuel: peut être remplacé par n’importe quel répertoire, par exemple si vous déployez sur un sous-domaine ou si vous utilisez cette méthode pour mettre à jour la version de cake que vous aviez installée à la racine de votre compte.
--exclude-from 'exclude.rsync'indique le fichier contenant la liste des fichiers et répertoirs à ne pas uploader, comme la configuration de la base de données (sauf si vous utilisez la méthode de double-configuration), un éventuel fichier .htaccess modifié pour votre serveur local, le dossier /tmp, etc
Voici un exemple de contenu d’un fichier exclude.rsync (simple fichier texte créé à la racine du site, comme le script de déploiement)
1 2 3 4 5 6 7 | # exclude.rsync .svn /tmp .htaccess deploiement.sh exclude.rsync /www/img/upload |
On ignore ici les images uploadées en local lors des tests dans le dossier www/img/upload, ainsi que les dossiers .svn créés par le gestionnaire de source Subversion dont un exemple d’utilisation avec CakePHP fera l’objet d’un prochain article. À noter qu’on utilise le chemin relatif ‘.svn’ pour ignorer tous les chemins contenant cette chaîne, alors qu’on utilise ‘/tmp’ pour indiquer que c’est le répertoire tmp à la racine du site. Sans cette distinction, un répertoire contenant la chaîne ‘tmp’ serait également ignoré.
Sous Windows, on peut créer un fichier .bat qui contient ces instructions, il faudra juste modifier le paramètre ‘.‘ en ‘/cygdrive/c/site-cakephp‘.
Il ne reste plus sous UNIX et Mac OS X qu’à rendre exécutable le script :
1 2 | cd /chemin/vers/le/site chmod +x deploiement.sh |
L’application peut alors être déployée en tapant
1 | ./deploiement.sh |
depuis le répertoire du site. Vous devriez voir rsync construire la liste des fichiers puis transmettre les modifications. La première fois est un peu longue car il doit tout transférer ; vous verrez que les déploiement sont bien plus rapides, de l’ordre de quelques secondes.
Note : pour éviter de taper à chaque fois le mot de passe SSH, il est possible de générer une clé qui sera copiée sur le serveur et votre poste. Je n’ai pas encore testé cette manipulation, il s’agit à priori simplement de :
- générer une clé sur votre poste avec la commande ‘
ssh-keygen -d‘ - copier le fichier ‘
id_ds.pub‘ dans le répertoire ‘.ssh‘ de votre compte et le renommer en ‘authorized_keys‘, ou en recopier le contenu dans le fichier ‘authorized_keys‘ s’il existe déjà
3. Conclusion et autres pistes
Nous avons vu qu’il est très simple de mettre en ligne son site et les futures modifications, sous réserve d’avoir un accès SSH à la machine sur laquelle on déploie. On peut imaginer une extension de cette méthode pour déployer également les changements de la base de données contenus dans des scripts, ou la possibilité de revenir à une version antérieure en archivant la version actuelle à chaque nouveau déploiement.
D’autres outils existent et proposent bien plus de fonctionnalités :
- Capistrano (en anglais), très prisé des développeurs Ruby on Rails, peut aussi être utilisé pour déployer un site CakePHP. Il utilise rsync et votre gestionnaire de sources pour récupérer automatiquement la dernière version de l’application
- Fredistrano offre une interface graphique très agréable et permet de déployer directement depuis votre gestionnaire de sources
Références
Cet article a été inspiré par une page du wiki de Ruby on Rails, HowtoUseRsyncToDeployYourApplication
Commentaires
6 juin 2008 à 10:28
Hi, check also this:
http://blog.devayd.com/?p=8
this is a handy deployment module for Cake we developed.
Regards,
Daniel
9 juin 2008 à 13:08
Très bonne idée un article sur le déploiement et merci pour ta référence à Fredistrano.
Juste une petite remarque sur la méthode décrite ci-dessus:
La synchronisation se fait entre la workingcopy et le serveur de production, ça marche, mais personnellement je pense que faire le rsync entre un export svn et le serveur de prod apporte plusieurs avantages :
- on s’assure d’avoir des sources de qualité dans le gestionnaire de sources puisque on sera obligé de commiter avant de pouvoir déployer
- si on loggue les numéros de version déployées on sait exactement ce que l’on a en production
- on peux déployer une version précise et pas forcément la dernière
enfin c’est le choix que l’on a fait pour Fredistrano
pour info nous travaillons actuellement sur une nouvelle version de Fredistrano qui devrait intégrer les “database migration” ainsi que diverses autres améliorations.
Fred
11 juin 2008 à 15:20
@daniel : I’ll check it out, thanks for sharing !
@fred: en effet je n’avais pas pensé à ces arguments pour le déploiement depuis une version exportée.
Ça doit être simplement adaptable à l’exemple rsync, il suffit de rajouter une ligne au script qui exporte le projet avant et synchroniser à partir de là, avec un argument pour le numéro de version.
Le déploiement avec gestion des migrations est une super idée !