Gérer le cycle de vie d'une application PHP avec Phing
Date de publication : 20 february 2010
Par
Fabien Arcellier
Vous venez de livrer votre produit, un problème apparait.
vous êtes fatigué, un seul fichier PHP semble incriminé. Vous le corrigez.
Vous décidez de passer outre votre procédure de livraison. Vous transférer
directement le script PHP "corrigé" sur le serveur de production et là, c'est le drame ...
C'est une situation où aveuglé par la fatigue, l'on s'en veut
de s'être comporté comme le pire des débutants. Phing est la
solution pour éviter qu'un tel problème ne se reproduise.
I. Présentation
II. Les avantages de Phing :
II-A. Il centralise les informations de build dans un seul
fichier
II-B. Il fonctionne sur toutes les plateformes où PHP est
disponible
II-C. Il supporte un grand nombre d'outils PHP
II-D. Il est documenté
II-E. Il est extensible
II-F. Il s'intègre dans un processus d'intégration continue
III. Comment installer Phing ?
III-A. Installer Phing avec PEAR
III-B. Installer Phing sans utiliser PEAR
IV. Ecrivez votre premier script build.xml pour Phing
IV-A. Les fichiers PHP
IV-B. Le fichier build.xml
IV-C. Exécutez l'opération de build
IV-D. L'entête du build
IV-E. Les tâches du script
V. Les autres exemples
V.1. 02-helloworld-package-release-by-version-in-zip
:
V.2. 03-helloworld-unittest-codesniffer-phpdocumentor
VI. Survol des outils utilisables avec Phing
VII. Pour conclure
VIII. Liens pour aller plus loin
I. Présentation
Phing est un outil inspiré d'apache Ant destiné à PHP.
Vous pouvez l'utiliser pour prendre en charge certaines étapes du
le cycle de vie de vos projets tels que la génération de code, la
construction des releases, la génération de la documentation,
la génération de rapports (tests unitaires, couverture du code, aspect du code, ...),
le déploiement dans différents environnements, ...
Vous découvrirez, au travers de ce document :
- les avantages de Phing par rapport à un système de build construit à partir de scripts consoles;
- l'installation de Phing et la mise en oeuvre d'un script de build;
- 2 exemples exécutables pour découvrir les services offerts par Phing;
- les principaux outils supportés par Phing.
II. Les avantages de Phing :
Phing a de nombreux avantages comparé à un système de build
plus archaïque construit à partir d'un ensemble de scripts de déploiement (fichiers PHP, Shell ou batch),
II-A. Il centralise les informations de build dans un seul
fichier
Toutes les informations dont Phing a besoin pour fonctionner sont
rassemblées dans le fichier build.xml. Vous y décrivez toutes les tâches
que vous souhaitez réaliser. Vous pouvez construire des groupes de
tâches (appelé target) réutilisables.
le fichier build.xml est suffisament verbeux pour être
compréhensible par un autre développeur lors sa lecture sans connaissance
préalable.
II-B. Il fonctionne sur toutes les plateformes où PHP est
disponible
Phing est codé en PHP. Vous pouvez donc
l'utiliser à partir du moment où PHP est installé sur votre système.
|
Certaines fonctionnalitées avancées peuvent ne pas
fonctionner partout (par exemple, CHMOD).
|
II-C. Il supporte un grand nombre d'outils PHP
L'écosystème d'applications destinées à améliorer l'écriture
du code PHP est très riche. Ces applications ont l'inconvénient de ne
pas suivre les mêmes conventions ou la même logique. Phing intègre un grand
nombre de tâches dédiés à des applications PHP. PEAR permet d'installer
ces applications qui seront directement disponible dans Phing.
Chacun de ces outils se configure de façon similaire. Ce canevas est
utile pour paramétrer efficacement chacune d'entre elles avec un
minimum d'effort sans sacrifier pour autant les réglages avancés.
II-D. Il est documenté
La documentation est d'excellente
qualité et détaille avec précision le rôle et la configuration de
chaque tâche. Que celle ci fasse partie du noyau de Phing ou soit rattachée à un
outil externe, vous trouverez fréquemment des exemples clairs et
concis. Malheureusement, elle n'est pour le moment disponible qu'en
anglais.
II-E. Il est extensible
Vous pouvez étendre Phing pour y ajouter de nouvelles tâches.
Ainsi vous pourrez utiliser vos propres outils irremplaçables ou
non implémentés. Le système d'extension est documenté. Vous
trouverez un chapitre entier dans la documentation officielle
détaillant les possibilités, proposant des templates pour travailler
et expliquant pas à pas le processus de conception d'une nouvelle tâche.
II-F. Il s'intègre dans un processus d'intégration continue
Phing facilite la mise en place d'un processus d'intégration
continue. Il est utilisable avec la plupart des outils :
Cruise control,
Hudson, Xinc ...
III. Comment installer Phing ?
Phing est disponible sous la forme d'un package PEAR. L'installation
, la communication avec les applications tiers et la mise à jour
de votre environnement est plus facile par ce moyen.
III-A. Installer Phing avec PEAR
|
Cet article ne couvre pas l'installation de PEAR. Si vous
souhaitez vérifier sa présence sur votre ordinateur, rendez vous sur
le manuel de PEAR.
|
Pour installer Phing, tapez la commande suivante dans une console :
Installer Phing avec PEAR |
pear channel-discover pear.phing.info
pear install phing/phing
|
Pour mettre à jour Phing, tapez la commande suivante :
Mettre à jour Phing avec PEAR |
|
III-B. Installer Phing sans utiliser PEAR
|
Vous devriez éviter cette méthode. Phing fait appel à des
applications tiers fréquemment installés grâce à PEAR,
par exemple, PHPunit ou PHPdocumentor. L'installation de votre
environnement de travail peut s'avérer délicate et souffrir d'un
manque de cohésion.
|
Pour commencer, rendez vous sur
le site de Phing et télécharger la
dernière version stable (la 2.4.0 à la date de cet article).
Etapes à suivre pour installer Phing sans PEAR
- Décompressez la distribution dans un dossier. Par la suite,
nous ferons référence au chemin d'accès de ce dossier en temps que
PHING_HOME,
-
Ajoutez dans la variable d'environnement PATH le chemin
complet PHING_HOME/bin,
-
Assignez à la variable d'environnement PHING_HOME, le chemin
complet de PHING_HOME,
-
Assignez à la variable d'environnement PHP_COMMAND, le chemin
complet du répertoire contenant l'exécutable php.exe,
-
Assignez à la variable d'environnement PHP_CLASSPATH, le
chemin complet du répertoire PHING_HOME/classes,
-
Si vous faites appel à d'autres outils à partir de Phing
(PHPUnit, ...), vous devrez probablement ajouter leur chemin dans
PHP_CLASSPATH (séparé par un ;).
|
A la place de PHP_CLASSPATH, vous pouvez ajouter le chemin
complet du répertoire PHING_HOME/classes à la variable PHP
include_path.
|
IV. Ecrivez votre premier script build.xml pour Phing
Maintenant que Phing est installé, vous êtes prêts à lancer un
build.
Ce premier projet est composé de 3 fichiers:
-
helloworld.php : Ce script affiche "Hello world" sur la
sortie standard,
-
phpinfo.php : Ce script affiche le phpinfo de votre environnement php,
utile durant le développement,
-
build.xml : Script XML de configuration de Phing.
Votre premier fichier de build copiera le script helloworld.php dans
un sous dossier build/release (qu'il créera si celui ci n'existe
pas).
IV-A. Les fichiers PHP
Le code de ces fichiers est simple. L'objectif de cet article n'est pas
d'écrire du PHP.
helloword.php |
<?php
echo ' hello world ' ;
?>
|
IV-B. Le fichier build.xml
Voici le fichier que vous allez exécuter. Vous trouverez l'
explication détaillée de chacun des éléments par la suite.
build.xml |
<? xml version="1.0" encoding="UTF-8"? >
< project name = " SimpleHelloworld " basedir = " . " default = " build " >
< target name = " build " >
< echo msg = " Debut du build " / >
< echo msg = " Création du répertoire build " / >
< mkdir dir = " ./build " / >
< echo msg = " Création du répertoire release " / >
< mkdir dir = " ./build/release " / >
< echo msg = " Copie du fichier helloworld.php vers build/release/helloworld.php " / >
< copy file = " helloworld.php " tofile = " ./build/release/helloworld.php / " >
< echo msg = " Fin du build " / >
< / target >
< / project >
|
IV-C. Exécutez l'opération de build
Pour exécuter votre build, vous devez ouvrir une console
dans le répertoire du projet. Tapez simplement Phing.
Vous devez obtenir une sortie sensiblement équivalente sur votre console |
Buildfile: D:\Programings\Projects\0019-PhingDiscoveryArticle\svn\trunk\app\01-simple-helloworld\build.xml
SimpleHelloworld > build:
[echo] Debut du build
[echo] Creation du repertoire build
[mkdir] Created dir: D:\Programming\Projects\0019-PhingDiscoveryArticle\svn\trunk\app\01-simple-helloworld\build
[echo] Creation du repertoire release
[mkdir] Created dir: D:\Programming\Projects\0019-PhingDiscoveryArticle\svn\trunk\app\01-simple-helloworld\build\rel
ease
[echo] Copie du fichier helloworld.php vers build/release/helloworld.php
[copy] Copying 1 file to D:\Programming\Projects\0019-PhingDiscoveryArticle\svn\trunk\app\01-simple-helloworld\buil
d\release
[echo] Fin du build
BUILD FINISHED
Total time: 0 .4153 seconds
|
Vérifier que Le fichier helloworld.php a bien été copié dans le sous dossier build/release.
IV-D. L'entête du build
Build.xml commence toujours par la balise project.
Le noeud project |
< project name = " SimpleHelloworld " basedir = " . " default = " build " >
|
Les arguments de project :
- name : C'est le nom du projet. Cet argument
n'influe pas sur l'exécution de script
- basedir : C'est le répertoire d'exécution du script.
Dans cet exemple, le répertoire d'exécution est
le répertoire contenant le script.
- default : C'est le nom de la target (cible) exécutée
par défaut si aucun argument n'est transmis à Phing
au moment de l'exécution.
IV-E. Les tâches du script
Pour configurer vos taches, vous les groupez dans une balise
target. Ici, elle s'appelle build.
Comme l'instruction echo, la tache echo affiche un message
sur la sortie standard.
La tache echo |
< echo msg = " Debut du build " / >
|
Pour créer un dossier, vous utilisez la tache mkdir. L'argument
dir contient le chemin du dossier à créer. Si le dossier existe déjà, Phing passe à la tache suivante.
Pour copier un fichier, vous utilisez la tache copy. L'argument
file contient le chemin du fichier dont vous souhaitez copier le contenu et
l'argument tofile le chemin du fichier où vous souhaitez coller le contenu.
la tache copy |
< copy file = " helloworld.php " tofile = " ./build/release/helloworld.php / " >
|
V. Les autres exemples
Les 2 exemples supplémentaires, disponible dans le
package d'exemples,
vous donneront un meilleur aperçu du potentiel de Phing. Je ne les
détaillerai pas. Je vous encourage à les exécuter et à ouvrir le fichier build.xml pour chacun d'eux.
|
Pour les utilisateurs de Windows, chacun des projets contient un
fichier cmd.bat pour ouvrir une console dans le dossier courant.
|
V.1. 02-helloworld-package-release-by-version-in-zip
:
Cet exemple illustre l'utilisation de propriétés pour
configurer le build et la compression au format ZIP.
README.dev.txt |
Qu'est ce que c'est ?
----------------------
Cet exemple présente un build simple permettant
d'auto archiver chacune de ses releases. Ce build est adapté à
des petits projets où vous travaillez seul.
Le fichier build.xml propose les opérations suivantes
# Déploiement de l'application dans l'environnement de debug
# Déploiement de l'application dans l'environnement de release et création
d'un package avec le numéro de version (Si un package existe, il ne sera pas
remplacé et le script affichera un message d'erreur)
# Déploiement forcé de l'application dans l'environnement de release et
création /remplacement d'un package avec le numéro de version
Pour changer le numéro de version, vous devez éditer le fichier build.xml.
Pour un simple helloworld, ce déploiement est trop lourd mais vous pouvez l'adapter
à la majorité de vos applications. Les prérequis sont peu nombreux.
Quels sont les fonctionalités de Phing utilisés ?
--------------------------------------------------
Les fonctionnalités de Phing utilisées sont :
- AvailableTask : Vérifier qu'un dossier ou un fichier est disponible
- CopyTask : Copier un ou des dossiers / fichiers
- DeleteTask : Supprimer un ou des dossiers / fichiers
- ExitTask (FailTask) : Arrêter l'exécution d'un script
- Fileset : Balise xml pour définir les fichiers concernés par une tache
- IfTask : Prise de décision durant le build
- PropertyTask : Utiliser des variables permettant de modifier
la configuration du build
- Target : Utiliser des targets dépendantes les unes des autres
- ZipTask : Compresser un ou des dossiers / fichiers grâce à l'algorithme Zip
dans un seul fichier
|
V.2. 03-helloworld-unittest-codesniffer-phpdocumentor
Pour cet exemple, vous devrez installer PHPUnit,
Php_CodeSniffer et PhpDocumentor dans votre environnement PHP. Vous
y découvrirez comment utiliser la date pour packager une release.
README.dev.txt |
Qu'est ce que c'est ?
----------------------
Cet exemple présente un build plus complexe exécutant les tests unitaires
PHPUnit, vérifiant que le code respecte la convention de code du projet PEAR
grace à PHP_CodeSniffer et génère la documentation de l'API en utilisant PhpDoc.
Comme dans les projets précédents, nous allons sortir un package au format zip
incluant le numéro de version, la date de l'exécution et le statut des tests
unitaires qui ont été exécutés.
Le nom du package se présentera de la façon suivante
NomDuProjet-Version-YYYY-MM-DD-hh-mm-ss-TestsResult
Sur ce type de projet, l'emploi d'un serveur de version serait un gros plus.
Pour cet exemple, nous allons volontairement l'omettre pour raisons de facilité de
mise en oeuvre.
Note : Dans la pratique, si vous n'avez pas de serveur de versionning, vous
pouvez figer votre environnement dans une archive en excluant le dossier contenant
tous les packages de release. Ainsi, vous pourrez revenir à une version differente
de votre developpement en quelques clics. Vous pourrez egalement utiliser un outil
tel que winmerge pour comparer vos 2 versions de votre projet. Il ne s'agit que
d'un paliatif valable si vous travaillez seul, un serveur de versionning reste
idéal et rends beaucoup plus de services que le simple archivage.
Dans cet exemple, vous découvrirez une méthode pour factoriser le code
commun à chacun de vos builds dans un fichier séparé (Utile dans le cadre de l
industrialisation de vos projets)
Le fichier build.xml propose les opérations suivantes
# Exécution des tests PHPUnit
# Exécution des tests PHP_CodeSniffer (Le fichier app/function.php declenche 2
warnings)
# Génération de la documentation d'API
# Exécution de toutes les operations de quality assurance (documentation, tests)
# Déploiement de l'application dans l'environnement de debug
# Déploiement de l'application dans l'environnement de release
# Packaging de l'application au format ZIP
Quels sont les fonctionalités de Phing utilisés ?
--------------------------------------------------
# PhingTask : Vous pouvez appeller une target dans un autre fichier de build
Utile pour factoriser le code de vos builds;
# PhpUnitTask : Vous exécutez les tests unitaires grace à cette tache. C'est
non compatible avec les suites de tests. Phing construit ces propres suites;
# PhpCodeSnifferTask : Vous vérifiez avec cette tache le style de votre code
grace à PHP_CodeSniffer;
# PhpDocumentorTask : Vous pouvez générer la documentation de l'API de votre
code et la génération de documentation à base de docbook avec Phpdoc.
|
VI. Survol des outils utilisables avec Phing
Dans le chapitre précédent, vous avez découvert l'aspect fonctionnel
. Ici vous allez découvrir la trousse à outil de Phing. Il facilite l'intégration de
beaucoup de programmes PHP dédiés à l'analyse, à la maintenance et au déploiement
de votre application dans la gestion de votre cycle de vie. Le tableau suivant présente
la liste des principaux outils supportés par la version 2.4.0.
Type d'opération |
Application(s) externe(s)
nécéssaire(s) |
Description |
Couverture du code par les tests |
PHPUnit et Xdebug |
Pour utiliser cette fonction, PHPUnit et Xdebug sont
nécessaires. Cet outil génère un rapport sur la
couverture de votre code par les tests unitaires. Vous pouvez
créer un rapport sur quelques fichiers, par module ou sur
l'application complète. |
DbDeploy |
Non |
Cet outil intégré à Phing facilite la migration et
l'évolution des bases de donnée de vos projets. |
Exécuter une commande console |
Non |
Vous pouvez exécuter une commande shell à partir
de Phing. Cet fonctionnalité est intéressante lorsque
l'outil que vous souhaitez appeler n'a pas de task associée.
Gardez les commandes aussi simple que possible. Dans l'idéal,
ne cassez pas le support multiplateforme. SVN est un très bon
exemple où cette fonctionnalité est indispensable. N'oubliez
pas de gérer les erreurs. |
FtpDeploy |
Non |
Phing peut prendre en charge le déploiement de votre
application sur différents serveurs en utilisant le protocole FTP. |
Ioncube Encoder |
Ioncube Encoder |
Cet outil commercial obfusque et licencie vos scripts
PHP. |
JsLint |
JsLint |
Cet outil analyse le code JavaScript pour vérifier
l'usage des bonnes pratiques de développement. |
JsMin |
Non |
JsMin est une application externe embarquée dans
Phing. Vous n'avez donc pas besoin de l'installer. Cet
outil minimise la taille d'un fichier JavaScript. |
Outils XML |
Non |
Phing peut valider un ou plusieurs scripts XML à l'aide
d'un schéma XSD et transformer un fichier XML en utilisant une feuille de style XSL. |
PEAR Packager |
Non |
Phing crée un fichier XML permettant de déployer votre
application au moyen de PEAR (supporte la version 1 et la version
2 de PEAR) |
Phar Packager |
PECL's Phar |
Cet outil crée un package Phar. Tous les fichiers PHP
d'une application sont rassemblés en un seul fichier. Un package Phar
est utilisable dans PHP depuis la version 5.3. Ces packages sont optimisés
pour améliorer la vitesse d'exécution des scripts. |
Php_CodeSniffer |
Php_CodeSniffer |
Cet outil effectue une analyse statique de vos
scripts pour vérifier qu'ils respectent les conventions de code
que vous avez défini (PEAR, Zend, vos propres conventions ...). |
phpCpd |
phpCpd |
PHP Copy/Paste detector est un script simple qui
recherche les lignes de code dupliquées dans vos
fichiers PHP. |
PhpDocumentor |
PhpDocumentor |
Cet outil génère la documentation de votre API à partir des
commentaires phpdoc écrits dans vos scripts. Vous pouvez aussi compiler
des tutoriels ou des articles à partir de documents docbook. |
phpLint |
phpLint |
Cet outil est un analyseur statique de code. Il
vérifie les erreurs les plus communes en PHP (par exemple,
l'emploi de fonctions dépréciées ou l'utilisation des short tags). |
PHPUnit |
PHPUnit |
Vous pouvez exécuter vos tests unitaires et générer
un rapport résumant leur exécution. |
Scp |
Non |
Scp est une fonction permettant de copier un fichier
au travers du protocole SSH. Vous pouvez déployer intégralement une application
en utilisant le protocole SSH à place du protocole FTP. |
Svn |
VersionControl_SVN |
Phing supporte les opérations SVN checkout, commit,
export et update. Vous pouvez interagir avec un
serveur de version SVN. On regrettera l'absence de certaines
commandes SVN (merge, import, ...).
Vous pouvez exécuter svn en utilisant la tache ExecTask qui
permet d'exécuter une commande dans le shell de l'OS. |
Zend code analyzeur |
Zend Code Analyzeur |
Zend code analyzeur est livré avec Zend studio.
C'est un analyseur de code statique qui repère les erreurs
les plus courantes dans du code PHP. |
Zip & Tar |
Archive_Tar (pour les fichiers tar seulement) |
Vous pouvez créer des archives compressées ou décompresser
des archives existantes au format Tar ou Zip. |
Outils utilisables avec Phing
VII. Pour conclure
Vous avez une meilleure idée de l'aide que peut vous
apporter cet outil. Sous son apparente simplicité, Phing est une
application puissante qui recèle beaucoup d'options pour faciliter
votre quotidien.
Je remercie toutes les personnes de l'équipe developpez.com pour
leur aide et pour leur relecture, ainsi que l'ensemble des développeurs
de Phing pour leur travail remarquable.
Si vous avez aimé certains passages cet article, si au contraire
vous pensez que d'autres devraient être repris, je vous encourage à laisser un commentaire
à la suite.
VIII. Liens pour aller plus loin
Vous découvrirez dans cette section des liens pour approfondir es sujets abordés dans cet article.
Sources de cet article
En découvrir plus
Les ressources connexes sur Developpez.com