Gérer le cycle de vie d'une application PHP avec Phing

Fabien Arcellier

Vous venez de livrer votre produit, un problème apparaît. 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érez 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.

Découvrez comment maîtriser chacune des itérations du cycle de vie de votre projet PHP. Commentez

- Titre : Gérer le cycle de vie d'une application PHP avec Phing

- Auteur : Fabien Arcellier

- Parution : 4 mars 2010

- Licence :

Sommaire

- 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 facilite la mise en place d'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 et destiné à PHP. Vous pouvez l'utiliser pour vous assister dans la réalisation de certaines tâches tout au long du 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...

Phing vous permet de gagner du temps à chacune de ces étapes

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 œuvre 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és targets) réutilisables.

Le fichier build.xml est suffisamment verbeux pour être, lors de sa lecture, compréhensible sans connaissance préalable par un autre développeur .

II-B - Il fonctionne sur toutes les plateformes où PHP est disponible

Phing est codé en PHP. Vous pouvez donc l'utiliser dès lors que PHP est installé sur votre système.

Certaines fonctionnalités avancées peuvent ne pas fonctionner partout (par exemple, CHMOD).

II-C - Il supporte un grand nombre d'outils PHP

Il existe un grand nombre d'applications destinées à améliorer l'écriture du code PHP. Elles ont l'inconvénient de ne pas suivre les mêmes conventions ou la même logique. Phing intègre des tâches dédiées à certaines d'entre elles. Ces tâches sont normalisées et suivent une logique commune. Ce canevas est utile pour paramétrer, efficacement et avec un minimum d'effort, chacune d'entre elles sans sacrifier pour autant les possibilités de 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 dans la documentation officielle un chapitre entier détaillant les possibilités, proposant des gabarits pour travailler et expliquant pas-à-pas le processus de conception d'une nouvelle tâche.

II-F - Il facilite la mise en place d'un processus d'intégration continue

Il est utilisable avec la plupart des outils dédiés à l'intégration continue : 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 tierces 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 dans une console la commande suivante :

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

pear upgrade phing/phing

III-B - Installer Phing sans utiliser PEAR

Cette méthode est déconseillée, car Phing faisant appel à des applications tierces fréquemment installées 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échargez la dernière version stable (la 2.4.0 à la date de rédaction de cet article).

Étapes à suivre pour installer Phing sans PEAR :

1. 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 ;

4. créez la variable d'environnement PHP_COMMAND, sa valeur sera le chemin complet du répertoire contenant l'exécutable php.exe ;

5. créez la variable d'environnement PHP_CLASSPATH, sa valeur sera le chemin complet du répertoire PHING_HOME/classes ;

6. si vous faites appel à d'autres outils à partir de Phing (PHPUnit...), vous devrez probablement ajouter leur chemin dans PHP_CLASSPATH (séparé par un ;).

À 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êt à 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).

Les sources de cet exemple sont disponibles dans le package d'exemple

IV-A - Les fichiers PHP

Le code de ces fichiers est volontairement simple. L'objectif de cet article n'étant pas d'expliquer comment l'on écrit du PHP.

helloword.php

<?php
echo 'hello world';
?>

phpinfo.php

<?php
phpinfo();
?>

IV-B - Le fichier build.xml

Voici le fichier que vous allez exécuter. Par la suite, vous trouverez l'explication détaillée de chacun des éléments.

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-y simplement Phing.

Vous devez obtenir une sortie sensiblement équivalente sur votre console

Buildfile: D:\Programming\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 chemin du répertoire d'exécution du script ;

- default : c'est le nom de la target (cible) visé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 tâches, vous les groupez dans une balise target. Ici, elle s'appelle build.

Le noeud target

<target name="build">

Comme l'instruction echo, la tâche echo affiche un message sur la sortie standard.

La tâche echo

<echo msg="Debut du build" />

Pour créer un dossier, vous utilisez la tâche mkdir. L'argument dir contient le chemin du dossier à créer. Si le dossier existe déjà, Phing passe à la tâche suivante.

la tâche mkdir

<mkdir dir="./build" />

Pour copier un fichier, vous utilisez la tâche 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 tâche copy

<copy file="helloworld.php" tofile="./build/release/helloworld.php /">

V - Les autres exemples

Les deux exemples supplémentaires, disponibles 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 permettant d'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 ?
----------------------

Vous pourrez grâce à cet exemple exécuter un script de build qui archive
automatiquement chacune de vos releases. Ce build est adapté aux petits
projets pour lesquels vous travaillez souvent seul et pour lesquels vous n'employez
pas de serveur de version.

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 dont le nom est basé sur 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 dont le nom est basé sur le numéro de version.

Pour changer le numéro de version, vous devez éditer la propriété projectVersion
dans 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.

Contrairement au build précédent, vous ne configurez pas la copie fichier par fichier
mais vous configurez la tâche de copy pour copier tous les fichiers respectant certaines
conventions. Si vous rajoutez un fichier ou plusieurs fichiers à votre application,
vous n'aurez pas à modifier votre script de build.

Quelles sont les fonctionnalités de Phing utilisées ?
--------------------------------------------------

