SlideShare uma empresa Scribd logo
1 de 86
Baixar para ler offline
INTÉGRATION CONTINUE D’UN
PROJET PHP AVEC JENKINS.
     http://joind.in/talk/view/2863


      Hugo Hamon – Confoo 2011 – Montreal, Canada
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
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 »
Avantages…



 Détecter les problèmes le plus tôt possible…
Avantages…



 … a n d’alerter l’équipe le plus vite possible !
Avantages…



  Générer des compilations régulièrement…
Avantages…



   …a n d’obtenir des versions stables et
   déployables le plus souvent possible.
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
Workflow de l’Intégration Continue



     Alice

                                       Build
                                       Successful
                  SCM Server
       Bob




       Carlos
                               CI Server
Workflow de l’Intégration Continue



     Alice

                                               Build Failed

                     SCM Server
       Bob




       Carlos   Alerter l’équipe   CI Server
Workflow de l’Intégration Continue



     Alice

                                       Build
                                       Successful
                  SCM Server
       Bob




       Carlos
                               CI Server
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)
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)
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)
Ils utilisent Jenkins CI
Installation



           Installation de Jenkins
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
Installer Jenkins




http://localhost:8080/
Installer les outils PHP

¨    XDebug              ¨    PHPUnit 3.5.x

¨    PDepend             ¨    PHPCPD

¨    PHP Mess Detector   ¨    PHP Documentor

¨    PHP CodeSniffer      ¨    PHP CodeBrowser
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
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
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
Nouveau projet



       Démarrer un nouveau projet
Initialiser un nouveau projet

¨    Création d’un nouveau « projet free-style »
Initialiser un nouveau projet

¨    Ajout d’une description et suppression des anciens builds
Configuration du dépôt SVN


                                               Dépôt de code
                  Subversion



                               Dossier local

Préférer les updates
au lieu des checkouts
Configuration du dépôt SVN

¨    Dé nition des droits d’accès au dépôt de code Subversion.
Configuration du dépôt Git

                  URL du dépôt de code

            Git




                           Branche à construire


Navigateur de
 code source
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
Exécution et contrôle du build




              Build réussi !
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.
Phing



        Con guration de Phing
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…
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
Commande SHELL à exécuter




phing –f $WORKSPACE/build.xml build –Dws=$WORKSPACE
PHPUnit



      Con guration des tests unitaires
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
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>
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>
Configurer la suite de tests unitaires

¨    Analyse des logs JUnit générés par PHPunit

¨    Publication des graphiques sur le tableau de bord
Configurer la couverture de code
¨    Analyse et publication des rapports de couverture de code
Analyse de la couverture de code
Analyse des rapports de tests unitaires




                                  9/9
Analyse des tests unitaires
Publication de la couverture de code
Publication de la couverture de code
PHPDocumentor



     Con guration de PHPDocumentor
Générer la documentation d’API

¨    La PHPDoc est générée dans le dossier build/docs.
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>
Publication de la documentation API


        Accès à la doc API
Publication de la documentation API
PHPCPD



         Con guration de PHPCPD
Rechercher les duplications de code

¨    PHPCPD détecte le code dupliqué dans les chiers
¨    Le rapport est généré au format PMD
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>
Rechercher les duplications de code
Rechercher les duplications de code
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.
PHPDepend



      Con guration de PHPDepend
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….
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>
Publier les dépendances
PMD



      Con guration de PHP Mess Detector
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…
Configurer PHP Mess Detector




         Fichier de log généré par PMD
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>
Publier les rapports PMD
PHP_CodeSniffer



     Con guration de PHP_CodeSniffer
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
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
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>
Publier le rapport des violations
Publier le rapport des violations
PHP Code Browser



     Con guration de PHP Code Browser
Générer le navigateur de code

¨    La navigateur est généré dans le dossier build/browser.
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>
Publier le navigateur de code




Accès au navigateur de code
Publier le navigateur de code
Prévenir et guérir au plus vite



           Con gurer des alertes
Moyens de communication

¨    Emails

¨    Twitter

¨    Jabber

¨    RSS

¨    …
Alerter l’équipe par e-mail


