Intégration Continue PHP avec Jenkins CI

8 823 vues

Publié le

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.

Publié dans : Technologie
0 commentaire
10 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
8 823
Sur SlideShare
0
Issues des intégrations
0
Intégrations
3 084
Actions
Partages
0
Téléchargements
133
Commentaires
0
J’aime
10
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Intégration Continue PHP avec Jenkins CI

  1. 1. Comment surveiller laqualité de vos projets PHPau quotidien ?
  2. 2. « 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
  3. 3. Quels avantages ?
  4. 4. Quelles pratiques au quotidien ?
  5. 5. 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
  6. 6. Alice Build Successful SCM Server Bob Carlos CI Server
  7. 7. Alice Build Failed SCM Server Bob Carlos Alerter l’équipe CI Server
  8. 8. Alice Build Successful SCM Server Bob Carlos CI Server
  9. 9. Quelles PIC sur le marché ?
  10. 10. Mettre en œuvreune PIC pour PHP
  11. 11. 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)
  12. 12. 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)
  13. 13. http://jenkins-ci.org
  14. 14. $ java –jar jenkins.war
  15. 15. http://localhost:8080
  16. 16. q  XDebug q  PHPUnit 3.6.xq  PDepend q  PHPCPDq  PHP Mess Detector q  PHP Documentorq  PHP CodeSniffer q  PHP CodeBrowser
  17. 17. $ 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
  18. 18. Plugins Jenkins
  19. 19. q  Subversion q  JDependq  Git q  PMDq  Checkstyle q  Violationsq  Dry q  xUnitq  HTML Publisher q  Cloverq  Green Balls
  20. 20. Démarrer un projet
  21. 21. Projet free-style
  22. 22. Con guration du projet
  23. 23. Con guration du dépôt Subversion
  24. 24. Dé nition des droits d’accès au SVN
  25. 25. Con guration du dépôt Git
  26. 26. Con guration des builds
  27. 27. Exécution et contrôle du build
  28. 28. Exécution et contrôle du build
  29. 29. Phing
  30. 30. 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…
  31. 31. <?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>
  32. 32. phing –f $WORKSPACE/build.xml build –Dws=$WORKSPACE
  33. 33. PHPUnithttp://phpunit.de/
  34. 34. 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
  35. 35. <?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>
  36. 36. <?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>
  37. 37. Con gurer la suite de tests unitaires
  38. 38. Con gurer la couverture de code
  39. 39. Analyse de la couverture de code
  40. 40. Analyse des rapports de tests unitaires
  41. 41. Analyse des rapports de tests unitaires
  42. 42. Publication de la couverture de code
  43. 43. Publication de la couverture de code
  44. 44. PHPDocumentor http://www.phpdoc.org/
  45. 45. Générer la documentation d’API
  46. 46. <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>
  47. 47. Publication de la documentation d’API
  48. 48. Publication de la documentation d’API
  49. 49. PHPCPD Copy Paste Detectorhttps://github.com/sebastianbergmann/phpcpd
  50. 50. Rechercher les duplications de code
  51. 51. <?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>
  52. 52. 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.
  53. 53. PHP Dependhttp://pdepend.org/
  54. 54. 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….
  55. 55. Analyse statique du code build/logs/jdepend.xml
  56. 56. <?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>
  57. 57. PHP Mess Detector http://phpmd.org/
  58. 58. 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…
  59. 59. <?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>
  60. 60. PHP Code Snifferhttp://pear.php.net/manual/en/package.php.php-codesniffer.php
  61. 61. 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
  62. 62. 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
  63. 63. Installation du standard Symfony2 build/logs/checkstyle.xml
  64. 64. <?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>
  65. 65. PHP Code Browserhttps://github.com/mayflower/PHP_CodeBrowser
  66. 66. build/browser
  67. 67. <?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>
  68. 68. Prévenir plutôt que guérir!
  69. 69. q  Emails q  RSSq  Twitter q  SMSq  Jabber q  …
  70. 70. Comment industrialiser la PICd’un projet PHP dans Jenkins ?
  71. 71. http://jenkins-php.org/
  72. 72. Aller plus loin avec Jenkins
  73. 73. 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  …
  74. 74. Merci !
  75. 75. 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

×