Ce sont :
# AvailableTask : vérifier qu'un dossier ou un fichier est disponible ;
# CopyTask : copier un ou plusieurs dossiers / fichiers ;
# DeleteTask : supprimer un ou plusieurs dossiers / fichiers ;
# ExitTask (FailTask) : arrêter l'exécution d'un script ;
# Fileset : permet de définir un groupe de fichiers à partir de règles d'inclusion
et d'exclusion pour les instructions manipulant des fichiers (CopyTask, DeleteTask...) ;
# IfTask : prise de décision durant le build ;
# Mapper : permet d'effectuer certaines transformations sur le nom des fichiers
dans le cadre de certaines opérations (CopyTask, DeleteTask...) ;
# PropertyTask : utiliser des variables permettant de modifier
la configuration du build ;
# Target : utiliser des targets dépendant les unes des autres ;
# ZipTask : compresser dans un seul fichier à l'aide de l'algorithme Zip, un ou
plusieurs dossiers / fichiers ;

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. Celui-ci exécute les tests unitaires
PHPUnit, vérife que le code respecte la convention de code du projet PEAR
grâce à 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

Pour ce type de projet, l'emploi d'un serveur de version serait très avantageux.
Cependant, nous allons volontairement l'omettre dans cet exemple pour des raisons
de facilité de mise en oeuvre.

Note : dans la pratique, si vous n'avez pas de serveur de version, vous
pouvez figer votre environnement dans une archive, en excluant le dossier contenant
tous les packages de release. Ainsi, vous pourrez en quelques clics revenir à une
version différente de votre développement. Vous pourrez également utiliser un outil
tel que winmerge pour comparer les deux versions de votre projet. Il ne s'agit toutefois que
d'un palliatif valable si vous travaillez seul, un serveur de version restant
recommandé car il rend beaucoup plus de services que le simple archivage.

Dans cet exemple, vous découvrirez une méthode pour sauvegarder dans un fichier
séparé le code commun à chacun de vos builds (procédé recommandé 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 déclenche deux
warnings) ;
# génération de la documentation d'API ;
# exécution de toutes les opérations 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.

Quelles sont les fonctionnalités de Phing utilisées ?
--------------------------------------------------

Ce sont :
# PhingTask : vous pouvez appeler une target dans un autre fichier de build
(ceci est utile pour mettre en commun le code de vos builds) ;
# PhpUnitTask : vous exécutez les tests unitaires grâce à cette tâche (mais ceci n'est
pas compatible avec les suites de tests ; Phing construit ses propres suites) ;
# PhpCodeSnifferTask : vous vérifiez avec cette tâche le style de votre code
grâce à PHP_CodeSniffer ;
# PhpDocumentorTask :  vous pouvez générer la documentation de l'API de votre
code et le manuel utilisateur à partir de fichiers docbook grâce à 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 les outils tiers utilisables dans Phing. Ceux-ci sont souvent écrits en PHP. Le tableau suivant présente une liste non exhaustive des 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ées de vos projets.

Exécuter une commande console

Non

Vous pouvez exécuter une commande Shell à partir de Phing. Cette fonctionnalité est intéressante lorsque l'outil que vous souhaitez appeler n'a pas de tâche associée. Utilisez des commandes aussi simples 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 rend illisibles vos scripts PHP et en assure la protection par licence.

JsLint

JsLint

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éfinies (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éconseillé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 Subversion (en abrégé 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 tâche 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.

Vous trouverez toutes les informations pour utiliser ces outils dans le manuel de Phing.

VII - Pour conclure

J'espère qu'à présent, 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 RideKick et Ovh qui m'ont guidé tout au long de la rédaction de ce premier article.

Je tiens à féliciter Papy_77 et jacques_jean pour leur patience et leurs nombreuses suggestions lors de la relecture de cet article pour rendre votre lecture encore plus agréable.

Je profite aussi des remerciements pour saluer le travail remarquable de tous les contributeurs qui ont participé au développement de cet outil exceptionnel.

Si vous souhaitez enrichir cet article en parlant de votre expérience personnelle avec Phing ou d'autres systèmes de build ou si vous avez des remarques, venez participer à la discussion sur le forum. Commentez

VIII - Liens pour aller plus loin

Vous découvrirez dans cette section des liens pour approfondir les sujets abordés dans cet article.

Source de cet article

- Package d'exemples

En découvrir plus

- Portail du projet Phing

- Projet cruise control pour l'intégration continue

Les ressources connexes sur Developpez.com

- Les classes et librairies vraiment utiles pour les développeurs PHP par Saud Kahn (traduit par Joris Crozier) ;

- Introduction aux tests unitaires avec PHPUnit 3.1 par Jean-Pierre Grossglauser ;

- Développement piloté par les tests avec PHPUnit par Julien Pauli ;

- PHPUnit avancé : patterns de tests par Julien Pauli ;

- Utilisation de PHP_Code_Sniffer par Lorna Mitchell (traduit par Joris Crozier) ;

- XML/XSL avec PHP et le mode XSLT par bob ;

- PHP 4 et 5 : l'extension ZIP par julp ;

- Exécution périodique d'un script PHP par m@.