¨    Saisie des adresses email des équipiers du projet

¨    Possibilité d’alerter les responsables d’un build en échec
Industrialisation



      Industrialiser l’intégration continue
        d’un projet PHP dans Jenkins ?
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
Pour aller plus loin



             Aller plus loin…
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
Merci !
Questions!



                           Sensio S.A.
                  92-98, boulevard Victor Hugo
                      92 115 Clichy Cedex
                            FRANCE

 www.sensiolabs.com - www.symfony.com - trainings.sensiolabs.com

Mais conteúdo relacionado

Mais procurados

Architecture microservices avec docker
Architecture microservices avec dockerArchitecture microservices avec docker
Architecture microservices avec dockergcatt
 
[PFE] Master en ingénierie du logiciel
[PFE] Master en ingénierie du logiciel[PFE] Master en ingénierie du logiciel
[PFE] Master en ingénierie du logicielUSTHB & DELTALOG
 
Principes de L'intégration Continue
Principes de L'intégration ContinuePrincipes de L'intégration Continue
Principes de L'intégration ContinueXavier Warzee
 
Méthodologie de tests et qualité
Méthodologie de tests et qualitéMéthodologie de tests et qualité
Méthodologie de tests et qualitéSpikeeLabs
 
Présentation Tests Fonctionnels
Présentation Tests FonctionnelsPrésentation Tests Fonctionnels
Présentation Tests FonctionnelsDATANYWARE.com
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...XavierPestel
 
Introduction à l’intégration continue avec Jenkins
Introduction à l’intégration continue avec JenkinsIntroduction à l’intégration continue avec Jenkins
Introduction à l’intégration continue avec JenkinsEric Hogue
 
Ch8 correction exercices (1)
Ch8 correction exercices (1)Ch8 correction exercices (1)
Ch8 correction exercices (1)abdellah12
 
Présentation de mon PFE
Présentation de mon PFEPrésentation de mon PFE
Présentation de mon PFENadir Haouari
 
Presentation du framework symfony
Presentation du framework symfonyPresentation du framework symfony
Presentation du framework symfonyJeremy Gachet
 
Mémoire - L'automatisation des tests fonctionnels - Emeline Simon
Mémoire - L'automatisation des tests fonctionnels - Emeline SimonMémoire - L'automatisation des tests fonctionnels - Emeline Simon
Mémoire - L'automatisation des tests fonctionnels - Emeline SimonEmeline Simon
 
Stratégie de tests type
Stratégie de tests typeStratégie de tests type
Stratégie de tests typemadspock
 
Livraison en continue avec l'outillage devops - Jenkins, Ansible, Docker et ...
Livraison en continue avec l'outillage devops - Jenkins, Ansible, Docker et  ...Livraison en continue avec l'outillage devops - Jenkins, Ansible, Docker et  ...
Livraison en continue avec l'outillage devops - Jenkins, Ansible, Docker et ...Jasmine Conseil
 
Intégration de SonarQube dans GitLab ci
Intégration de SonarQube dans GitLab ciIntégration de SonarQube dans GitLab ci
Intégration de SonarQube dans GitLab ciwiemfourati
 

Mais procurados (20)

Architecture microservices avec docker
Architecture microservices avec dockerArchitecture microservices avec docker
Architecture microservices avec docker
 
[PFE] Master en ingénierie du logiciel
[PFE] Master en ingénierie du logiciel[PFE] Master en ingénierie du logiciel
[PFE] Master en ingénierie du logiciel
 
Principes de L'intégration Continue
Principes de L'intégration ContinuePrincipes de L'intégration Continue
Principes de L'intégration Continue
 
Test logiciel
Test logicielTest logiciel
Test logiciel
 
Méthodologie de tests et qualité
Méthodologie de tests et qualitéMéthodologie de tests et qualité
Méthodologie de tests et qualité
 
Présentation Tests Fonctionnels
Présentation Tests FonctionnelsPrésentation Tests Fonctionnels
Présentation Tests Fonctionnels
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
 
Ttup
TtupTtup
Ttup
 
