Industrialisation des développements web : cas du langage php( Télécharger le fichier original )par Jean-Luc NTA à NWAMEKANG Institut Supérieur de Technologie et du Design Industrielle - European Master of Computer Science 2010 |
VII.1 Installation de PhingPhing 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. >> pear channel-discover pear.phing.info >> pear install phing/phing Installer Phing sans utiliser PEAR est déconseillé, car Phing faisant appel à des applications tierces fréquemment installées grâce à PEAR, (par exemple, PHPunit ou PhpDocumentor), l'installation de l'environnement de travail peut s'avérer délicate et souffrir d'un manque de cohésion.VII.2 Utilisation de PhingA Ringo SA, il existe plusieurs projets de développement web, parmi lesquels un bon nombre sont encore en développement. Dans le cadre de notre travail, il nous était indsipensable d'avoir un projet dans lequel intervenait plusieurs développeurs. L'effectif de l'équipe en place étant réduit les projets sont conduits par une voire deux personnes (max). Le projet sur lequel nous allions implémenter notre solution est le projet de refonte du site web : www.ringo.cm. Nous présentons dans la suite un prototype de de fichier XML de configuration de Phing : Fichier build.xml <?xml version="1.0" encoding="UTF-8"?> <project name="php" default="help"> <!-- ======================================================= --> <!-- Properties (définition des valeurs globales au build) --> <!--======================================================== -->
<!-- *** Project General Properties *********************************** --> <property name="home" value="${project.basedir}"/> <property name="src.dir" value="library"/> <property name="test.dir" value="tests"/> <property name="doc.dir" value="docs"/> <property name="context.dir" value="contexts"/> <property name="config.dir" value="config"/> <property name=" svn.dir" value="svn://w-dev-srv1.cm/svn/projetTest/trunk"/> <property name="convention" value="PEAR"/> <!-- *** Project Custom Properties ************************************ --> <property file="${home}/${config.dir}/build.properties" override="true"/> <property file="${home}/${config.dir}/${conf}.properties" override="true"/> <!-- *** Project Common Properties ************************************ --> <property name="package.name" value="${application.name}"/> <!-- ======================================================= --> <!-- Targets (les tâches à executer) --> <!-- ======================================================= --> <!-- *** $ phing inits ************************************************ --> <target name = "inits" depends = "" description = "Initializes the application environment"> <!-- /library --> <mkdir dir="${home}/${src.dir}"/> <!-- /tests --> <mkdir dir="${home}/${test.dir}"/> <mkdir dir="${home}/${test.dir}/phpunit"/> <mkdir dir="${home}/${test.dir}/selenium"/> <mkdir dir="${home}/${test.dir}/jsunit"/> <!-- /docs --> <mkdir dir="${home}/${doc.dir}"/> <mkdir dir="${home}/${doc.dir}/api"/> <!-- /contexts --> <mkdir dir="${home}/${context.dir}"/> </target> <!-- *** $ phing tests-unit ******************************************* --> <target name = "tests-unit" depends = "inits" description = "Executes unit tests (PHPUnit)"> <php expression="require_once '${home}/${context.dir}/phpunit.php'"/> <phpunit2 haltonfailure="false" printsummary="true"> <batchtest classpath="${home}/${src.dir}"> <fileset dir="${home}"> <include name="${test.dir}/phpunit/**/*Test.php" /> </fileset> </batchtest> <formatter type = "xml" todir = "${home}/${report.dir}/phpunit" outfile = "tests-report.xml" /> </phpunit2> <phpunit2report infile = "${home}/${report.dir}/phpunit/tests-report.xml" format = "frames" todir = "${home}/${report.dir}/phpunit" /> </target> <!-- *** $ phing tests-functional ************************************* --> <target name = "tests-functional" depends = "inits" description = "Executes functional tests (Fitnesse)"> </target> <!-- *** $ phing tests-javascript ************************************* --> <target name = "tests-javascript" depends = "inits" description = "Executes javascript tests (JSUnit)"> </target> <!-- *** $ phing tests-gui ******************************************** --> <target name = "tests-gui" depends = "inits" description = "Executes graphical user interface tests (Selenium)"> </target> <!-- *** $ phing tests ************************************************ --> <target name = "tests" depends = "tests-functional,tests-javascript,tests-gui" description = "Generates all tests reports for project"> </target> <!-- *** $ phing builds-on-commit ************************************* --> <target name = "builds-on-commit" depends = "tests-unit" description = "Continous integration Light-build on svn commit"> </target> <!-- *** $ phing docs ************************************************* --> <target name = "docs" depends = "docs-api" description = "Generates all documentation for project"> </target>
<!-- *** $ phing deploys-integ **************************************** --> <target name = "deploys-integ" depends = "tests-unit" description = "Executes unit tests and deploys a tag of the application on integration"> <echo>Deploying on integration...</echo> <echo>@todo: specific integration pre-deployment tasks...</echo> <phingcall target="_template-deploys"> <property name="${deploy.platform}" value="integ"/> </phingcall> <echo>@todo: specific integration post-deployment tasks...</echo> <echo>Application deployed on integration.</echo> </target> <!-- *** $ phing deploys-preprod ************************************** --> <target name = "deploys-preprod" depends = "tests-unit" description = "Executes unit tests and deploys a tag of the application on pre-production"> <echo>Deploying on preproduction...</echo> <echo>@todo: specific preproduction pre-deployment tasks...</echo> <phingcall target="_template-deploys"> <property name="${deploy.platform}" value="preprod"/> </phingcall> <echo>@todo: specific preproduction post-deployment tasks...</echo> <echo>Application deployed on preproduction.</echo> </target> <!-- *** $ phing deploys-prod ***************************************** --> <target name = "deploys-prod" depends = "tests-unit" description = "Executes unit tests and deploys a tag of the application on production"> <echo>Deploying on production...</echo> <echo>@todo: specific production pre-deployment tasks...</echo> <phingcall target="_template-deploys"> <property name="${deploy.platform}" value="prod"/> </phingcall> <echo>@todo: specific production post-deployment tasks...</echo> <echo>Application deployed on production.</echo> </target> <!-- *** internal task ************************************************ --> <target name = "_template-deploys" depends = "tests-unit" description = "Template - Executes unit tests and deploys a tag of the application on a platform"> <if> <isnotset property="deploy.platform"/> <then> <fail>You must set the deploy.platform property with the name of the platform to deploy on</fail> </then> </if> <if> <isnotset property="tag"/> <then> <fail>You must provide a svn tag in order to deploy this tag on ${deploy.platform}</fail> </then> </if> <property file="${home}/${config.dir}/platforms/${deploy.platform}.properties" override="true" /> <property name="deploy.src.dir" value="${home}/${build.dir}/${deploy.platform}/${tag}" /> <property name="svn.url" value="${svn.repo}/tags/${tag}" /> <svnexport svnpath = "${svn.bin}" username = "${svn.username}" password = "${svn.password}" force = "true" nocache = "true" repositoryurl = "${svn.url}" todir = "${deploy.src.dir}"/>
<echo>@todo : deployment (zip ${deploy.src.dir, then ftp, ...) </echo> <fail>@remove: Not yet implemented</fail> </target> </project> Cette section achève notre document en présentant des rappels sur le travail effectué et décrit dans les sections précédentes et présente des perspectives d'amélioration de ce travail. Tout au long de ce document, il a été question d'examiner les méthodes et processus d'industrialisation des développements web et particulièrement les développements en langage PHP, en comparaison avec le modèle en cascade du cycle de vie d'un logiciel. Les développements sont en général effectués par les équipes en local, dans notre démarche nous avons essayés de synchroniser les développements, de définir des conventions, cadrer les développements, améliorer les rendements grâce aux feedbacks, améliorer la qualité avec l'écriture des tests unitaires, des tests d'intégration, des tests fonctionnels et des tests graphiques(IHM). Nous ne nous sommes pas appesantis sur l'écriture des tests en générale. Le processus qui va rendre tout ce qui précède industriel est l'intégration continue qui vise à automatiser les tests, le déploiement et les contrôles de qualités ; ces derniers sont effectués grâce au suivi des métriques de qualité générés par le serveur d'intégration continue. Déployer en recette, en pré-production et production en un seul clic. Le déploiement que nous avons présenté concerne autant l'application que les données qu'elles traitent. Pour le déploiement des données nous avons utilisés une tâche propre à notre outil de construction de projet : DbDeployTask. Après avoir décrit le fonctionnement de subversion, de son environnement et présenté le principe d'intégration continue, nous avons proposé dans la suite une méthode d'industrialisation des développements web avec des outils choisis rigoureusement parmi plusieurs. La section suivante a consisté en la mise en oeuvre de cette industrie de développement dont l'objectif est de permettre aux décideurs de suivre l'évolution des projets développements. Ce travail n'a pas été effectué sans difficultés. Parmi ces dernières nous citerons le fait qu'il est difficile de changer les mentalités des développeurs, donc de leur imposer une discipline de travail inhabituelle. Par ailleurs le site web existant basé sur le CMS Joomla a une architecture assez particulière et structuré en plusieurs répertoires et sous-répertoires contenant une multitude de fichier, cela nous a posé un problème car lors des déploiements (copie de fichiers) sur les différents serveurs la copie étant individuelle, elle grossie la taille de notre build et augmente la charge du système. Le traitement à envisager serait d'implémenter de nouvelles tâches à intégrer à Phing pour permettre la copie itérative de la structure des dossiers de notre projet. La structure physique des serveurs de pré-production et de production a également été une difficulté pour nous. Notre modèle d'architecture proposé comme solution est un concept que nous pouvons implémenter en un langage quelconque parce que c'est une pratique du génie logicielle. Compte tenu de la diversité sans cesse évolutive des plates formes de développements d'applications web, il n'est pas évident de satisfaire la majorité des clients avec le développement PHP. Une meilleure évolution serait de construire une plate forme qui intègre tous les outils nécessaires de mise en place d'une industrie de développement. Elle devra intégrée, un gestionnaire de version, un serveur d'intégration continue et un outil de construction de projet automatique en s'assurant de la compatibilité entre ces différents outils. [1] MAJIOTSOP TIAYA Valérie, Sécurité appliquées aux messages dans les services financiers : Cas pratique Mobile to Mobile transfer, Mémoire de Master professionnel, Douala 2008-2009. [2] Feu FOTSO Valery, Conception des systèmes des systèmes d'informations informatisés (CS2i), il fut notre enseignant à l'ISTDI au cours de l'année 2008-2009. Webographie [3] Introduction à subversion, http://dev.nozav.org/intro_svn.html#htoc18, lu le 11/04/2010 à 9H12. [4] La création d'une application web, http://www.xul.fr/application-web.html, lu le 19/05/2010 à 11H. [5] PHP Continuous Integration Server : Xinc, http://code.google.com/p/xinc/, lu le 25/05/2010 à 10H31. [6] Install Xinc From Pear Channel : http://code.google.com/p/xinc/wiki/ InstallXincFromPearChannel, lu le 25/05/2010 à 12H. [7] Phing automatise les opérations répétives des développements PHP : http://labs.pimsworld.org/2009/01/phing-automatise-les-operations-repetitives-des-developpements-php/, lu le 07/06/2010 à 09H13. [8] Exemple de fichier build.xml pour un projet utilisant l'intégration continue: http://blog.phppro.fr/?post/2009/06/05/Exemple-de-fichier-buildxml-pour-un-projet-utilisant-l-integration-continue, lu le 10/06/2010 à 14H17. [9] How to simple database migrations with phing and dbdeploy, http://www.davedevelopment.co.uk/2008/04/14/how-to-simple-database-migrations-with-phing-and-dbdeploy/,lu le 15/06/2010 à 08H25. [10] FABIEN ARCELLIER, Gérer le cycle de vie d'une application PHP avec Phing, publié le 04 Mars 2010 http://farcellier.developpez.com/tutoriels/ php/phing-gerer-cycle-vie-projet/#LVI lu le 17/06/2010 à 19H. [11] ARNO SCHNEIDER, Continious integration and PHP - improve your development process, Conférence Barcelona2008 publié le 23/02/2008, http://www.slideshare.net/arnoschn/continuous-integration-and-php, lu le 24/06/2010 à 20H42. [12] Phing 2.X User Guide, http://phing.info/docs/guide/current/, lu le 11 Avril 2010 à 9H12.
Annexe 2 : Structure de l'application
|
|