Successfully reported this slideshow.
Your SlideShare is downloading. ×

Intégration continue des projets PHP avec Jenkins

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
Jenkins CI
Jenkins CI
Loading in …3
×

Check these out next

1 of 86 Ad

More Related Content

Slideshows for you (20)

Viewers also liked (20)

Advertisement

Similar to Intégration continue des projets PHP avec Jenkins (20)

Advertisement

Recently uploaded (20)

Intégration continue des projets PHP avec Jenkins

  1. 1. INTÉGRATION CONTINUE D’UN PROJET PHP AVEC JENKINS. http://joind.in/talk/view/2863 Hugo Hamon – Confoo 2011 – Montreal, Canada
  2. 2. Qui suis-je ? v  Hugo HAMON (@hhamon) v  Responsable des formations v  Secrétaire de l’AFUP (2010) v  Contributeur au projet Symfony v  Coauteur & contributeur à des ouvrages Eyrolles
  3. 3. Introduction… « L'intégration continue est un ensemble de pratiques qui consistent à véri er à chaque changement du code source que le résultat des modi cations ne produit pas de régression de l'application en cours de développement »
  4. 4. Avantages… Détecter les problèmes le plus tôt possible…
  5. 5. Avantages… … a n d’alerter l’équipe le plus vite possible !
  6. 6. Avantages… Générer des compilations régulièrement…
  7. 7. Avantages… …a n d’obtenir des versions stables et déployables le plus souvent possible.
  8. 8. Pratiques quotidiennes… q  Maintenir un dépôt unique de code versionné q  Tous les développeurs committent quotidiennement q  Automatiser les compilations (builds) q  Tout commit doit compiler le tronc du code versionné q  Maintenir une compilation courte en permanence q  Rendre disponible le résultat du build à tout le monde q  Automatiser le déploiement
  9. 9. Workflow de l’Intégration Continue Alice Build Successful SCM Server Bob Carlos CI Server
  10. 10. Workflow de l’Intégration Continue Alice Build Failed SCM Server Bob Carlos Alerter l’équipe CI Server
  11. 11. Workflow de l’Intégration Continue Alice Build Successful SCM Server Bob Carlos CI Server
  12. 12. Intégration Continue 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)
  13. 13. Marché de l’Intégration Continue ¨  Maven (Java, Open Source) ¨  CruiseControl (Java, Open Source) ¨  Bamboo (Java, Commercial) ¨  Jenkins (Java, Open Source) ¨  Sonar (Java, Open Source) ¨  Xinc (PHP, Open Source)
  14. 14. Jenkins CI ¨  Hudson rebaptisé Jenkins en février 2011 ¨  Ecrit en Java ¨  Exécute des tâches Ant, Maven, Shell et Windows ¨  +300 plugins ¨  Analyse des rapports de compilation ¨  Génération de statistiques et de graphiques (métriques)
  15. 15. Ils utilisent Jenkins CI
  16. 16. Installation Installation de Jenkins
  17. 17. Installer Jenkins CI ¨  Télécharger le chier jenkins.war sur jenkins-ci.org http://mirrors.jenkins-ci.org/war/latest/jenkins.war ¨  Exécuter le chier jenkins.war $ java –jar jenkins.war
  18. 18. Installer Jenkins http://localhost:8080/
  19. 19. Installer les outils PHP ¨  XDebug ¨  PHPUnit 3.5.x ¨  PDepend ¨  PHPCPD ¨  PHP Mess Detector ¨  PHP Documentor ¨  PHP CodeSniffer ¨  PHP CodeBrowser
  20. 20. Installer les outils PHP $ 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
  21. 21. Installer les plugins Jenkins ¨  Subversion pour l’intégration des dépôts SVN ¨  Git pour l’intégration des dépôts Git ¨  Checkstyle pour l’analyse des rapports PHP_CodeSniffer ¨  Dry pour l’analyser des rapports PHPCPD ¨  HTML Publisher pour la publication des logs de couverture de code ¨  Green Balls pour avoir des billes vertes au lieu des bleues J
  22. 22. Installer les plugins Jenkins ¨  JDepend pour l’analyse des rapports PHP_Depend ¨  PMD pour le traitement des rapports PHP Mess Detector ¨  Violations pour le traitement de rapports variés ¨  xUnit pour le traitement des logs de tests PHPUnit ¨  Clover pour le traitement des logs de couverture de code de PHPUnit
  23. 23. Nouveau projet Démarrer un nouveau projet
  24. 24. Initialiser un nouveau projet ¨  Création d’un nouveau « projet free-style »
  25. 25. Initialiser un nouveau projet ¨  Ajout d’une description et suppression des anciens builds
  26. 26. Configuration du dépôt SVN Dépôt de code Subversion Dossier local Préférer les updates au lieu des checkouts
  27. 27. Configuration du dépôt SVN ¨  Dé nition des droits d’accès au dépôt de code Subversion.
  28. 28. Configuration du dépôt Git URL du dépôt de code Git Branche à construire Navigateur de code source
  29. 29. Configuration du déclenchement ¨  Le build est déclenché toutes les 5 minutes. ¨  Un nouveau build est déclenché si des commits ont eu lieu Syntaxe de crontab
  30. 30. Exécution et contrôle du build Build réussi !
  31. 31. Exécution et contrôle du build ¨  La page d’accueil affiche la tendance de chaque projet… ¨  … et l’état du dernier build effectué sur chaque projet.
  32. 32. Phing Con guration de Phing
  33. 33. Configuration de Phing ¨  Phing est un portage de Ant en PHP ¨  Outil d’automatisation de tâches ¨  Phing exécute des tâches à la suite ¨  Les tâches sont décrites dans un chier build.xml ¨  Supporte les dépendances entre les tâches ¨  Tâches prédé nies pour PHPUnit, Code Sniffer, PMD…
  34. 34. Configuration de Phing (build.xml) <?xml version="1.0" encoding="UTF-8"?> <project name="Syndication Component" basedir="." default="main"> ${ws} est une <property name="builddir" value="${ws}/build" /> variable perso <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" /> Nettoyage </target> <target name="prepare" depends="clean" description="Clean the build environment"> <mkdir dir="${builddir}" /> <mkdir dir="${builddir}/logs" /> <mkdir dir="${builddir}/logs/coverage" /> <mkdir dir="${builddir}/docs" /> Préparation <mkdir dir="${builddir}/browser" /> </target> <target name="build" depends="prepare" description="Build the project"> <!-- build target commands here --> </target> </project> Build
  35. 35. Commande SHELL à exécuter phing –f $WORKSPACE/build.xml build –Dws=$WORKSPACE
  36. 36. PHPUnit Con guration des tests unitaires
  37. 37. Configurer la suite de tests unitaires ¨  Con gurer et exécuter la suite de tests unitaires ¨  Génération du rapport de la suite au format JUnit ¨  Génération du rapport XML de couverture de code (Clover) ¨  Génération du rapport HTML de couverture de code
  38. 38. PHPUnit – phpunit.xml <?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>
  39. 39. Configurer la suite de tests unitaires <?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>
  40. 40. Configurer la suite de tests unitaires ¨  Analyse des logs JUnit générés par PHPunit ¨  Publication des graphiques sur le tableau de bord
  41. 41. Configurer la couverture de code ¨  Analyse et publication des rapports de couverture de code
  42. 42. Analyse de la couverture de code
  43. 43. Analyse des rapports de tests unitaires 9/9
  44. 44. Analyse des tests unitaires
  45. 45. Publication de la couverture de code
  46. 46. Publication de la couverture de code
  47. 47. PHPDocumentor Con guration de PHPDocumentor
  48. 48. Générer la documentation d’API ¨  La PHPDoc est générée dans le dossier build/docs.
  49. 49. Générer la documentation d’API <project name="Syndication Component" basedir="." default="main"> <!-- ... --> <target name="build" depends="prepare" description="Building the project"> <phingcall target="phpunit" /> <phingcall target="phpdoc" /> </target> <!-- Generating API Documentation --> <target name="phpdoc" description="Generating api documentation..." > <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>
  50. 50. Publication de la documentation API Accès à la doc API
  51. 51. Publication de la documentation API
  52. 52. PHPCPD Con guration de PHPCPD
  53. 53. Rechercher les duplications de code ¨  PHPCPD détecte le code dupliqué dans les chiers ¨  Le rapport est généré au format PMD
  54. 54. Rechercher les duplications de code <?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" /> <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>
  55. 55. Rechercher les duplications de code
  56. 56. Rechercher les duplications de code
  57. 57. Rechercher les duplications de code Ce graphique montre que le code dupliqué a bien été retiré dans le nouveau commit qui a donné lieu au dernier build. Le graphique ci-contre montre l’évolution du nombre de tests unitaires réussis au dernier build.
  58. 58. PHPDepend Con guration de PHPDepend
  59. 59. Déterminer les dépendances ¨  PDepend est un portage en PHP de JDepend (Java) ¨  Analyse statistique du code n  Complexité cyclomatique n  Qualité globale du code n  Nombre de classes / méthodes / fonctions / interfaces n  Nombre d’appels d’une méthode n  Nombre de propriétés / méthodes publiques vs privées n  Nombre de lignes de code en commentaires….
  60. 60. Déterminer les dépendances <?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" /> <phingcall target="phpdoc" /> <phingcall target="phpcpd" /> <phingcall target="pdepend" /> </target> <target name="pdepend" description="Generating JDepend report"> <exec command="pdepend --jdepend-xml=${builddir}/logs/jdepend.xml src/" /> </target> </project>
  61. 61. Publier les dépendances
  62. 62. PMD Con guration de PHP Mess Detector
  63. 63. Analyse statistique du code ¨  PHP Mess Detector est un portage en PHP de PMD (Java) ¨  Analyse statistique du code ¨  Recherche de bugs potentiels ¨  Recherche de code mort (méthodes non appelées par exemple) ¨  Code non optimisé ¨  Expressions trop complexes…
  64. 64. Configurer PHP Mess Detector Fichier de log généré par PMD
  65. 65. Configurer PHP Mess Detector <?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" /> <phingcall target="phpdoc" /> <phingcall target="phpcpd" /> <phingcall target="pdepend" /> <phingcall target="pmd" /> </target> <target name="phpmd" description="Generating PHP Mess Detector report"> <exec command="phpmd src/ xml codesize,unusedcode --reportfile $ {builddir}/logs/pmd.xml" /> </target> </project>
  66. 66. Publier les rapports PMD
  67. 67. PHP_CodeSniffer Con guration de PHP_CodeSniffer
  68. 68. Analyser les violations de codage ¨  Analyse des conventions de codage avec PHP_CodeSniffer ¨  PHPCS « sniffs » le code à la recherche de violations de règles ¨  Nombreuses règles par défaut ¨  Standards prédé nis : PEAR, Zend, Squiz, PHPCS… ¨  Possibilité d’ajouter des règles et standards supplémentaires
  69. 69. 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
  70. 70. Configuration de PHP_CodeSniffer <?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" /> <phingcall target="phpdoc" /> <phingcall target="phpcpd" /> <phingcall target="pdepend" /> <phingcall target="phpmd" /> <phingcall target="checkstyle" /> </target> <target name="checkstyle" description="Looking for codestyle violations..."> <exec command="phpcs --standard=Symfony2 --report=checkstyle ${project.basedir}/src > ${builddir}/logs/checkstyle.xml" escape="false" /> </target> </project>
  71. 71. Publier le rapport des violations
  72. 72. Publier le rapport des violations
  73. 73. PHP Code Browser Con guration de PHP Code Browser
  74. 74. Générer le navigateur de code ¨  La navigateur est généré dans le dossier build/browser.
  75. 75. Générer le navigateur de code <?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" /> <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>
  76. 76. Publier le navigateur de code Accès au navigateur de code
  77. 77. Publier le navigateur de code
  78. 78. Prévenir et guérir au plus vite Con gurer des alertes
  79. 79. Moyens de communication ¨  Emails ¨  Twitter ¨  Jabber ¨  RSS ¨  …
  80. 80. Alerter l’équipe par e-mail ¨  Saisie des adresses email des équipiers du projet ¨  Possibilité d’alerter les responsables d’un build en échec
  81. 81. Industrialisation Industrialiser l’intégration continue d’un projet PHP dans Jenkins ?
  82. 82. Industrialiser l’intégration d’un projet ¨  Réutilisation d’un template de projet Jenkins ¨  Dites merci à Sebastian Bergmann ! ¨  «  PHP Jenkins Template » project https://github.com/sebastianbergmann/php-jenkins-template
  83. 83. Pour aller plus loin Aller plus loin…
  84. 84. Aller plus loin… ¨  Générer des archives PHAR, PEAR, TAR ou ZIP ¨  Automatiser le déploiement des builds stables ¨  Faciliter les audits de code ¨  Intégration avec un bug tracker (Trac, Redmine, Jira) ¨  Exécution de tests Sélénium / Fitness
  85. 85. Merci !
  86. 86. Questions! Sensio S.A. 92-98, boulevard Victor Hugo 92 115 Clichy Cedex FRANCE www.sensiolabs.com - www.symfony.com - trainings.sensiolabs.com

×