Introduction à l’intégration continue avec Jenkins
Introduction à l’intégration continue avec JenkinsIntroduction à l’intégration continue avec Jenkins
Introduction à l’intégration continue avec Jenkins
 
Ch8 correction exercices (1)
Ch8 correction exercices (1)Ch8 correction exercices (1)
Ch8 correction exercices (1)
 
Présentation de mon PFE
Présentation de mon PFEPrésentation de mon PFE
Présentation de mon PFE
 
Presentation du framework symfony
Presentation du framework symfonyPresentation du framework symfony
Presentation du framework symfony
 
Gestion de soutenance
Gestion de soutenanceGestion de soutenance
Gestion de soutenance
 
Mémoire - L'automatisation des tests fonctionnels - Emeline Simon
Mémoire - L'automatisation des tests fonctionnels - Emeline SimonMémoire - L'automatisation des tests fonctionnels - Emeline Simon
Mémoire - L'automatisation des tests fonctionnels - Emeline Simon
 
Maven
MavenMaven
Maven
 
Support cours angular
Support cours angularSupport cours angular
Support cours angular
 
Stratégie de tests type
Stratégie de tests typeStratégie de tests type
Stratégie de tests type
 
Livraison en continue avec l'outillage devops - Jenkins, Ansible, Docker et ...
Livraison en continue avec l'outillage devops - Jenkins, Ansible, Docker et  ...Livraison en continue avec l'outillage devops - Jenkins, Ansible, Docker et  ...
Livraison en continue avec l'outillage devops - Jenkins, Ansible, Docker et ...
 
Intégration de SonarQube dans GitLab ci
Intégration de SonarQube dans GitLab ciIntégration de SonarQube dans GitLab ci
Intégration de SonarQube dans GitLab ci
 
Cloud_2022.pdf
Cloud_2022.pdfCloud_2022.pdf
Cloud_2022.pdf
 

Destaque

Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIHugo Hamon
 
Jenkins - perdre du temps pour en gagner
Jenkins - perdre du temps pour en gagnerJenkins - perdre du temps pour en gagner
Jenkins - perdre du temps pour en gagnerGeeks Anonymes
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2Hugo Hamon
 
Continuous Integration (Jenkins/Hudson)
Continuous Integration (Jenkins/Hudson)Continuous Integration (Jenkins/Hudson)
Continuous Integration (Jenkins/Hudson)Dennys Hsieh
 
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntuDéveloppement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntuAhmed Archive
 
Jenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteJenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteStephane Couzinier
 
What's Next Replay - IC / Jenkins
What's Next Replay - IC / JenkinsWhat's Next Replay - IC / Jenkins
What's Next Replay - IC / JenkinsZenikaOuest
 
Déployer avec les tests
Déployer avec les testsDéployer avec les tests
Déployer avec les testsneuros
 
L'integration continue pour tous
L'integration continue pour tousL'integration continue pour tous
L'integration continue pour tousAurelien Navarre
 
JCertif 2012 : Integration continue avec Jenkins
JCertif 2012 : Integration continue avec JenkinsJCertif 2012 : Integration continue avec Jenkins
JCertif 2012 : Integration continue avec JenkinsRossi Oddet
 
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8Aurelien Navarre
 
BDD avec Behat, PhpSpec et Symfony2
BDD avec Behat, PhpSpec et Symfony2BDD avec Behat, PhpSpec et Symfony2
BDD avec Behat, PhpSpec et Symfony2Mohammed Rhamnia
 
Integration continue et déploiement automatisé
Integration continue et déploiement automatiséIntegration continue et déploiement automatisé
Integration continue et déploiement automatiséJérémie Campari
 
Presentation Symfony2
Presentation Symfony2Presentation Symfony2
Presentation Symfony2Ahmed ABATAL
 
Behat bdd training (php) course slides pdf
Behat bdd training (php) course slides pdfBehat bdd training (php) course slides pdf
Behat bdd training (php) course slides pdfseleniumbootcamp
 
Unit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitUnit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitMichelangelo van Dam
 
PHPUnit: from zero to hero
PHPUnit: from zero to heroPHPUnit: from zero to hero
PHPUnit: from zero to heroJeremy Cook
 
