Phing
26 juillet 2010Présentation
Principe
Phing (Phing Is Not Gnu make) est un outil de déploiement permettant d’automatiser une suite d’opérations. Il est comparable à Make (généralement utilisé pour les développements en C et C++) et Ant (le plus souvent utilisé dans le cadre de développements en Java). Comme ces deux outils, il permet de définir une série de tâches à accomplir et des dépendances entre ces tâches. Sur beaucoup de points, Phing ressemble à Ant sur lequel il est basé directement.
Phing est un outil programmé entièrement en PHP, développé en open source (Gnu Lesser General Public License). Toute la documentation, et le code source sont disponibles sur le site suivant : http://www.phing.info/trac/
Installation
L’installation de Phing est très aisée, que ce soit sur Linux ou Windows : elle se fait en utilisant le package manage Pear :
pear channel-discover pear.phing.info
pear install phing/phing-beta
Nous avons également installé l’extension pour utilisation native de SVN :
pear install VersionControl_SVN-0.3.3
Dans notre cas, il a aussi été nécessaire d’installer SSH2, la librairie PHP permettant de se connecter en SSH :
pecl install SSH2-0.11.0
Utilisation
Phing est un outil en ligne de commande, qui s’appelle simplement en tapant la commande :
phing
Si l’on veut exécuter une tâche particulière, il suffit de la spécifier de cette façon :
phing <task name>
Fonctionnement
Lorsque phing s’exécute, il va chercher le fichier ‘build.xml’ à l’emplacement du dossier courant, et exécute la tâche spécifiée ou la tâche par défaut du fichier.
Le fichier build.xml est un fichier xml de ce type :
<?xml version=”1.0″?>
<project name=”build” default=”main”>
<property value=”.” />
<property value=”svn” />
<target depends=”update-back”/>
<target>
<svnupdate
svnpath=”${svn_path}”
todir=”${project_root}”
nocache=”true” />
</target>
</project>
Le tag project définit le projet, la propriété default est le nom de la tâche appelée par défaut.
Les tags ‘property’ correspondent à des variables. La propriété name en est le nom, et value la valeur. Il peut s’agir de chaines de caractères, ou de listes de chaines de caractères séparées par une virgule.
Les tags ‘target’ correspondent à des tâches. La propriété name est le nom d’appel de la tâche. La propriété depends est la liste des autres tâches à exécuter avant la tâche courante. A l’intérieur du tag, les autres tags sont la liste des commandes à exécuter par le script. Pour la tâche update-back par exemple, il s’agit d’un svn update.
Il existe un certain nombre de commande exécutables par défaut :
exec : exécute une ligne de commande
foreach : parcours un tableau et pour chaque élément renvoie vers une autre tache avec l’élément en argument
et différentes autres : chmod, chown, delete, move, etc. La documentation complète est disponible ici : http://phing.info/docs/guide/trunk/
Usage sur un projet spécifique PHP/Symfony
Choix de Phing
Phing a été choisi, plutôt que Ant ou Make pour une raison principale : c’est un outil fait en PHP. Cela apporte les gains suivants :
- Facilité d’utilisation pour une équipe PHP
- Pas besoin d’installer Java ou d’autres utilitaires sur nos serveurs
- Possibilité d’écrire du code PHP directement dans une tâche si nécessaire
- Possibilité d’étendre l’outil en créant de nouvelles tâches en cas de besoin
Tâches disponibles
Les tâches suivantes on été créées dans le cadre de notre projet. Toutes ont été écrites pour être appelées depuis le serveur de backend. Le fichier build.xml est présent sur le serveur de backend, et est dans svn à la racine de la branche de production.
Celles-ci ont été écrites pour être appelées par des tâches principales, elles ne devraient pas être appelées individuellement :
update-back : update la copie locale du backend
rollback-back : revert la copie locale du backend jusqu’à la révision spécifiée
clear-backend-cache : vide le cache symfony du backend
update-filer : update la copie locale du filer
rollback-filer : revert la copie locale du filer jusqu’à la révision spécifiée
clear-frontend-cache : vide le cache symfony des serveurs frontaux
Celles-ci sont les tâches principales, qui peuvent être appelées directement :
main : (tâche par défaut), elle appelle update-back, update-filer et clear-backend-cache. Elle permet d’effectuer une livraison sans risque sur les frontaux – mais dont les effets ne pourront peut-être pas être vus immédiatement car les caches ne sont pas vidés.
cc : elle appelle main et clear-frontend cache. Elle sert à effectuer une livraison avant 9h.
rollback : elle prend en argument une révision, et appelle les tâches rollback-back, rollback-filer et clear-backend-cache. Elle permet de faire un retour arrière sans risque sur les frontaux – mais dont les effets ne pourront peut-être pas être vus immédiatement car les caches ne sont pas vidés.
rollbackcc : elle prend en argument une révision, et appelle les tâches rollback et clear-frontend-cache. Elle sert à faire un retour arrière avant 9h.
Gain par Phing
Phing a été mis en place il y a une semaine. Les gains déjà visibles sont :
- Facilité des déploiements, moins fastidieux
- Sécurité des déploiements : plus de problème d’oubli d’un update ou d’un vidage de cache
- Rapidité des déploiements : 30 secondes d’opération au lieu de plusieurs minutes
- Maintien de la simplicité des déploiements en cas d’évolution de l’architecture système (par exemple, lors de l’ajout d’un frontal, il suffit d’ajouter son IP dans la liste des frontaux, et le processus de déploiement reste valide)
Evolutions futures
Phing est un outil extrêmement flexible, voici quelques évolutions possibles de son utilisation :
- Passage de tests automatiques dans la foulée du déploiement pour le valider
- Automatisation des évolutions de base de données en utilisant les outils symfony appropriés
- Validation de l’absence de conflit SVN lors du déploiement






