Intégration Continue PHP avec Jenkins CI
Upcoming SlideShare
Loading in...5
×
 

Intégration Continue PHP avec Jenkins CI

on

  • 6,037 views

Comment assurer le suivi qualite du code source d'une application web? Ce n'est pas une tache aisée ! C’est d’autant plus vrai que PHP est encore considéré aujourd'hui comme un langage peu ...

Comment assurer le suivi qualite du code source d'une application web? Ce n'est pas une tache aisée ! C’est d’autant plus vrai que PHP est encore considéré aujourd'hui comme un langage peu professionnel. PHP est pourtant un langage dont l'outillage n'a rien a envier a l'ensemble de ses concurrents. L'objectif de cette conférence est de présenter les bonnes pratiques à adopter ainsi que les différents outils a mettre en oeuvre afin de contrôler la qualité d'un projet PHP au quotidien. Un focus particulier sera porté sur la plateforme d'intégration continue Jenkins, les tests unitaires ou bien encore la récupération et l'interprétation des métriques collectées.

Statistics

Views

Total Views
6,037
Views on SlideShare
4,260
Embed Views
1,777

Actions

Likes
4
Downloads
85
Comments
0

10 Embeds 1,777

http://appventus.com 1735
http://wiki.ideotechnologies.com 20
http://a0.twimg.com 6
http://www.scoop.it 5
https://www.google.fr 3
https://twitter.com 3
http://demo2.apostrophenow.com 2
http://us-w1.rockmelt.com 1
http://tweetedtimes.com 1
http://192.168.1.35 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Intégration Continue PHP avec Jenkins CI Intégration Continue PHP avec Jenkins CI Presentation Transcript

  • Comment surveiller laqualité de vos projets PHPau quotidien ?
  • « Lintégration continue est un ensemble depratiques qui consistent à véri er à chaquechangement du code source que le résultatdes modi cations ne produit pas derégression de lapplication en cours dedéveloppement » Wikipedia
  • Quels avantages ?
  • Quelles pratiques au quotidien ?
  • q  Maintenir un dépôt unique de code versionnéq  Tous les développeurs committent quotidiennementq  Automatiser les compilations (builds)q  Tout commit doit compiler le tronc du code versionnéq  Maintenir une compilation courte en permanenceq  Rendre disponible le résultat du build à tout le mondeq  Automatiser le déploiement
  • Alice Build Successful SCM Server Bob Carlos CI Server
  • Alice Build Failed SCM Server Bob Carlos Alerter l’équipe CI Server
  • Alice Build Successful SCM Server Bob Carlos CI Server
  • Quelles PIC sur le marché ?
  • Mettre en œuvreune PIC pour PHP
  • q  Exécution de la suite de tests unitaires (PHPUnit)q  Génération du rapport de couverture de code (PHPUnit)q  Génération de la documentation d’API (PHPDocumentor)q  Génération du rapport des dépendances (PDepend)q  Analyse statique du code source (PMD)q  Détection des violations de codage (PHP_CodeSniffer)q  Détection du code dupliqué (PHPCPD)q  Génération du navigateur de code (PHP Code Browser)
  • q  Hudson rebaptisé Jenkins en février 2011q  Ecrit en Javaq  Exécute des tâches Ant, Maven, Shell et Windowsq  +300 pluginsq  Analyse des rapports de compilationq  Génération de statistiques et de graphiques (métriques)
  • http://jenkins-ci.org
  • $ java –jar jenkins.war
  • http://localhost:8080
  • q  XDebug q  PHPUnit 3.6.xq  PDepend q  PHPCPDq  PHP Mess Detector q  PHP Documentorq  PHP CodeSniffer q  PHP CodeBrowser
  • $ pecl install xdebug$ pear channel-discover pear.pdepend.org$ pear channel-discover pear.phpmd.org$ pear channel-discover pear.phpunit.de$ pear channel-discover components.ez.no$ pear channel-discover pear.symfony-project.com$ pear channel-discover pear.phing.info$ pear install phing/phing$ pear install pdepend/PHP_Depend-beta$ pear install phpmd/PHP_PMD-alpha$ pear install phpunit/phpcpd$ pear install PHPDocumentor$ pear install PHP_CodeSniffer$ pear install --alldeps phpunit/PHP_CodeBrowser-alpha$ pear install --alldeps phpunit/PHPUnit
  • Plugins Jenkins
  • q  Subversion q  JDependq  Git q  PMDq  Checkstyle q  Violationsq  Dry q  xUnitq  HTML Publisher q  Cloverq  Green Balls
  • Démarrer un projet
  • Projet free-style
  • Con guration du projet
  • Con guration du dépôt Subversion
  • Dé nition des droits d’accès au SVN
  • Con guration du dépôt Git
  • Con guration des builds
  • Exécution et contrôle du build
  • Exécution et contrôle du build
  • Phing
  • q  Phing est un portage de Ant en PHPq  Outil d’automatisation de tâchesq  Phing exécute des tâches à la suiteq  Les tâches sont décrites dans un chier build.xmlq  Supporte les dépendances entre les tâchesq  Tâches prédé nies pour PHPUnit, Code Sniffer, PMD…
  • <?xml version="1.0" encoding="UTF-8"?><project name="Syndication Component" basedir="." default="main"> <property name="builddir" value="${ws}/build" /> <property name="srcdir" value="${project.basedir}" override="true" /> <property name="package" value="Syndication" override="true" /> <target name="clean" description="Clean the build environment"> <delete dir="${builddir}" /> <delete dir="generatedJUnitFiles" /> </target> <target name="prepare" depends="clean" description="Clean the buildenvironment"> <mkdir dir="${builddir}" /> <mkdir dir="${builddir}/logs" /> <mkdir dir="${builddir}/logs/coverage" /> <mkdir dir="${builddir}/docs" /> <mkdir dir="${builddir}/browser" /> </target> <target name="build" depends="prepare" description="Build the project"> <!-- build target commands here --> </target></project>
  • phing –f $WORKSPACE/build.xml build –Dws=$WORKSPACE
  • PHPUnithttp://phpunit.de/
  • q  Exécuter les tests unitairesq  Générer un rapport JUnitq  Générer un rapport Clover XMLq  Générer un rapport de couverture HTML
  • <?xml version="1.0" encoding="UTF-8"?><phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="true" stopOnFailure="false" syntaxCheck="false" bootstrap="src/autoload.php"> <testsuites> <testsuite name="Syndication Component Test Suite"> <directory>./tests/Syndication/</directory> </testsuite> </testsuites> <filter> <whitelist> <directory>./src/Syndication/</directory> </whitelist> </filter></phpunit>
  • <?xml version="1.0" encoding="UTF-8"?><project name="Syndication Component" basedir="." default="main"> <!-- ... --> <target name="build" depends="prepare" description="Building the project"> <phingcall target="phpunit" /> </target> <target name="phpunit" description="Running unit tests and coverage analysis"> <exec command="phpunit --log-junit ${builddir}/logs/phpunit.xml --coverage-clover ${builddir}/logs/coverage/clover.xml --coverage-html ${builddir}/logs/coverage/ ${ws}/tests" /> </target></project>
  • Con gurer la suite de tests unitaires
  • Con gurer la couverture de code
  • Analyse de la couverture de code
  • Analyse des rapports de tests unitaires
  • Analyse des rapports de tests unitaires
  • Publication de la couverture de code
  • Publication de la couverture de code
  • PHPDocumentor http://www.phpdoc.org/
  • Générer la documentation d’API
  • <project name="Syndication Component" basedir="." default="main"> <target name="build" depends="prepare"> <phingcall target="phpunit" /> <phingcall target="phpdoc" /> </target> <!-- Generating API Documentation --> <target name="phpdoc" description="Generating api doc"> <phpdoc title="Syndication API Documentation" destdir="${builddir}/docs" sourcecode="true" parseprivate="true" output="HTML:Smarty:PHP"> <fileset dir="./src"> <include name="**/*.php" /> </fileset> </phpdoc> </target></project>
  • Publication de la documentation d’API
  • Publication de la documentation d’API
  • PHPCPD Copy Paste Detectorhttps://github.com/sebastianbergmann/phpcpd
  • Rechercher les duplications de code
  • <?xml version="1.0" encoding="UTF-8"?><project name="Syndication Component" basedir="." default="main"> <!-- ... --> <target name="build" depends="prepare"> <phingcall target="phpunit" /> <phingcall target="phpdoc" /> <phingcall target="phpcpd" /> </target> <!-- Detecting duplicated code --> <target name="phpcpd" description="Detecting duplicated code"> <exec command="phpcpd --min-lines 5 --min-tokens 5 --log-pmd ${builddir}/logs/pmd-cpd.xml src/" /> </target></project>
  • Ce graphique montre que lecode dupliqué a bien étéretiré dans le nouveaucommit qui a donné lieu audernier build.Le graphique ci-contremontre l’évolution du nombrede tests unitaires réussis audernier build.
  • PHP Dependhttp://pdepend.org/
  • Analyse statique du codeq  Complexité cyclomatiqueq  Qualité globale du codeq  Nombre de classes / méthodes / fonctions / interfacesq  Nombre d’appels d’une méthodeq  Nombre de propriétés / méthodes publiques vs privéesq  Nombre de lignes de code en commentaires….
  • Analyse statique du code build/logs/jdepend.xml
  • <?xml version="1.0" encoding="UTF-8"?><project name="Syndication Component" basedir="." default="main"> <!-- ... --> <target name="build" depends="prepare"> <phingcall target="phpunit" /> <phingcall target="phpdoc" /> <phingcall target="phpcpd" /> <phingcall target="pdepend" /> </target> <target name="pdepend" description="Generating JDependreport"> <exec command="pdepend --jdepend-xml=${builddir}/logs/jdepend.xml src/" /> </target></project>
  • PHP Mess Detector http://phpmd.org/
  • Analyse statique du codeq  PHP Mess Detector est un portage en PHP de PMD (Java)q  Recherche de bugs potentielsq  Recherche de code mort (ie: méthodes non appelées)q  Code non optimiséq  Expressions trop complexes…
  • <?xml version="1.0" encoding="UTF-8"?><project name="Syndication Component" basedir="." default="main"> <!-- ... --> <target name="build" depends="prepare"> <phingcall target="phpunit" /> <phingcall target="phpdoc" /> <phingcall target="phpcpd" /> <phingcall target="pdepend" /> <phingcall target="pmd" /> </target> <target name="phpmd" description="Generating PHPMD report"> <exec command="phpmd src/ xml codesize,unusedcode --reportfile ${builddir}/logs/pmd.xml" /> </target></project>
  • PHP Code Snifferhttp://pear.php.net/manual/en/package.php.php-codesniffer.php
  • q  Analyse des violations de codageq  Nombreuses règles par défautq  Standards prédé nis : PEAR, Zend, Squiz, PHPCS…q  Possibilité d’ajouter des règles supplémentaires
  • Installation du standard Symfony2$ # Looking for the PEAR PHP directory$ pear config-show | grep php_dir$ # Move to the CodeSniffer standards folder$ cd /path/to/pear/PHP/CodeSniffer/Standards$ # Checkout the Symfony2 CodeSniffer standard from Github$ git clone git://github.com/opensky/Symfony2-coding-standard.git Symfony2$ # Eventually, set Symfony2 as your default CodeSniffer standard$ phpcs --config-set default_standard Symfony2
  • Installation du standard Symfony2 build/logs/checkstyle.xml
  • <?xml version="1.0" encoding="UTF-8"?><project name="Syndication Component" basedir="." default="main"> <target name="build" depends="prepare"> <phingcall target="phpunit" /> <phingcall target="phpdoc" /> <phingcall target="phpcpd" /> <phingcall target="pdepend" /> <phingcall target="phpmd" /> <phingcall target="checkstyle" /> </target> <target name="checkstyle" description="Looking for violations"> <exec command="phpcs --standard=Symfony2 --report=checkstyle ${project.basedir}/src > ${builddir}/logs/checkstyle.xml" escape="false" /> </target></project>
  • PHP Code Browserhttps://github.com/mayflower/PHP_CodeBrowser
  • build/browser
  • <?xml version="1.0" encoding="UTF-8"?><project name="Syndication Component" basedir="." default="main"> <!-- ... --> <target name="build" depends="prepare"> <phingcall target="phpunit" /> <phingcall target="phpdoc" /> <phingcall target="phpcpd" /> <phingcall target="pdepend" /> <phingcall target="phpmd" /> <phingcall target="checkstyle" /> <phingcall target="phpcb" /> </target> <target name="phpcb" description="Generating code browser..."> <exec command="phpcb --log ${builddir}/logs --source ${project.basedir}/src --output ${builddir}/browser" /> </target></project>
  • Prévenir plutôt que guérir!
  • q  Emails q  RSSq  Twitter q  SMSq  Jabber q  …
  • Comment industrialiser la PICd’un projet PHP dans Jenkins ?
  • http://jenkins-php.org/
  • Aller plus loin avec Jenkins
  • q  Générer des archives PHAR, PEAR, TAR ou ZIPq  Automatiser le déploiement des builds stablesq  Faciliter les audits de codeq  Intégration avec un bug tracker (Trac, Redmine, Jira)q  Exécution de tests Sélénium / Fitnessq  …
  • Merci !
  • Ques%ons?   92-98, boulevard Victor Hugo 92 115 Clichy Cedex trainings@sensio.com (+33 (0)1 40 99 82 11) sensiolabs.com - symfony.com – trainings.sensiolabs.com