symfony : Un Framework Open-Source pour les Professionnels
symfony : Un Framework Open-Source pour les Professionnelssymfony : Un Framework Open-Source pour les Professionnels
symfony : Un Framework Open-Source pour les ProfessionnelsFabien Potencier
 
API 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat ConferenceAPI 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat ConferenceKirsten Hunter
 
Designing for developers
Designing for developersDesigning for developers
Designing for developersKirsten Hunter
 

Destaque (20)

Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CI
 
Jenkins - perdre du temps pour en gagner
Jenkins - perdre du temps pour en gagnerJenkins - perdre du temps pour en gagner
Jenkins - perdre du temps pour en gagner
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2
 
Continuous Integration (Jenkins/Hudson)
Continuous Integration (Jenkins/Hudson)Continuous Integration (Jenkins/Hudson)
Continuous Integration (Jenkins/Hudson)
 
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntuDéveloppement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
 
Jenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverteJenkins - Les jeudis de la découverte
Jenkins - Les jeudis de la découverte
 
What's Next Replay - IC / Jenkins
What's Next Replay - IC / JenkinsWhat's Next Replay - IC / Jenkins
What's Next Replay - IC / Jenkins
 
Déployer avec les tests
Déployer avec les testsDéployer avec les tests
Déployer avec les tests
 
L'integration continue pour tous
L'integration continue pour tousL'integration continue pour tous
L'integration continue pour tous
 
JCertif 2012 : Integration continue avec Jenkins
JCertif 2012 : Integration continue avec JenkinsJCertif 2012 : Integration continue avec Jenkins
JCertif 2012 : Integration continue avec Jenkins
 
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
 
BDD avec Behat, PhpSpec et Symfony2
BDD avec Behat, PhpSpec et Symfony2BDD avec Behat, PhpSpec et Symfony2
BDD avec Behat, PhpSpec et Symfony2
 
Integration continue et déploiement automatisé
Integration continue et déploiement automatiséIntegration continue et déploiement automatisé
Integration continue et déploiement automatisé
 
Presentation Symfony2
Presentation Symfony2Presentation Symfony2
Presentation Symfony2
 
Behat bdd training (php) course slides pdf
Behat bdd training (php) course slides pdfBehat bdd training (php) course slides pdf
Behat bdd training (php) course slides pdf
 
Unit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitUnit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnit
 
PHPUnit: from zero to hero
PHPUnit: from zero to heroPHPUnit: from zero to hero
PHPUnit: from zero to hero
 
symfony : Un Framework Open-Source pour les Professionnels
symfony : Un Framework Open-Source pour les Professionnelssymfony : Un Framework Open-Source pour les Professionnels
symfony : Un Framework Open-Source pour les Professionnels
 
API 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat ConferenceAPI 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat Conference
 
Designing for developers
Designing for developersDesigning for developers
Designing for developers
 

Semelhante a Intégration continue des projets PHP avec Jenkins

Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...Patrick Guimonet
 
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
 WordCamp Lyon 2015 - WordPress, Git et l'intégration continue WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
WordCamp Lyon 2015 - WordPress, Git et l'intégration continueStéphane HULARD
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsCocoaHeads France
 
Usine logicielle à Orange Labs
Usine logicielle à Orange LabsUsine logicielle à Orange Labs
Usine logicielle à Orange LabsEmmanuel Hugonnet
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache MavenArnaud Héritier
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptMichael Akbaraly
 
Grunt / Bower / Yeoman ou comment automatiser le développement d’un projet we...
Grunt / Bower / Yeoman ou comment automatiser le développement d’un projet we...Grunt / Bower / Yeoman ou comment automatiser le développement d’un projet we...
Grunt / Bower / Yeoman ou comment automatiser le développement d’un projet we...Microsoft
 
Grunt, Bower, Yeoman ou comment automatiser un projet web SPA
Grunt, Bower, Yeoman ou comment automatiser un projet web SPAGrunt, Bower, Yeoman ou comment automatiser un projet web SPA
Grunt, Bower, Yeoman ou comment automatiser un projet web SPATouchify
 
symfony : Simplifier le développement des interfaces bases de données (PHP ...
symfony : Simplifier le développement des interfaces bases de données (PHP ...symfony : Simplifier le développement des interfaces bases de données (PHP ...
symfony : Simplifier le développement des interfaces bases de données (PHP ...Fabien Potencier
 
Evolutions scub foundation 3.0 = 4.0
Evolutions scub foundation 3.0 =  4.0Evolutions scub foundation 3.0 =  4.0
Evolutions scub foundation 3.0 = 4.0adrienhautot
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyHugo Hamon
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0Patrick Guimonet
 
Paris Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyParis Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyFrançois Petitit
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Julien Dubois
 
Industrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPIndustrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPhalleck45
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureJonathan Bonzy
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureMarc Nazarian
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapideBilal Baltagi
 

Semelhante a Intégration continue des projets PHP avec Jenkins (20)

Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
Réduisez vos Coûts d'Administration et les Risques d'erreurs avec Windows Pow...
 
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
 WordCamp Lyon 2015 - WordPress, Git et l'intégration continue WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
 
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et JenkinsBuild automatique et distribution OTA avec Xcode 4.x et Jenkins
Build automatique et distribution OTA avec Xcode 4.x et Jenkins
 
Usine logicielle à Orange Labs
Usine logicielle à Orange LabsUsine logicielle à Orange Labs
Usine logicielle à Orange Labs
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascript
 
Grunt / Bower / Yeoman ou comment automatiser le développement d’un projet we...
Grunt / Bower / Yeoman ou comment automatiser le développement d’un projet we...Grunt / Bower / Yeoman ou comment automatiser le développement d’un projet we...
Grunt / Bower / Yeoman ou comment automatiser le développement d’un projet we...
 
Grunt, Bower, Yeoman ou comment automatiser un projet web SPA
Grunt, Bower, Yeoman ou comment automatiser un projet web SPAGrunt, Bower, Yeoman ou comment automatiser un projet web SPA
Grunt, Bower, Yeoman ou comment automatiser un projet web SPA
 
symfony : Simplifier le développement des interfaces bases de données (PHP ...
symfony : Simplifier le développement des interfaces bases de données (PHP ...symfony : Simplifier le développement des interfaces bases de données (PHP ...
symfony : Simplifier le développement des interfaces bases de données (PHP ...
 
Evolutions scub foundation 3.0 = 4.0
Evolutions scub foundation 3.0 =  4.0Evolutions scub foundation 3.0 =  4.0
Evolutions scub foundation 3.0 = 4.0
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0Power Shell V2 en action - avec Posh Board 2.0
Power Shell V2 en action - avec Posh Board 2.0
 
Paris Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyParis Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacy
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017
 
Industrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHPIndustrialiser le contrat dans un projet PHP
Industrialiser le contrat dans un projet PHP
 
Présentation1
Présentation1Présentation1
Présentation1
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapide
 

Mais de Hugo Hamon

Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
 
Monitor the quality of your Symfony projects
Monitor the quality of your Symfony projectsMonitor the quality of your Symfony projects
Monitor the quality of your Symfony projectsHugo Hamon
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design PatternsHugo Hamon
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & RESTHugo Hamon
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
 
Symfony2 - extending the console component
Symfony2 - extending the console componentSymfony2 - extending the console component
Symfony2 - extending the console componentHugo Hamon
 
Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)Hugo Hamon
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2Hugo Hamon
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Hugo Hamon
 
Symfony2 en pièces détachées
Symfony2 en pièces détachéesSymfony2 en pièces détachées
Symfony2 en pièces détachéesHugo Hamon
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkHugo Hamon
 

Mais de Hugo Hamon (12)

Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et Pimple
 
Monitor the quality of your Symfony projects
Monitor the quality of your Symfony projectsMonitor the quality of your Symfony projects
Monitor the quality of your Symfony projects
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
 
Silex meets SOAP & REST
Silex meets SOAP & RESTSilex meets SOAP & REST
Silex meets SOAP & REST
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
Symfony2 - extending the console component
Symfony2 - extending the console componentSymfony2 - extending the console component
Symfony2 - extending the console component
 
Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2
 
Symfony2 en pièces détachées
Symfony2 en pièces détachéesSymfony2 en pièces détachées
Symfony2 en pièces détachées
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
 

Intégration continue des projets PHP avec Jenkins

  • 1. INTÉGRATION CONTINUE D’UN PROJET PHP AVEC JENKINS. http://joind.in/talk/view/2863 Hugo Hamon – Confoo 2011 – Montreal, Canada
  • 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. 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. Avantages… Détecter les problèmes le plus tôt possible…
  • 5. Avantages… … a n d’alerter l’équipe le plus vite possible !
  • 6. Avantages… Générer des compilations régulièrement…
  • 7. Avantages… …a n d’obtenir des versions stables et déployables le plus souvent possible.
  • 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. Workflow de l’Intégration Continue Alice Build Successful SCM Server Bob Carlos CI Server
  • 10. Workflow de l’Intégration Continue Alice Build Failed SCM Server Bob Carlos Alerter l’équipe CI Server
  • 11. Workflow de l’Intégration Continue Alice Build Successful SCM Server Bob Carlos CI Server
  • 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. 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. 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)
  • 16. Installation Installation de Jenkins
  • 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
  • 19. Installer les outils PHP ¨  XDebug ¨  PHPUnit 3.5.x ¨  PDepend ¨  PHPCPD ¨  PHP Mess Detector ¨  PHP Documentor ¨  PHP CodeSniffer ¨  PHP CodeBrowser
  • 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. 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. 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. Nouveau projet Démarrer un nouveau projet
  • 24. Initialiser un nouveau projet ¨  Création d’un nouveau « projet free-style »
  • 25. Initialiser un nouveau projet ¨  Ajout d’une description et suppression des anciens builds
  • 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. Configuration du dépôt SVN ¨  Dé nition des droits d’accès au dépôt de code Subversion.
  • 28. Configuration du dépôt Git URL du dépôt de code Git Branche à construire Navigateur de code source
  • 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. Exécution et contrôle du build Build réussi !
  • 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. Phing Con guration de Phing
  • 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. 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. Commande SHELL à exécuter phing –f $WORKSPACE/build.xml build –Dws=$WORKSPACE
  • 36. PHPUnit Con guration des tests unitaires
  • 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. 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. 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. 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. Configurer la couverture de code ¨  Analyse et publication des rapports de couverture de code
  • 42. Analyse de la couverture de code
  • 43. Analyse des rapports de tests unitaires 9/9
  • 44. Analyse des tests unitaires
  • 45. Publication de la couverture de code
  • 46. Publication de la couverture de code
  • 47. PHPDocumentor Con guration de PHPDocumentor
  • 48. Générer la documentation d’API ¨  La PHPDoc est générée dans le dossier build/docs.
  • 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. Publication de la documentation API Accès à la doc API
  • 51. Publication de la documentation API
  • 52. PHPCPD Con guration de PHPCPD
  • 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. 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>
  • 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. PHPDepend Con guration de PHPDepend
  • 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. 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>
  • 62. PMD Con guration de PHP Mess Detector
  • 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. Configurer PHP Mess Detector Fichier de log généré par PMD
  • 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>
  • 67. PHP_CodeSniffer Con guration de PHP_CodeSniffer
  • 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. 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. 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. Publier le rapport des violations
  • 72. Publier le rapport des violations
  • 73. PHP Code Browser Con guration de PHP Code Browser
  • 74. Générer le navigateur de code ¨  La navigateur est généré dans le dossier build/browser.
  • 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. Publier le navigateur de code Accès au navigateur de code
  • 78. Prévenir et guérir au plus vite Con gurer des alertes
  • 79. Moyens de communication ¨  Emails ¨  Twitter ¨  Jabber ¨  RSS ¨  …
  • 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. Industrialisation Industrialiser l’intégration continue d’un projet PHP dans Jenkins ?
  • 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. Pour aller plus loin Aller plus loin…
  • 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
  • 86. Questions! Sensio S.A. 92-98, boulevard Victor Hugo 92 115 Clichy Cedex FRANCE www.sensiolabs.com - www.symfony.com - trainings.sensiolabs.com