<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.pascal-martin.fr/feed/rss2/xslt" ?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
  <title>Pascal MARTIN (n+1).zéro</title>
  <link>http://blog.pascal-martin.fr/</link>
  
  <description>Mots de Développement Web : PHP &amp; JavaScript</description>
  <language>fr</language>
  <pubDate>lun., 28 mai 2012 20:52:23 +0200</pubDate>
  <copyright>© Pascal MARTIN</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/pascal-martin" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="pascal-martin" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
    <title>Statistiques de versions de PHP - avril 2012</title>
    <link>http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04</link>
    <guid isPermaLink="false">urn:md5:60bae7082dc8fb66ff35a80817452605</guid>
    <pubDate>mer., 02 mai 2012 07:30:00 +0200</pubDate>
    <dc:creator>Pascal MARTIN</dc:creator>
        <category>Développement Web</category>
        <category>php</category><category>stats</category>    
    <description>&lt;p&gt;En &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09"&gt;septembre 2011&lt;/a&gt;, et en &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01"&gt;janvier cette année&lt;/a&gt;, j&amp;#8217;ai eu l&amp;#8217;occasion de publier deux articles présentant quelques statistiques d&amp;#8217;utilisation des différentes versions de PHP.&lt;/p&gt;

&lt;p&gt;Depuis, le dernier article de cette série, environ trois mois se sont écoulés, PHP 5.4 est sorti en sa première version stable &lt;em&gt;(le &lt;a href="http://www.php.net/archive/2012.php#id2012-03-01-1"&gt;1er mars&lt;/a&gt;)&lt;/em&gt;, et la version 5.4.1 est actuellement en RC&lt;sup id="fnref:php5.4.1"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fn:php5.4.1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;. Le moment semble donc venu de publier une mise à jour de ces statistiques.&lt;/p&gt;

&lt;p&gt;Les données présentées dans cet article ont été collectées le week-end du 21 avril 2012.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sommaire&amp;#160;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#methode"&gt;Quelques mots sur la méthode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#quelques-chiffres"&gt;Quelques chiffres&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#reponses-php"&gt;Réponses PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#serveurs-web"&gt;Serveurs Web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#versions-majeures"&gt;Versions majeures de PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#versions-mineures"&gt;Versions mineures de PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#versions-releases"&gt;Versions releases de PHP 5.x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#evolution"&gt;Evolution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="methode"&gt;Quelques mots sur la méthode&lt;/h2&gt;

&lt;p&gt;Pour faire simple, j’ai récupéré une liste de plus de 8.3 millions de noms de domaines, issus principalement&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Du top 1 million d’Alexa &lt;em&gt;(chargé plusieurs fois à quelques semaines/mois d&amp;#8217;écart, ce qui donne plus de 1 million de noms de domaines)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;Des liens externes de wikipedia de plusieurs langues &lt;em&gt;(environ 3 millions de noms de domaines)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;De l&amp;#8217;export mis à disposition par l&amp;#8217;Export Open Directory &lt;em&gt;(environ 2 millions de noms de domaines)&lt;/em&gt;, &lt;/li&gt;
&lt;li&gt;Et de quelques résultats de recherche google &lt;em&gt;(quelques milliers de noms de domaines)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensuite, pour chacun de ces noms de domaines, j’ai effectué une requête HTTP &lt;code&gt;HEAD&lt;/code&gt; sur &lt;code&gt;domaine.tld&lt;/code&gt;, en me rabattant sur &lt;code&gt;www.domaine.tld&lt;/code&gt; si la première requête échouait.&lt;/p&gt;

&lt;p&gt;Après cela, je me suis généralement&lt;sup id="fnref:note-entete-version"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fn:note-entete-version" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt; basé sur l’en-tête HTTP &lt;code&gt;X-Powered-By&lt;/code&gt; renvoyée par le serveur, pour en extraire le nom du logiciel ayant servir à générer la page, ainsi que sa version.
&lt;br /&gt;Et dans le cas où cette en-tête n’existe pas, ou ne contient pas d’information exploitable, je me suis rabattu sur l’en-tête &lt;code&gt;Server&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour rappel, et en ne prenant que quelques exemples relativement typiques, les en-têtes HTTP renvoyées par le serveur, dans le cas de pages générées par PHP et sur un serveur exposant la version de PHP utilisée, ressemblent souvent à quelque chose de ce type &lt;em&gt;(pour www.php.net)&lt;/em&gt;&amp;#160;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Server: Apache/1.3.41 (Unix) PHP/5.2.17
X-Powered-By: PHP/5.2.17
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ou &lt;em&gt;(pour www.afup.org)&lt;/em&gt;&amp;#160;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Server: Apache
X-Powered-By: PHP/5.2.14-0.dotdeb.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A partir de là, extraire le numéro de la version de PHP utilisée est une opération relativement aisée&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="quelques-chiffres"&gt;Quelques chiffres&lt;/h2&gt;

&lt;h3 id="reponses-php"&gt;Réponses PHP&lt;/h3&gt;

&lt;p&gt;Sur les 7.9 millions de requêtes HTTP effectuées sur les noms de domaines que j’ai testé, environ 26% des réponses ont été identifiées comme générées par du PHP.
&lt;br /&gt;Plus précisément, j’ai identifié &lt;strong&gt;2,063,505&lt;/strong&gt; réponses comme correspondant à du PHP.&lt;/p&gt;

&lt;p&gt;Avec ce nombre relativement conséquent de réponses, les statistiques présentées plus bas devraient avoir des chances d’être à peu près correctes, ou, tout au moins, de donner des résultats et chiffres relativement proches de la réalité&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id="serveurs-web"&gt;Serveurs Web&lt;/h3&gt;

&lt;p&gt;Cela dit, avant d&amp;#8217;entrer dans les détais des versions de PHP, voici la liste des Serveurs Web les plus fréquemment identifiés lors de ma collecte de données&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache&amp;#160;: 4,496,236 &amp;#8212; 67.16%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;IIS&amp;#160;: 1,227,240 &amp;#8212; 18.33%&lt;/li&gt;
&lt;li&gt;nginx&amp;#160;: 414,578 &amp;#8212; 6.19%&lt;/li&gt;
&lt;li&gt;Autres&amp;#160;: 268,720 &amp;#8212; 4.01%&lt;/li&gt;
&lt;li&gt;GSE&amp;#160;: 161,937 &amp;#8212; 2.42%&lt;/li&gt;
&lt;li&gt;YTS&amp;#160;: 49,382 &amp;#8212; 0.74%&lt;/li&gt;
&lt;li&gt;LiteSpeed&amp;#160;: 48,719 &amp;#8212; 0.73%&lt;/li&gt;
&lt;li&gt;Oversee Turing v1.0.0&amp;#160;: 28,359 &amp;#8212; 0.42%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou, sous forme d&amp;#8217;un graphe&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/serveurs.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/.serveurs_m.png" alt="Serveurs Web" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;On continuera de noter l&amp;#8217;importance d&amp;#8217;&lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt;, qui, toutes versions confondues, est toujours en tête, loin devant les autres.
&lt;br /&gt;&lt;a href="http://nginx.org/"&gt;nginx&lt;/a&gt;, quant à lui, confirme sa troisième place, en progressant même d&amp;#8217;un demi-point en trois mois.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="versions-majeures"&gt;Versions majeures de PHP&lt;/h2&gt;

&lt;p&gt;Commençons par les versions majeures de PHP, en prenant en compte les résultats qui ont été identifiés comme correspondant à une version supérieure ou égale à 3, et inférieure ou égale à 6&lt;sup id="fnref:note-exclusion-versions-abherrantes"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fn:note-exclusion-versions-abherrantes" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Mes tests ont remonté le nombre suivant de domaines sur chaque version majeure de PHP&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP 3&amp;#160;: 784 &amp;#8212; 0.04%&lt;/li&gt;
&lt;li&gt;PHP 4&amp;#160;: 248,241 &amp;#8212; 12.03%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5&amp;#160;: 1,814,376 &amp;#8212; 87.93%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PHP 6&amp;#160;: 31 &amp;#8212; 0.00%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sous forme d’un graphe, qui peut être plus parlant pour certains et permet de voir en un clin d’oeil quelle est la version majeure de PHP la plus répandue, cela donne&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/version-1.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/.version-1_m.png" alt="Versions majeures de PHP" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;On notera&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Que, fort heureusement, &lt;strong&gt;PHP 5 est la version majeure la plus répandue&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Mais que, en 2012, on a encore quelques centaines de sites, sur 7.9 millions, qui tournent encore sur du &lt;strong&gt;PHP 3&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Mais aussi que &lt;strong&gt;PHP 4&lt;/strong&gt; &lt;em&gt;(avec ses 12%)&lt;/em&gt; est encore beaucoup trop répandue, alors que cela fait des années que cette version n’est plus du tout maintenue &lt;em&gt;(PHP 4.4.9, publiée en &lt;a href="http://www.php.net/archive/2008.php#id2008-08-07-1"&gt;Août 2008&lt;/a&gt;, était annoncée comme étant la dernière version de PHP 4.x)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;Et enfin que, plus d’un an après la mise à mort de la branche &lt;strong&gt;PHP 6&lt;/strong&gt; &lt;em&gt;(qui, pour rappel, n’a jamais vu une version ne serait-ce qu’alpha être publiée)&lt;/em&gt;, on rencontre &lt;em&gt;(encore)&lt;/em&gt; des sites qui utilisent PHP 6&amp;#160;en production&lt;sup id="fnref:php6"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fn:php6" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;&amp;#160;???&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="versions-mineures"&gt;Versions mineures de PHP&lt;/h2&gt;

&lt;p&gt;Si on passe aux versions mineures de PHP, toujours pour PHP &amp;gt;= &lt;code&gt;3.x&lt;/code&gt; et PHP &amp;lt;= &lt;code&gt;6.x&lt;/code&gt;, et en ne conservant que les versions qui sont remontées 10 fois ou plus, on obtient les données suivantes&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP 3.0&amp;#160;: 782 &amp;#8212; 0.04%&lt;/li&gt;
&lt;li&gt;PHP 4.0&amp;#160;: 1,808 &amp;#8212; 0.09%&lt;/li&gt;
&lt;li&gt;PHP 4.1&amp;#160;: 4,292 &amp;#8212; 0.21%&lt;/li&gt;
&lt;li&gt;PHP 4.2&amp;#160;: 3,842 &amp;#8212; 0.19%&lt;/li&gt;
&lt;li&gt;PHP 4.3&amp;#160;: 55,257 &amp;#8212; 2.68%&lt;/li&gt;
&lt;li&gt;PHP 4.4&amp;#160;: 183,039 &amp;#8212; 8.87%&lt;/li&gt;
&lt;li&gt;PHP 5.0&amp;#160;: 7,286 &amp;#8212; 0.35%&lt;/li&gt;
&lt;li&gt;PHP 5.1&amp;#160;: 84,938 &amp;#8212; 4.12%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.2&amp;#160;: 1,189,049 &amp;#8212; 57.63%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.3&amp;#160;: 530,983 &amp;#8212; 25.73%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PHP 5.4&amp;#160;: 2,111 &amp;#8212; 0.10%&lt;/li&gt;
&lt;li&gt;PHP 6.0&amp;#160;: 29 &amp;#8212; 0.00%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et sous forme graphique&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/version-2.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/.version-2_m.png" alt="Versions mineures de PHP" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Pour résumer&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.2&lt;/strong&gt;, qui a &lt;a href="http://www.php.net/archive/2010.php#id2010-12-16-1"&gt;atteint sa fin de vie en décembre 2010&lt;/a&gt;, il y a déjà plus d&amp;#8217;un an, est toujours la version de PHP qui semble aujourd’hui la plus utilisée / répandue,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.3&lt;/strong&gt;, &lt;a href="http://www.php.net/archive/2009.php#id2009-06-30-1"&gt;stable depuis juin 2009&lt;/a&gt;, soit bientôt trois ans, n’arrive qu’en seconde place &amp;#8212; et loin derrière PHP 5.2,

&lt;ul&gt;
&lt;li&gt;Mais notons tout de même que PHP 5.3 a gagné plus de 7 points depuis janvier, ce qui lui permet, pour la première fois, &lt;strong&gt;d&amp;#8217;atteindre les 25%&lt;/strong&gt;&amp;#160;!&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;PHP 5.4, sortie en sa première version stable il y a moins de deux mois, atteint timidement les 0.10%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Considérant que PHP 5.2 est encore la version de PHP utilisée sur plus de la moitié des serveurs pour lesquels j&amp;#8217;ai obtenu des données, et que PHP 5.3, au bout de presque 3 ans, atteint tout juste les 25%, je suis curieux de voir quelle sera l&amp;#8217;évolution de PHP 5.4 sur les prochains mois&amp;#160;!&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="versions-releases"&gt;Versions releases de PHP&lt;/h2&gt;

&lt;p&gt;Et enfin, si on descend au niveau des versions release de &lt;code&gt;PHP 5.x&lt;/code&gt;&lt;sup id="fnref:note-versions-releases-php5-uniquement"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fn:note-versions-releases-php5-uniquement" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt;, en ne conservant que les versions qui remontées 100 fois ou plus, on obtient les données suivantes&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.0&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.0.1&amp;#160;: 118 &amp;#8212; 0.01%&lt;/li&gt;
&lt;li&gt;5.0.2&amp;#160;: 270 &amp;#8212; 0.01%&lt;/li&gt;
&lt;li&gt;5.0.3&amp;#160;: 691 &amp;#8212; 0.04%&lt;/li&gt;
&lt;li&gt;5.0.4&amp;#160;: 5,203 &amp;#8212; 0.29%&lt;/li&gt;
&lt;li&gt;5.0.5&amp;#160;: 950 &amp;#8212; 0.05%&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.1&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.1.1&amp;#160;: 335 &amp;#8212; 0.02%&lt;/li&gt;
&lt;li&gt;5.1.2&amp;#160;: 6,292 &amp;#8212; 0.35%&lt;/li&gt;
&lt;li&gt;5.1.3&amp;#160;: 1,539 &amp;#8212; 0.08%&lt;/li&gt;
&lt;li&gt;5.1.4&amp;#160;: 2,337 &amp;#8212; 0.13%&lt;/li&gt;
&lt;li&gt;5.1.5&amp;#160;: 255 &amp;#8212; 0.01%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.1.6&amp;#160;: 74,160 &amp;#8212; 4.09%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.2&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.2.0&amp;#160;: 23,240 &amp;#8212; 1.28%&lt;/li&gt;
&lt;li&gt;5.2.1&amp;#160;: 5,765 &amp;#8212; 0.32%&lt;/li&gt;
&lt;li&gt;5.2.2&amp;#160;: 1,872 &amp;#8212; 0.10%&lt;/li&gt;
&lt;li&gt;5.2.3&amp;#160;: 8,502 &amp;#8212; 0.47%&lt;/li&gt;
&lt;li&gt;5.2.4&amp;#160;: 42,825 &amp;#8212; 2.36%&lt;/li&gt;
&lt;li&gt;5.2.5&amp;#160;: 31,155 &amp;#8212; 1.72%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.2.6&amp;#160;: 162,833 &amp;#8212; 8.98%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;5.2.7&amp;#160;: 159 &amp;#8212; 0.01%&lt;/li&gt;
&lt;li&gt;5.2.8&amp;#160;: 23,952 &amp;#8212; 1.32%&lt;/li&gt;
&lt;li&gt;5.2.9&amp;#160;: 78,047 &amp;#8212; 4.30%&lt;/li&gt;
&lt;li&gt;5.2.10&amp;#160;: 42,968 &amp;#8212; 2.37%&lt;/li&gt;
&lt;li&gt;5.2.11&amp;#160;: 29,425 &amp;#8212; 1.62%&lt;/li&gt;
&lt;li&gt;5.2.12&amp;#160;: 37,048 &amp;#8212; 2.04%&lt;/li&gt;
&lt;li&gt;5.2.13&amp;#160;: 57,964 &amp;#8212; 3.20%&lt;/li&gt;
&lt;li&gt;5.2.14&amp;#160;: 57,252 &amp;#8212; 3.16%&lt;/li&gt;
&lt;li&gt;5.2.15&amp;#160;: 4,674 &amp;#8212; 0.26%&lt;/li&gt;
&lt;li&gt;5.2.16&amp;#160;: 24,621 &amp;#8212; 1.36%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.2.17&amp;#160;: 556,636 &amp;#8212; 30.68%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.3&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.3.0&amp;#160;: 3,022 &amp;#8212; 0.17%&lt;/li&gt;
&lt;li&gt;5.3.1&amp;#160;: 4,288 &amp;#8212; 0.24%&lt;/li&gt;
&lt;li&gt;5.3.2&amp;#160;: 54,067 &amp;#8212; 2.98%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.3.3&amp;#160;: 116,147 &amp;#8212; 6.40%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;5.3.4&amp;#160;: 5,552 &amp;#8212; 0.31%&lt;/li&gt;
&lt;li&gt;5.3.5&amp;#160;: 49,736 &amp;#8212; 2.74%&lt;/li&gt;
&lt;li&gt;5.3.6&amp;#160;: 44,931 &amp;#8212; 2.48%&lt;/li&gt;
&lt;li&gt;5.3.7&amp;#160;: 871 &amp;#8212; 0.05%&lt;/li&gt;
&lt;li&gt;5.3.8&amp;#160;: 74,447 &amp;#8212; 4.10%&lt;/li&gt;
&lt;li&gt;5.3.9&amp;#160;: 14,311 &amp;#8212; 0.79%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.3.10&amp;#160;: 163,515 &amp;#8212; 9.01%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.4&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.4.0&amp;#160;: 1,991 &amp;#8212; 0.11%&lt;/li&gt;
&lt;li&gt;5.4.1&amp;#160;: 119 &amp;#8212; 0.01%&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et sous forme graphique&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/version-3-5.x.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/.version-3-5.x_m.png" alt="Versions releases de PHP" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Pour résumer&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Une quantité non-négligeable de sites sous PHP &lt;strong&gt;5.1.6&lt;/strong&gt; &lt;em&gt;(qui a été publiée en &lt;a href="http://www.php.net/archive/2006.php"&gt;Août 2006&lt;/a&gt;)&lt;/em&gt;&amp;#160;; la version fournie par défaut sous certaines distributions, il me semble, genre Redhat Enterprise.&lt;/li&gt;
&lt;li&gt;Beaucoup de &lt;strong&gt;PHP 5.2.6&lt;/strong&gt; &lt;em&gt;(publiée en &lt;a href="http://www.php.net/archive/2008.php#id2008-05-01-1"&gt;Mai 2008&lt;/a&gt;)&lt;/em&gt;&amp;#160;; la version fournie par défaut sous Debian Lenny, par exemple.&lt;/li&gt;
&lt;li&gt;La version de PHP la plus répandue est PHP &lt;strong&gt;5.2.17&lt;/strong&gt; &lt;em&gt;(publiée en &lt;a href="http://www.php.net/archive/2011.php#id2011-01-06-1"&gt;Janvier 2011&lt;/a&gt;)&lt;/em&gt;&amp;#160;; ça reste du 5.2, qui a atteint sa &lt;em&gt;fin de vie&lt;/em&gt;, mais positivons, en se disant que c’est la dernière version, la plus à jour&amp;#8230;&lt;/li&gt;
&lt;li&gt;Et enfin, plusieurs sous-versions de &lt;strong&gt;PHP 5.3.x&lt;/strong&gt;, dont en particulier&amp;#160;:

&lt;ul&gt;
&lt;li&gt;PHP 5.3.3 &amp;#8212; version par défaut sous Debian Squeeze, notamment, &lt;/li&gt;
&lt;li&gt;Et PHP 5.3.10 &amp;#8212; dernière version stable de PHP 5.3.x&amp;#160;; étant la plus répandue des versions release de PHP 5.3.x.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Par pure curiosité, notons que PHP 5.4.1 est la version utilisée sur une centaine de serveurs, parmis les quelques millions de serveurs interrogés, alors qu&amp;#8217;au moment où ces données ont été collectées, cette version n&amp;#8217;avait été publiée qu&amp;#8217;en RC &lt;em&gt;(PHP 5.4.1 est sortie en version stable avant la publication de cet article, mais après la collecte des données qu&amp;#8217;il présente)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="evolution"&gt;Evolution&lt;/h2&gt;

&lt;p&gt;Je ne ferai pas une longue analyse sur le pourquoi du comment des chiffres que j’ai présentés ici&amp;#160;: libre à vous de commenter sur le trop grand usage de versions complètement obsolètes, et le manque de mise à jour que l’on peut, malheureusement, trop souvent constater&amp;#8230;&lt;/p&gt;

&lt;p&gt;Cela dit, puisque ce n&amp;#8217;est pas la première fois que j&amp;#8217;effectue ce processus de collecte de statistiques à propos des versions de PHP utilisées, je me suis dit qu&amp;#8217;il pouvait être intéressant de tracer un graphe représentant l&amp;#8217;évolution de ces utilisations.&lt;/p&gt;

&lt;p&gt;Le graphe reproduit ci-dessous présente donc l&amp;#8217;évolution de l&amp;#8217;utilisation des versions mineures de PHP, depuis septembre 2011&lt;sup id="fnref:note-evolution-pourcentages"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fn:note-evolution-pourcentages" rel="footnote"&gt;6&lt;/a&gt;&lt;/sup&gt;&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/evolution.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-04/.evolution_m.png" alt="Evolution de l'utilisation des versions (mineures) de PHP" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai essayé de mettre en évidence les versions les plus à même de nous concerner en ce moment &lt;em&gt;(à savoir, PHP 5.2, 5.3, et 5.4)&lt;/em&gt;, ainsi que, dans une moindre mesure les deux autres versions les plus utilisées &lt;em&gt;(autrement dit, PHP 4.4 et 5.1)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Le point clairement mis en évidence ici est que &lt;strong&gt;PHP 5.2 laisse petit à petit sa place à PHP 5.3&lt;/strong&gt; &amp;#8212; ce qui est une très bonne chose, même s&amp;#8217;il serait appréciable que la migration se fasse un peu plus rapidement, considérant les &amp;quot;nouveautés&amp;quot; qu&amp;#8217;apporte PHP 5.3, le fait que PHP 5.2 ait atteint sa fin de vie, ou même la sortie récente de PHP 5.4.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;

&lt;li id="fn:php5.4.1"&gt;
&lt;p&gt;PHP 5.4.1 a été publiée le &lt;a href="http://www.php.net/archive/2012.php#id2012-04-26-1"&gt;26 avril 2012&lt;/a&gt;, 
soit avant cet article, mais quelques jours après la collecte des données présentées ici. &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fnref:php5.4.1" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:note-entete-version"&gt;
&lt;p&gt;Pour certains types de serveurs ou de logiciels, j&amp;#8217;ai mis en place un bout de code qui 
va chercher les informations de version dans d&amp;#8217;autres en-têtes que &lt;code&gt;X-Powered-By&lt;/code&gt;.
Par exemple, pour les sites développés en ASP.NET, les informations de version figurent
généralement dans une en-tête nommée &lt;code&gt;X-AspNet-Version&lt;/code&gt;. &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fnref:note-entete-version" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:note-exclusion-versions-abherrantes"&gt;
&lt;p&gt;Pour ne pas prendre en compte les quelques résultats abherrant qu&amp;#8217;on aurait pu relever
&amp;#8212; du genre &lt;code&gt;overworld.su&lt;/code&gt; qui renvoi &lt;code&gt;X-Powered-By: PHP/10.0.0&lt;/code&gt;&amp;#160;??? &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fnref:note-exclusion-versions-abherrantes" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:php6"&gt;
&lt;p&gt;Même si on ne rencontre que très peu de serveurs sous PHP 6, cette version de PHP, qui n&amp;#8217;a 
jamais été publiée et dont le développement a même été abandonné, est tout de même déployée 
sur suffisament de machines pour attirer l’attention&amp;#160;: cela signifie que, un jour, quelqu’un 
a installé sur un serveur «&amp;#160;public&amp;#160;» une version de développement de PHP, et n’a ensuite pas 
pris la peine de le mettre à jour… &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fnref:php6" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:note-versions-releases-php5-uniquement"&gt;
&lt;p&gt;PHP 4 correspondant à des versions tellement dépassées que je préfére ne pas prendre
la peine de rentrer au niveau des versions release. &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fnref:note-versions-releases-php5-uniquement" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:note-evolution-pourcentages"&gt;
&lt;p&gt;Les chiffres présentés sur le graphique d&amp;#8217;évolution sont en pourcentages, afin d&amp;#8217;être 
indépendants du nombre d&amp;#8217;hôtes interrogés, qui varie à chaque série de collectes. &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#fnref:note-evolution-pourcentages" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=2j0-2UluO3Q:fpprLjE6rT8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=2j0-2UluO3Q:fpprLjE6rT8:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=2j0-2UluO3Q:fpprLjE6rT8:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=2j0-2UluO3Q:fpprLjE6rT8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=2j0-2UluO3Q:fpprLjE6rT8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=2j0-2UluO3Q:fpprLjE6rT8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=2j0-2UluO3Q:fpprLjE6rT8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=2j0-2UluO3Q:fpprLjE6rT8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#comment-form</comments>
      <wfw:comment>http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pascal-martin.fr/feed/atom/comments/105</wfw:commentRss>
      </item>
    
  <item>
    <title>Statistiques de versions de PHP - janvier 2012</title>
    <link>http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01</link>
    <guid isPermaLink="false">urn:md5:7fe0228f0eb013db4a4dc2dd682cfed0</guid>
    <pubDate>mar., 24 janv. 2012 08:00:00 +0100</pubDate>
    <dc:creator>Pascal MARTIN</dc:creator>
        <category>Développement Web</category>
        <category>php</category><category>stats</category>    
    <description>&lt;p&gt;Il y a quelques mois, j&amp;#8217;avais publié un article présentant des statistiques de déploiement des différentes versions de PHP&amp;#160;: &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09"&gt;Statistiques de versions de PHP - septembre 2011&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aujourd&amp;#8217;hui, alors qu&amp;#8217;environ quatre mois se sont écoulés et que la sortie de PHP 5.4 est imminente &lt;em&gt;(les données présentées dans cet articles ont été collectées entre vendredi 20 et dimanche 22 janvier 2011 &amp;#8212; après la sortie de la Release Candidate 6, qui est censée être la dernière pour PHP 5.4)&lt;/em&gt;, voici une mise à jour de ces statistiques.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sommaire&amp;#160;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#methode"&gt;Quelques mots sur la méthode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#quelques-chiffres"&gt;Quelques chiffres&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#reponses-php"&gt;Réponses PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#serveurs-web"&gt;Serveurs Web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#versions-majeures"&gt;Versions majeures de PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#versions-mineures"&gt;Versions mineures de PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#versions-releases"&gt;Versions releases de PHP 5.x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#evolution"&gt;Evolution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="methode"&gt;Quelques mots sur la méthode&lt;/h2&gt;

&lt;p&gt;Pour faire simple, j’ai récupéré une liste de plus de 7.7 millions de noms de domaines, issus principalement&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Du &lt;a href="http://www.alexa.com/topsites"&gt;top 1 million d’Alexa&lt;/a&gt; &lt;em&gt;(chargé plusieurs fois à quelques semaines d&amp;#8217;écart, ce qui donne plus de 1 million de noms de domaines)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;Du &lt;a href="http://www.quantcast.com/top-sites-1"&gt;top 1 million de Quantcast&lt;/a&gt;, &lt;/li&gt;
&lt;li&gt;Des liens externes de wikipedia de plusieurs langues &lt;em&gt;(environ 3 millions de noms de domaines)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;De l&amp;#8217;export mis à disposition par l&amp;#8217;&lt;a href="http://www.dmoz.org/rdf.html"&gt;Export Open Directory&lt;/a&gt; &lt;em&gt;(environ 2 millions de noms de domaines &amp;#8212; dont beaucoup de vieux sites, pour autant que je puisse en juger)&lt;/em&gt;, &lt;/li&gt;
&lt;li&gt;Et de quelques résultats de recherche google &lt;em&gt;(quelques milliers de noms de domaines)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensuite, pour chacun de ces noms de domaines, j’ai effectué une requête HTTP &lt;code&gt;HEAD&lt;/code&gt; sur &lt;code&gt;domaine.tld&lt;/code&gt;, en me rabattant sur &lt;code&gt;www.domaine.tld&lt;/code&gt; si la première requête échouait.&lt;/p&gt;

&lt;p&gt;Après cela, je me suis généralement&lt;sup id="fnref:note-entete-version"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fn:note-entete-version" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; basé sur l’en-tête HTTP &lt;code&gt;X-Powered-By&lt;/code&gt; renvoyée par le serveur, pour en extraire le nom de logiciel ayant servir à générer la page, ainsi que sa version.
&lt;br /&gt;Et dans le cas où cette en-tête n’existe pas, ou ne contient pas d’information exploitable, je me suis rabattu sur l’en-tête &lt;code&gt;Server&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour rappel, et en ne prenant que quelques exemples relativement typiques, les en-têtes HTTP renvoyées par le serveur, dans le cas de pages générées par PHP et sur un serveur exposant la version de PHP utilisée, ressemblent souvent à quelque chose de ce type &lt;em&gt;(pour www.php.net)&lt;/em&gt;&amp;#160;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Server: Apache/1.3.41 (Unix) PHP/5.2.17
X-Powered-By: PHP/5.2.17
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ou &lt;em&gt;(pour www.mozilla.org)&lt;/em&gt;&amp;#160;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Server: Apache
X-Powered-By: PHP/5.2.9
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A partir de là, extraire le numéro de la version de PHP utilisée est une opération relativement aisée&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="quelques-chiffres"&gt;Quelques chiffres&lt;/h2&gt;

&lt;h3 id="reponses-php"&gt;Réponses PHP&lt;/h3&gt;

&lt;p&gt;Sur les 7.4 millions de requêtes HTTP effectuées sur les noms de domaines que j’ai testé, environ 26% des réponses ont été identifiées comme générées par du PHP.&lt;/p&gt;

&lt;p&gt;Plus précisément, j’ai identifié &lt;strong&gt;1,947,849&lt;/strong&gt; réponses comme correspondant à du PHP.&lt;/p&gt;

&lt;p&gt;Avec ce nombre relativement conséquent de réponses, les statistiques présentées plus bas devraient avoir des chances d’être à peu près correctes, ou, tout au moins, de donner des résultats et chiffres relativement proches de la réalité des versions de PHP installées&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id="serveurs-web"&gt;Serveurs Web&lt;/h3&gt;

&lt;p&gt;Cela dit, avant d&amp;#8217;entrer dans le détail des versions de PHP, et même si ce n&amp;#8217;est pas vraiment le but premier de cet article ou de la collecte de données effectuée, voici la liste des Serveurs Web les plus fréquemment identifiés lors de ma collecte de données&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache&amp;#160;: 4,491,135 &amp;#8212; 67.80%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;IIS&amp;#160;: 1,233,729 &amp;#8212; 18.63%&lt;/li&gt;
&lt;li&gt;nginx&amp;#160;: 366,639 &amp;#8212; 5.54%&lt;/li&gt;
&lt;li&gt;Autres&amp;#160;: 261,484 &amp;#8212; 3.95%&lt;/li&gt;
&lt;li&gt;GSE&amp;#160;: 155,842 &amp;#8212; 2.35%&lt;/li&gt;
&lt;li&gt;YTS&amp;#160;: 47,748 &amp;#8212; 0.72%&lt;/li&gt;
&lt;li&gt;LiteSpeed&amp;#160;: 39,865 &amp;#8212; 0.60%&lt;/li&gt;
&lt;li&gt;lighttpd&amp;#160;: 27,163 &amp;#8212; 0.41%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou, sous forme d&amp;#8217;un graphe&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/serveurs.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/.serveurs_m.png" alt="Serveurs Web" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;On notera&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt;, toutes versions confondues, est toujours premier, loin devant les autres, &lt;/li&gt;
&lt;li&gt;&lt;a href="http://nginx.org/"&gt;nginx&lt;/a&gt; est dans le top 3, pour les données collectées ici &lt;em&gt;&amp;#8212; depuis le début de l&amp;#8217;année, il est annoncé comme ayant dépassé &lt;a href="http://www.iis.net/"&gt;IIS&lt;/a&gt; et atteint la seconde place pour les sites &amp;#171;&amp;#160;actifs&amp;#160;&amp;#187;, notion qui ne se retrouve pas dans les données utilisées pour rédiger cet article&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="versions-majeures"&gt;Versions majeures de PHP&lt;/h2&gt;

&lt;p&gt;Commençons par les versions majeures de PHP, en prenant en compte les résultats qui ont été identifiés comme correspondant à une version supérieure ou égale à 3, et inférieure ou égale à 6&lt;sup id="fnref:note-exclusion-versions-abherrantes"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fn:note-exclusion-versions-abherrantes" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Mes tests ont remonté le nombre suivant de domaines sur chaque version majeure de PHP&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP 3&amp;#160;: 851 &amp;#8212; 0.04%&lt;/li&gt;
&lt;li&gt;PHP 4&amp;#160;: 274,442 &amp;#8212; 14.09%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5&amp;#160;: 1,672,456 &amp;#8212; 85.86%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PHP 6&amp;#160;: 38 &amp;#8212; 0.00%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sous forme d’un graphe, qui peut être plus parlant pour certains et permet de voir en un clin d’oeil quelle est la version majeure de PHP la plus répandue, cela donne&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/version-1.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/.version-1_m.png" alt="Versions majeures de PHP" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;On notera&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Que, fort heureusement, &lt;strong&gt;PHP 5 est la version majeure la plus répandue&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Mais que, seconde moitié 2011, on a encore quelques centaines de sites, sur 7.4 millions, qui tournent encore sur du &lt;strong&gt;PHP 3&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Et aussi que &lt;strong&gt;PHP 4&lt;/strong&gt; est encore trop répandue, alors que cela fait des années que cette version n’est &lt;strong&gt;plus du tout maintenue&lt;/strong&gt; &lt;em&gt;(PHP 4.4.9, publiée en &lt;a href="http://www.php.net/archive/2008.php#id2008-08-07-1"&gt;Août 2008&lt;/a&gt;, était annoncée comme étant la dernière version de PHP 4.x)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;Et enfin que, plus d’un an après la mise à mort de la branche &lt;strong&gt;PHP 6&lt;/strong&gt; &lt;em&gt;(qui, pour rappel, n’a jamais vu une version ne serait-ce qu’alpha être publiée)&lt;/em&gt;, on rencontre &lt;em&gt;(encore)&lt;/em&gt; des sites qui utilisent PHP 6&amp;#160;en production&amp;#160;??? Très peu, certes, mais suffisamment pour attirer l&amp;#8217;attention&amp;#160;: cela signifie que, un jour, quelqu&amp;#8217;un a installé sur un serveur &amp;#171;&amp;#160;public&amp;#160;&amp;#187; une version de développement de PHP, et n&amp;#8217;a ensuite pas pris la peine de le mettre à jour&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="versions-mineures"&gt;Versions mineures de PHP&lt;/h2&gt;

&lt;p&gt;Si on passe aux versions mineures de PHP, toujours pour PHP &amp;gt;= &lt;code&gt;3.x&lt;/code&gt; et PHP &amp;lt;= &lt;code&gt;6.x&lt;/code&gt;, et en ne conservant que les versions qui sont remontées 10 fois ou plus, on obtient les données suivantes&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP 3.0&amp;#160;: 849 &amp;#8212; 0.04%&lt;/li&gt;
&lt;li&gt;PHP 4.0&amp;#160;: 1,945 &amp;#8212; 0.10%&lt;/li&gt;
&lt;li&gt;PHP 4.1&amp;#160;: 4,638 &amp;#8212; 0.24%&lt;/li&gt;
&lt;li&gt;PHP 4.2&amp;#160;: 4,262 &amp;#8212; 0.22%&lt;/li&gt;
&lt;li&gt;PHP 4.3&amp;#160;: 62,552 &amp;#8212; 3.21%&lt;/li&gt;
&lt;li&gt;PHP 4.4&amp;#160;: 201,042 &amp;#8212; 10.32%&lt;/li&gt;
&lt;li&gt;PHP 5.0&amp;#160;: 8,212 &amp;#8212; 0.42%&lt;/li&gt;
&lt;li&gt;PHP 5.1&amp;#160;: 95,439 &amp;#8212; 4.90%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.2&amp;#160;: 1,214,416 &amp;#8212; 62.35%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.3&amp;#160;: 354,182 &amp;#8212; 18.18%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PHP 5.4&amp;#160;: 198 &amp;#8212; 0.01%&lt;/li&gt;
&lt;li&gt;PHP 6.0&amp;#160;: 38 &amp;#8212; 0.00%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et sous forme graphique&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/version-2.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/.version-2_m.png" alt="Versions mineures de PHP" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Pour résumer&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.2&lt;/strong&gt;, qui a &lt;a href="http://www.php.net/archive/2010.php#id2010-12-16-1"&gt;atteint sa fin de vie en décembre 2010&lt;/a&gt;, il y a déjà plus d&amp;#8217;un an, est toujours, et de loin, la version de PHP qui semble aujourd’hui la plus utilisée / répandue,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.3&lt;/strong&gt;, &lt;a href="http://www.php.net/archive/2009.php#id2009-06-30-1"&gt;stable depuis juin 2009&lt;/a&gt;, soit plus de deux ans et demi, n’arrive qu’en seconde place &amp;#8212; et loin derrière PHP 5.2,&lt;/li&gt;
&lt;li&gt;Et PHP 5.1 et 4.3/4.4 sont relativement proches l’un de l’autre.&lt;/li&gt;
&lt;li&gt;Enfin, &lt;strong&gt;PHP 5.4&lt;/strong&gt;, qui n&amp;#8217;est pas encore sortie en version stable &lt;em&gt;(les données utilisées utilisées ici ont été collectées après la sortie de la RC6, et avant la sortie de la première version stable)&lt;/em&gt;, est déjà utilisée sur un nombre non-négligeale de serveurs publics&amp;#160;; et on trouve un peu de tout&amp;#160;: &lt;code&gt;beta1&lt;/code&gt;, &lt;code&gt;RC2&lt;/code&gt;, &lt;code&gt;RC3&lt;/code&gt;, &lt;code&gt;RC4&lt;/code&gt;, &lt;code&gt;RC5&lt;/code&gt;, &lt;code&gt;RC6&lt;/code&gt;, &amp;#8230; Donc il ne semble pas s&amp;#8217;agir d&amp;#8217;une volonté de tester/valider la toute dernière version&lt;sup id="fnref:note-validation-derniere-version"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fn:note-validation-derniere-version" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="versions-releases"&gt;Versions releases de PHP&lt;/h2&gt;

&lt;p&gt;Et enfin, si on descend au niveau des versions release de &lt;code&gt;PHP 5.x&lt;/code&gt;&lt;sup id="fnref:note-versions-releases-php5-uniquement"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fn:note-versions-releases-php5-uniquement" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;, en ne conservant que les versions qui remontées 100 fois ou plus, on obtient les données suivantes&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.0&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.0.1&amp;#160;: 143 &amp;#8212; 0.01%&lt;/li&gt;
&lt;li&gt;5.0.2&amp;#160;: 305 &amp;#8212; 0.02%&lt;/li&gt;
&lt;li&gt;5.0.3&amp;#160;: 851 &amp;#8212; 0.05%&lt;/li&gt;
&lt;li&gt;5.0.4&amp;#160;: 5,723 &amp;#8212; 0.34%&lt;/li&gt;
&lt;li&gt;5.0.5&amp;#160;: 1,135 &amp;#8212; 0.07%&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.1&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.1.1&amp;#160;: 415 &amp;#8212; 0.02%&lt;/li&gt;
&lt;li&gt;5.1.2&amp;#160;: 7,163 &amp;#8212; 0.43%&lt;/li&gt;
&lt;li&gt;5.1.3&amp;#160;: 1,540 &amp;#8212; 0.09%&lt;/li&gt;
&lt;li&gt;5.1.4&amp;#160;: 2,588 &amp;#8212; 0.15%&lt;/li&gt;
&lt;li&gt;5.1.5&amp;#160;: 289 &amp;#8212; 0.02%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.1.6&amp;#160;: 83,424 &amp;#8212; 4.99%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.2&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.2.0&amp;#160;: 27,968 &amp;#8212; 1.67%&lt;/li&gt;
&lt;li&gt;5.2.1&amp;#160;: 5,823 &amp;#8212; 0.35%&lt;/li&gt;
&lt;li&gt;5.2.2&amp;#160;: 2,026 &amp;#8212; 0.12%&lt;/li&gt;
&lt;li&gt;5.2.3&amp;#160;: 9,349 &amp;#8212; 0.56%&lt;/li&gt;
&lt;li&gt;5.2.4&amp;#160;: 45,958 &amp;#8212; 2.75%&lt;/li&gt;
&lt;li&gt;5.2.5&amp;#160;: 34,122 &amp;#8212; 2.04%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.2.6&amp;#160;: 192,326 &amp;#8212; 11.50%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;5.2.7&amp;#160;: 159 &amp;#8212; 0.01%&lt;/li&gt;
&lt;li&gt;5.2.8&amp;#160;: 22,939 &amp;#8212; 1.37%&lt;/li&gt;
&lt;li&gt;5.2.9&amp;#160;: 84,735 &amp;#8212; 5.07%&lt;/li&gt;
&lt;li&gt;5.2.10&amp;#160;: 43,988 &amp;#8212; 2.63%&lt;/li&gt;
&lt;li&gt;5.2.11&amp;#160;: 32,939 &amp;#8212; 1.97%&lt;/li&gt;
&lt;li&gt;5.2.12&amp;#160;: 42,008 &amp;#8212; 2.51%&lt;/li&gt;
&lt;li&gt;5.2.13&amp;#160;: 64,110 &amp;#8212; 3.83%&lt;/li&gt;
&lt;li&gt;5.2.14&amp;#160;: 64,124 &amp;#8212; 3.83%&lt;/li&gt;
&lt;li&gt;5.2.15&amp;#160;: 5,507 &amp;#8212; 0.33%&lt;/li&gt;
&lt;li&gt;5.2.16&amp;#160;: 28,964 &amp;#8212; 1.73%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.2.17&amp;#160;: 507,259 &amp;#8212; 30.33%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.3&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.3.0&amp;#160;: 3,076 &amp;#8212; 0.18%&lt;/li&gt;
&lt;li&gt;5.3.1&amp;#160;: 4,575 &amp;#8212; 0.27%&lt;/li&gt;
&lt;li&gt;5.3.2&amp;#160;: 47,836 &amp;#8212; 2.86%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.3.3&amp;#160;: 79,910 &amp;#8212; 4.78%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;5.3.4&amp;#160;: 6,723 &amp;#8212; 0.40%&lt;/li&gt;
&lt;li&gt;5.3.5&amp;#160;: 37,700 &amp;#8212; 2.25%&lt;/li&gt;
&lt;li&gt;5.3.6&amp;#160;: 60,296 &amp;#8212; 3.61%&lt;/li&gt;
&lt;li&gt;5.3.7&amp;#160;: 861 &amp;#8212; 0.05%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.3.8&amp;#160;: 90,884 &amp;#8212; 5.43%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.3.9&amp;#160;: 22,282 &amp;#8212; 1.33%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.4&lt;/strong&gt;&amp;#160;:

&lt;ul&gt;
&lt;li&gt;5.4.0&amp;#160;: 197 &amp;#8212; 0.01%&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et sous forme graphique&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/version-3-5.x.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/.version-3-5.x_m.png" alt="Versions releases de PHP" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Pour résumer&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Une quantité non-négligeable de sites sous PHP &lt;strong&gt;5.1.6&lt;/strong&gt; &lt;em&gt;(qui a été publiée en &lt;a href="http://www.php.net/archive/2006.php"&gt;Août 2006&lt;/a&gt;)&lt;/em&gt;&amp;#160;; la version fournie par défaut sous certaines distributions, il me semble, genre Redhat Enterprise.&lt;/li&gt;
&lt;li&gt;Beaucoup de &lt;strong&gt;PHP 5.2.6&lt;/strong&gt; &lt;em&gt;(publiée en &lt;a href="http://www.php.net/archive/2008.php#id2008-05-01-1"&gt;Mai 2008&lt;/a&gt;)&lt;/em&gt;&amp;#160;; la version fournie par défaut sous Debian Lenny, par exemple.&lt;/li&gt;
&lt;li&gt;La version de PHP la plus répandue est PHP &lt;strong&gt;5.2.17&lt;/strong&gt; &lt;em&gt;(publiée en &lt;a href="http://www.php.net/archive/2011.php#id2011-01-06-1"&gt;Janvier 2011&lt;/a&gt;)&lt;/em&gt;&amp;#160;; ça reste du 5.2, qui a atteint sa &lt;em&gt;fin de vie&lt;/em&gt;, mais positivons, en se disant que c’est la dernière version, la plus à jour&amp;#8230;&lt;/li&gt;
&lt;li&gt;Et enfin, plusieurs sous versions de &lt;strong&gt;PHP 5.3.x&lt;/strong&gt;, sans qu’aucune ne s’impose réellement&amp;#160;; notons que la version 5.3.7, avec son bug de sécurité, et qui n’a été disponible que quelques jours, n’est heureusement pas la plus répandue&lt;sup id="fnref:php5.3.7"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fn:php5.3.7" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id="evolution"&gt;Evolution&lt;/h2&gt;

&lt;p&gt;Je ne ferai pas une longue analyse sur le pourquoi du comment des chiffres que j’ai présenté ici&amp;#160;: libre à vous de commenter sur le trop grand usage de versions complètement obsolètes, et le manque de mise à jour que l’on peut, malheureusement, trop souvent constater&amp;#8230;&lt;/p&gt;

&lt;p&gt;Cela dit, puisque ce n&amp;#8217;est pas la première fois que j&amp;#8217;effectue ce processus de collecte de statistiques à propos des versions de PHP utilisées, je me suis dit qu&amp;#8217;il pouvait être intéressant de tracer un graphe représentant l&amp;#8217;évolution de ces utilisations.&lt;/p&gt;

&lt;p&gt;Le graphe reproduit ci-dessous présente donc l&amp;#8217;évolution de l&amp;#8217;utilisation des versions mineures de PHP, depuis &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09"&gt;septembre 2011&lt;/a&gt;&lt;sup id="fnref:note-evolution-pourcentages"&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fn:note-evolution-pourcentages" rel="footnote"&gt;6&lt;/a&gt;&lt;/sup&gt;, date à laquelle j&amp;#8217;ai effectué ce type d&amp;#8217;analyse pour la première fois &lt;em&gt;(avec un point en décembre 2011, où j&amp;#8217;avais effectué une collecte partielle de données, pour tester les améliorations que j&amp;#8217;étais en train d&amp;#8217;effectuer sur mes scripts)&lt;/em&gt;&amp;#160;:&lt;/p&gt;

&lt;p&gt;&lt;span style="display: block; text-align: center;"&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/evolution.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2012-01/.evolution_m.png" alt="Evolution de l'utilisation des versions (mineures) de PHP" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai essayé de mettre en évidence les versions les plus à même de nous concerner en ce moment &lt;em&gt;(à savoir, PHP 5.2, 5.3, et 5.4)&lt;/em&gt;, ainsi que, dans une moindre mesure les deux autres versions les plus utilisées &lt;em&gt;(autrement dit, PHP 4.4 et 5.1)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Notes importantes&amp;#160;: la liste des sites analysés a énormément évolué entre septembre 2011 et janvier 2012&amp;#160;!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entre septembre et décembre 2011, plus de 3 million de noms de domaines ont été ajoutés à ma liste&amp;#160;; dont une portion non-négligeable correspondant à de &lt;em&gt;vieux&lt;/em&gt; sites &lt;em&gt;(liste provenant principalement de l&amp;#8217;export &lt;a href="http://www.dmoz.org/rdf.html"&gt;ODP&lt;/a&gt;)&lt;/em&gt;. Ceci explique l&amp;#8217;augmentation du pourcentage de sites utilisant PHP 4 et la diminution du pourcentage de sites utilisant PHP 5.2, entre septembre et décembre 2011&amp;#160;: selon toute logique, plus d&amp;#8217;&lt;em&gt;anciens&lt;/em&gt; sites signifie plus d&amp;#8217;anciens serveurs, pour certains non mis à jour.&lt;/li&gt;
&lt;li&gt;Les noms de domaines ajoutés ensuite, entre décembre 2011 et janvier 2012, correspondent principalement à des sites &lt;em&gt;actifs&lt;/em&gt;, selon toute logique plus récents et/ou plus récemment mis à jour, et on retrouve la progression à laquelle on s&amp;#8217;attendrait&amp;#160;: augmentation du nombre de serveurs en PHP 5.3, au détriment de PHP 5.2 et 4.x.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Autrement dit&amp;#160;: &lt;strong&gt;ce graphique n&amp;#8217;est pas à considérer comme réfletant la réalité des évolutions des versions de PHP entre septembre et décembre 2011&amp;#160;!&lt;/strong&gt;
&lt;br /&gt;&lt;em&gt;Il deviendra probablement plus utile si je continue à publier ce type d&amp;#8217;analyse dans le futur &amp;#8212; c&amp;#8217;est pourquoi je l&amp;#8217;affiche tout de même ici.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;

&lt;li id="fn:note-entete-version"&gt;
&lt;p&gt;Pour certains types de serveurs ou de logiciels, j&amp;#8217;ai mis en place un bout de code qui 
va chercher les informations de version dans d&amp;#8217;autres en-têtes que &lt;code&gt;X-Powered-By&lt;/code&gt;.
Par exemple, pour les sites développés en ASP.NET, les informations de version figurent
généralement dans une en-tête nommée &lt;code&gt;X-AspNet-Version&lt;/code&gt;. &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fnref:note-entete-version" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:note-exclusion-versions-abherrantes"&gt;
&lt;p&gt;Pour ne pas prendre en compte les quelques résultats abherrant qu&amp;#8217;on aurait pu relever
&amp;#8212; du genre &lt;code&gt;overworld.su&lt;/code&gt; qui renvoi &lt;code&gt;X-Powered-By: PHP/10.0.0&lt;/code&gt;&amp;#160;??? &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fnref:note-exclusion-versions-abherrantes" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:note-validation-derniere-version"&gt;
&lt;p&gt;Et ce type de validation, de toute manière, n&amp;#8217;est normalement pas le genre de chose
qui se fait sur un serveur de production, public&amp;#8230; &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fnref:note-validation-derniere-version" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:note-versions-releases-php5-uniquement"&gt;
&lt;p&gt;PHP 4 correspondant à des versions tellement dépassées que je préfére ne pas prendre
la peine de rentrer au niveau des versions release. &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fnref:note-versions-releases-php5-uniquement" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:php5.3.7"&gt;
&lt;p&gt;On pourrait souhaiter qu’une version connue pour un problème de sécurité comme ne soit
celui qui avait fait tant de bruit au moment de PHP 5.3.7 ne soit absolument pas utilisée&amp;#8230;
Mais, malheureusement&amp;#8230; &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fnref:php5.3.7" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:note-evolution-pourcentages"&gt;
&lt;p&gt;Les chiffres présentés sur le graphique d&amp;#8217;évolution sont en pourcentages, afin d&amp;#8217;être 
indépendants du nombre d&amp;#8217;hôtes interrogés, qui varie à chaque série de collectes. &lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#fnref:note-evolution-pourcentages" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=PhuYmy8-JyA:pzuExStjKb4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=PhuYmy8-JyA:pzuExStjKb4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=PhuYmy8-JyA:pzuExStjKb4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=PhuYmy8-JyA:pzuExStjKb4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=PhuYmy8-JyA:pzuExStjKb4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=PhuYmy8-JyA:pzuExStjKb4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=PhuYmy8-JyA:pzuExStjKb4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=PhuYmy8-JyA:pzuExStjKb4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#comment-form</comments>
      <wfw:comment>http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pascal-martin.fr/feed/atom/comments/104</wfw:commentRss>
      </item>
    
  <item>
    <title>Traduction française de « Zend Framework: Survive The Deep End! »</title>
    <link>http://blog.pascal-martin.fr/post/traduction-francaise-zend-framework-survive-the-deep-end</link>
    <guid isPermaLink="false">urn:md5:1976f668474b11801e3316a84f7f533e</guid>
    <pubDate>lun., 07 nov. 2011 07:00:00 +0100</pubDate>
    <dc:creator>Pascal MARTIN</dc:creator>
        <category>Développement Web</category>
        <category>php</category><category>traduction</category><category>zend-framework</category><category>zfstde</category>    
    <description>&lt;p&gt;Courant juin 2009, &lt;a href="http://blog.astrumfutura.com/" hreflang="en"&gt;Pádraic Brady&lt;/a&gt;, auteur du livre électronique &lt;a href="http://survivethedeepend.com/" hreflang="en"&gt;Zend Framework, Surviving The Deep End&lt;/a&gt;, a lancé un projet de traduction de celui-ci en plusieurs langues.&lt;/p&gt;


&lt;p&gt;Sur les mois qui ont suivis, deux traductions ont été réalisées&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une traduction en allemand, par &lt;a href="http://www.matthias-zeis.com/" hreflang="de"&gt;Matthias Zeis&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Et une traduction en français, par moi-même.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Malheureusement, pour diverses raisons, les deux traductions réalisées n&amp;#8217;ont jamais été publiées&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/traduction-francaise-zend-framework-survive-the-deep-end#pnote-86-1" id="rev-pnote-86-1"&gt;1&lt;/a&gt;]&lt;/sup&gt;.
&lt;br /&gt;En y repensant il y a quelques semaines de ça, Matthias et moi nous sommes dit que, même si Zend Framework 1.x date un peu et que ZF 2.x approche, ces deux traductions pourraient peut-être tout de même être utiles à quelqu&amp;#8217;un, et qu&amp;#8217;il était de toute manière dommage de ne pas les mettre en ligne.&lt;/p&gt;


&lt;p&gt;Nous les avons donc uploadées les versions HTML &lt;em&gt;&amp;#171;&amp;#160;brutes&amp;#160;&amp;#187;&lt;/em&gt;&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/traduction-francaise-zend-framework-survive-the-deep-end#pnote-86-2" id="rev-pnote-86-2"&gt;2&lt;/a&gt;]&lt;/sup&gt; ce week-end&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/public/zfstde-fr/" hreflang="fr"&gt;Traduction française de Zend Framework, Surviving The Deep End&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;et &lt;a href="http://www.matthias-zeis.com/ressourcen/zfstde/" hreflang="de"&gt;Traduction allemande de Zend Framework, Surviving The Deep End&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En espérant que ceci pourra encore s&amp;#8217;avérer utile, même après tout ce temps, je vous souhaite une bonne lecture&amp;#160;!&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class="footnotes"&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/traduction-francaise-zend-framework-survive-the-deep-end#rev-pnote-86-1" id="pnote-86-1"&gt;1&lt;/a&gt;] ni sur le site officiel de ZFSDTE, ni ailleurs&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/traduction-francaise-zend-framework-survive-the-deep-end#rev-pnote-86-2" id="pnote-86-2"&gt;2&lt;/a&gt;] sans trop d&amp;#8217;effort sur la CSS, autrement dit&amp;#160;; mais le contenu est là&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=26E2Xj1TIb0:oQM_9G7HBmo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=26E2Xj1TIb0:oQM_9G7HBmo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=26E2Xj1TIb0:oQM_9G7HBmo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=26E2Xj1TIb0:oQM_9G7HBmo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=26E2Xj1TIb0:oQM_9G7HBmo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=26E2Xj1TIb0:oQM_9G7HBmo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=26E2Xj1TIb0:oQM_9G7HBmo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=26E2Xj1TIb0:oQM_9G7HBmo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.pascal-martin.fr/post/traduction-francaise-zend-framework-survive-the-deep-end#comment-form</comments>
      <wfw:comment>http://blog.pascal-martin.fr/post/traduction-francaise-zend-framework-survive-the-deep-end#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pascal-martin.fr/feed/atom/comments/86</wfw:commentRss>
      </item>
    
  <item>
    <title>Statistiques de versions de PHP - septembre 2011</title>
    <link>http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09</link>
    <guid isPermaLink="false">urn:md5:f226697648848df265a946725acf4029</guid>
    <pubDate>lun., 03 oct. 2011 07:45:00 +0200</pubDate>
    <dc:creator>Pascal MARTIN</dc:creator>
        <category>Développement Web</category>
        <category>php</category><category>stats</category>    
    <description>&lt;p&gt;Avec la sortie de PHP 5.4 qui approche petit à petit&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#pnote-103-1" id="rev-pnote-103-1"&gt;1&lt;/a&gt;]&lt;/sup&gt;, et PHP 5.3 rendue publique il y a plus de deux ans, je me demandais quelles sont les versions de PHP qui sont, aujourd&amp;#8217;hui, les plus utilisées &amp;#8212; et, donc, quelles sont les versions de PHP sur lesquelles nous pouvons nous attendre à voir nos applications déployées.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Sommaire&amp;#160;:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#methode"&gt;Quelques mots sur la méthode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#versions-majeures"&gt;Versions majeures de PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#versions-mineures"&gt;Versions mineures de PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#versions-releases"&gt;Versions release de PHP 5.x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#mot-de-la-fin"&gt;Le mot de la fin&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Quelques mots sur la méthode &lt;a name="methode"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Pour faire simple, j&amp;#8217;ai récupéré une liste de plus de 3 millions de noms de domaines, issus&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Du top 1 million d&amp;#8217;Alexa,&lt;/li&gt;
&lt;li&gt;Des liens externes de wikipedia en anglais &lt;em&gt;(plus de 2 million de noms de domaines non compris dans le top Alexa)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;Et de quelques résultats de recherche google &lt;em&gt;(quelques milliers de noms de domaines)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensuite, pour chacun de ces noms de domaines, j&amp;#8217;ai effectué une requête HTTP &lt;code&gt;HEAD&lt;/code&gt; sur &lt;code&gt;domaine.tld&lt;/code&gt;, en me rabattant sur &lt;code&gt;www.domaine.tld&lt;/code&gt; si la première requête échouait.&lt;/p&gt;


&lt;p&gt;Après cela, je me suis basé sur l&amp;#8217;en-tête HTTP &lt;code&gt;X-Powered-By&lt;/code&gt; renvoyée par le serveur, pour en extraire le nom de logiciel ayant servir à générer la page, ainsi que sa version.
&lt;br /&gt;Et dans le cas où cette en-tête n&amp;#8217;existe pas, ou ne contient pas d&amp;#8217;information exploitable, je me suis rabattu sur l&amp;#8217;en-tête &lt;code&gt;Server&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Pour rappel, et en ne prenant que quelques exemples relativement typiques, les en-têtes HTTP renvoyées par le serveur, dans le cas de pages générées par PHP et sur un serveur exposant la version de PHP utilisée, ressemblent souvent à quelque chose de ce type &lt;em&gt;(pour www.php.net)&lt;/em&gt;&amp;#160;:&lt;/p&gt;

&lt;pre&gt;
Server: Apache/1.3.41 (Unix) PHP/5.2.17
X-Powered-By: PHP/5.2.17
&lt;/pre&gt;


&lt;p&gt;ou &lt;em&gt;(pour www.mozilla.org)&lt;/em&gt;&amp;#160;:&lt;/p&gt;

&lt;pre&gt;
Server: Apache
X-Powered-By: PHP/5.2.9
&lt;/pre&gt;


&lt;p&gt;A partir de là, extraire le numéro de la version de PHP utilisée est une opération relativement aisée&amp;#8230;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;PHP&amp;#160;?&lt;/h2&gt;


&lt;p&gt;Sur les 3.1 million de requêtes HTTP effectuées sur les noms de domaines que j&amp;#8217;ai testé, environ 25% des réponses ont été identifiées comme générées par du PHP.&lt;/p&gt;


&lt;p&gt;Plus précisément, j&amp;#8217;ai identifié &lt;strong&gt;828,564&lt;/strong&gt; réponses comme correspondant à du PHP.&lt;/p&gt;


&lt;p&gt;Avec plus de 800k réponses, les statistiques présentées plus bas devraient avoir des chances d&amp;#8217;être à peu près correctes, ou, tout au moins, de donner des résultats et chiffres relativement proches de la réalité&amp;#8230;&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Versions majeures de PHP &lt;a name="versions-majeures"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Commençons par les versions majeures de PHP, en prenant en compte les résultats qui ont été identifiés comme correspondant à une version supérieure ou égale à &lt;code&gt;3&lt;/code&gt;, et inférieure ou égale à &lt;code&gt;6&lt;/code&gt;&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#pnote-103-2" id="rev-pnote-103-2"&gt;2&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;Mes tests ont remonté le nombre suivant de domaines sur chaque version majeure de PHP&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP 3&amp;#160;: 257&lt;/li&gt;
&lt;li&gt;PHP 4&amp;#160;: 86,594&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5&amp;#160;: 741,638&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PHP 6&amp;#160;: 18&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sous forme d&amp;#8217;un graphe, qui peut être plus parlant pour certains et permet de voir en un clin d&amp;#8217;oeil quelle est la version majeure de PHP la plus répandue, cela donne&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2011-09/version-1.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2011-09/.version-1_m.png" alt="version-1.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;On notera&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Que, fort heureusement, &lt;strong&gt;PHP 5 est la version majeure la plus répandue&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Mais que, seconde moitié 2011, on a encore quelques centaines de sites, sur 3 millions, qui tournent encore sur du &lt;strong&gt;PHP 3&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Et aussi que &lt;strong&gt;PHP 4&lt;/strong&gt; est encore trop répandue, alors que cela fait des années que cette version n&amp;#8217;est plus du tout maintenue &lt;em&gt;(PHP 4.4.9, publiée en &lt;a href="http://www.php.net/archive/2008.php#id2008-08-07-1"&gt;Août 2008&lt;/a&gt;, était annoncée comme étant la dernière version de PHP 4.x)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;Et enfin que, plus d&amp;#8217;un an après la mise à mort de la branche &lt;strong&gt;PHP 6&lt;/strong&gt; &lt;em&gt;(qui, pour rappel, n&amp;#8217;a jamais vu une version ne serait-ce qu&amp;#8217;alpha être publiée)&lt;/em&gt;, on rencontre &lt;em&gt;(encore)&lt;/em&gt; des sites qui utilisent PHP 6&amp;#160;en production&amp;#160;???&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Versions mineures de PHP &lt;a name="versions-mineures"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Si on passe aux versions mineures de PHP, toujours pour PHP &amp;gt;= &lt;code&gt;3.x&lt;/code&gt; et PHP &amp;lt;= &lt;code&gt;6.x&lt;/code&gt;, et en ne conservant que les versions qui sont remontées 10 fois ou plus, on obtient les données suivantes&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP 3.0&amp;#160;: 257&lt;/li&gt;
&lt;li&gt;PHP 4.0&amp;#160;: 595&lt;/li&gt;
&lt;li&gt;PHP 4.1&amp;#160;: 1,385&lt;/li&gt;
&lt;li&gt;PHP 4.2&amp;#160;: 1,446&lt;/li&gt;
&lt;li&gt;PHP 4.3&amp;#160;: 22,095&lt;/li&gt;
&lt;li&gt;PHP 4.4&amp;#160;: 61,072&lt;/li&gt;
&lt;li&gt;PHP 5.0&amp;#160;: 3,422&lt;/li&gt;
&lt;li&gt;PHP 5.1&amp;#160;: 47,695&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.2&amp;#160;: 566,243&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.3&amp;#160;: 124,240&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PHP 5.4&amp;#160;: 30&lt;/li&gt;
&lt;li&gt;PHP 6.0&amp;#160;: 17&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et sous forme graphique&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2011-09/version-2.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2011-09/.version-2_m.png" alt="version-2.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Pour résumer&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.2&lt;/strong&gt;, qui a &lt;a href="http://www.php.net/archive/2010.php#id2010-12-16-1" hreflang="en"&gt;atteint sa fin de vie en décembre 2010&lt;/a&gt;, il y a déjà bientôt un an, est la version de PHP qui semble aujourd&amp;#8217;hui la plus utilisée / répandue,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP 5.3&lt;/strong&gt;, &lt;a href="http://www.php.net/archive/2009.php#id2009-06-30-1" hreflang="en"&gt;stable depuis juin 2009&lt;/a&gt;, soit plus de deux ans, n&amp;#8217;arrive qu&amp;#8217;en seconde place &amp;#8212; et loin derrière PHP 5.2,&lt;/li&gt;
&lt;li&gt;Et PHP 5.1 et 4.4 sont relativement proches l&amp;#8217;un de l&amp;#8217;autre.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Versions release de PHP 5.x &lt;a name="versions-releases"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Et enfin, si on descend au niveau des versions release de PHP &lt;code&gt;5.x&lt;/code&gt;&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#pnote-103-3" id="rev-pnote-103-3"&gt;3&lt;/a&gt;]&lt;/sup&gt;, en ne conservant que les versions qui remontées 100 fois ou plus, on obtient les données suivantes&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.x&lt;/strong&gt;&amp;#160;:
&lt;ul&gt;
&lt;li&gt;5.0.2&amp;#160;: 116&lt;/li&gt;
&lt;li&gt;5.0.3&amp;#160;: 326&lt;/li&gt;
&lt;li&gt;5.0.4&amp;#160;: 2,401&lt;/li&gt;
&lt;li&gt;5.0.5&amp;#160;: 502&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.1&lt;/strong&gt;&amp;#160;:
&lt;ul&gt;
&lt;li&gt;5.1.1&amp;#160;: 196&lt;/li&gt;
&lt;li&gt;5.1.2&amp;#160;: 3,012&lt;/li&gt;
&lt;li&gt;5.1.3&amp;#160;: 184&lt;/li&gt;
&lt;li&gt;5.1.4&amp;#160;: 1,227&lt;/li&gt;
&lt;li&gt;5.1.5&amp;#160;: 127&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.1.6&amp;#160;: 42,940&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour &lt;strong&gt;PHP 5.2&lt;/strong&gt;&amp;#160;:
&lt;ul&gt;
&lt;li&gt;5.2.0&amp;#160;: 10,493&lt;/li&gt;
&lt;li&gt;5.2.1&amp;#160;: 3,089&lt;/li&gt;
&lt;li&gt;5.2.2&amp;#160;: 960&lt;/li&gt;
&lt;li&gt;5.2.3&amp;#160;: 4,145&lt;/li&gt;
&lt;li&gt;5.2.4&amp;#160;: 21,111&lt;/li&gt;
&lt;li&gt;5.2.5&amp;#160;: 15,631&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.2.6&amp;#160;: 94,194&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;5.2.8&amp;#160;: 11,280&lt;/li&gt;
&lt;li&gt;5.2.9&amp;#160;: 43,752&lt;/li&gt;
&lt;li&gt;5.2.10&amp;#160;: 22,478&lt;/li&gt;
&lt;li&gt;5.2.11&amp;#160;: 15,610&lt;/li&gt;
&lt;li&gt;5.2.12&amp;#160;: 17,588&lt;/li&gt;
&lt;li&gt;5.2.13&amp;#160;: 28,808&lt;/li&gt;
&lt;li&gt;5.2.14&amp;#160;: 36,532&lt;/li&gt;
&lt;li&gt;5.2.15&amp;#160;: 3,594&lt;/li&gt;
&lt;li&gt;5.2.16&amp;#160;: 18,877&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.2.17&amp;#160;: 217,942&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Et pour &lt;strong&gt;PHP 5.3&lt;/strong&gt;&amp;#160;:
&lt;ul&gt;
&lt;li&gt;5.3.0&amp;#160;: 1,810&lt;/li&gt;
&lt;li&gt;5.3.1&amp;#160;: 2,715&lt;/li&gt;
&lt;li&gt;5.3.2&amp;#160;: 21,890&lt;/li&gt;
&lt;li&gt;5.3.3&amp;#160;: 28,359&lt;/li&gt;
&lt;li&gt;5.3.4&amp;#160;: 5,261&lt;/li&gt;
&lt;li&gt;5.3.5&amp;#160;: 16,680&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.3.6&amp;#160;: 31,549&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;5.3.7&amp;#160;: 643&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5.3.8&amp;#160;: 15,310&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et sous forme graphique&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2011-09/version-3-5.x.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2011-09/.version-3-5.x_m.png" alt="version-3-5.x.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Pour résumer&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une quantité non-négligeable de sites sous &lt;strong&gt;PHP 5.1.6&lt;/strong&gt; &lt;em&gt;(qui a été publiée en &lt;a href="http://www.php.net/archive/2006.php"&gt;Août 2006&lt;/a&gt;)&lt;/em&gt;&amp;#160;; la version fournie par défaut sous certaines distributions, il me semble, genre Redhat Enterprise&amp;#160;?&lt;/li&gt;
&lt;li&gt;Beaucoup de &lt;strong&gt;PHP 5.2.6&lt;/strong&gt; &lt;em&gt;(publiée en &lt;a href="http://www.php.net/archive/2008.php#id2008-05-01-1"&gt;Mai 2008&lt;/a&gt;)&lt;/em&gt;&amp;#160;; probablement la version fournie par défaut sous une autre distribution&amp;#160;?&lt;/li&gt;
&lt;li&gt;La version de PHP la plus répandue est &lt;strong&gt;PHP 5.2.17&lt;/strong&gt; &lt;em&gt;(publiée en &lt;a href="http://www.php.net/archive/2011.php#id2011-01-06-1"&gt;Janvier 2011&lt;/a&gt;)&lt;/em&gt;&amp;#160;; ça reste du 5.2, qui a atteint sa &lt;em&gt;fin de vie&lt;/em&gt;, mais positivons, en se disant que c&amp;#8217;est la dernière version, la plus à jour&amp;#8230;&lt;/li&gt;
&lt;li&gt;Et enfin, plusieurs sous versions de &lt;strong&gt;PHP 5.3.x&lt;/strong&gt;, sans qu&amp;#8217;aucune ne s&amp;#8217;impose vraiment&amp;#160;; notons que la version 5.3.7, avec son bug de sécurité, et qui n&amp;#8217;a été disponible que quelques jours, n&amp;#8217;est heureusement pas la plus répandue &lt;em&gt;(même si on pourrait souhaiter qu&amp;#8217;une version connue pour un problème de ce type ne soit absolument pas utilisée)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Le mot de la fin&amp;#160;? &lt;a name="mot-de-la-fin"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Je ne ferai pas une longue analyse sur le pourquoi du comment des chiffres que j&amp;#8217;ai présenté ici&amp;#160;: libre à vous de commenter sur le trop grand usage de versions complètement obsolètes, et le manque de mise à jour que l&amp;#8217;on peut, malheureusement, trop souvent constater&amp;#8230;&lt;/p&gt;


&lt;p&gt;Cela dit, une question pour vous, lecteurs&amp;#160;: &lt;strong&gt;connaissez-vous des sites qui publient ce genre de statistiques de manière régulière &amp;#8212; idéalement, gratuitement&amp;#160;?&lt;/strong&gt;
&lt;br /&gt;Il fût un temps, &lt;a href="http://www.nexen.net/chiffres_cles/phpversion/"&gt;nexen en publiait&lt;/a&gt;, mais j&amp;#8217;ai l&amp;#8217;impression qu&amp;#8217;ils ont arrêté depuis 2008&amp;#8230;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class="footnotes"&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#rev-pnote-103-1" id="pnote-103-1"&gt;1&lt;/a&gt;] la première version bêta de PHP 5.4 est sortie quelques jours après que j&amp;#8217;aie réalisé les tests publiés ici&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#rev-pnote-103-2" id="pnote-103-2"&gt;2&lt;/a&gt;] Pour ne pas prendre en compte les quelques résultats abherrant qu&amp;#8217;on aurait pu relever &amp;#8212; du genre &lt;code&gt;l2.ws&lt;/code&gt; qui renvoi &lt;code&gt;X-Powered-By: PHP/10.0.0&lt;/code&gt;&amp;#160;???&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#rev-pnote-103-3" id="pnote-103-3"&gt;3&lt;/a&gt;] PHP 4 correspondant à des versions tellement dépassées que je préfére ne pas prendre la peine de rentrer au niveau des versions release&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=_yuGwpjD56w:EL7wdfUeEac:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=_yuGwpjD56w:EL7wdfUeEac:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=_yuGwpjD56w:EL7wdfUeEac:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=_yuGwpjD56w:EL7wdfUeEac:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=_yuGwpjD56w:EL7wdfUeEac:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=_yuGwpjD56w:EL7wdfUeEac:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=_yuGwpjD56w:EL7wdfUeEac:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=_yuGwpjD56w:EL7wdfUeEac:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#comment-form</comments>
      <wfw:comment>http://blog.pascal-martin.fr/post/statistiques-versions-php-2011-09#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pascal-martin.fr/feed/atom/comments/103</wfw:commentRss>
      </item>
    
  <item>
    <title>Intégration continue d'un projet PHP avec Jenkins</title>
    <link>http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php</link>
    <guid isPermaLink="false">urn:md5:152bc3b7cbd848fa72d33df64ef9dd5e</guid>
    <pubDate>mar., 27 sept. 2011 08:00:00 +0200</pubDate>
    <dc:creator>Pascal MARTIN</dc:creator>
        <category>Développement Web</category>
        <category>integration-continue</category><category>jenkins</category><category>php</category>    
    <description>&lt;p&gt;Cet article fait suite à &lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration"&gt;Intégration continue avec Jenkins&amp;#160;: installation et configuration de base&lt;/a&gt; &amp;#8212; et pré-suppose que vous avez installé une plate-forme d&amp;#8217;Intégration Continue Jenkins, avec les plugins qui seront nécessaires à la mise en intégration continue d&amp;#8217;un projet PHP.&lt;/p&gt;


&lt;p&gt;Nous allons maintenant passer à l&amp;#8217;utilisation de la plate-forme que nous avons installé il y a quelques jours, en la configurant pour qu&amp;#8217;elle effectue l&amp;#8217;intégration continue d&amp;#8217;un projet PHP.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Sommaire&amp;#160;:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#integration-continue-projet-php"&gt;Intégration Continue d&amp;#8217;un projet PHP&amp;#160;?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#outils-analyse-php"&gt;Outils d&amp;#8217;analyse PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#builder-un-job"&gt;&amp;#171;&amp;#160;Builder un job&amp;#160;&amp;#187;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#automatisation-process-build"&gt;Automatisation du process de build&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#phing-outil-automatisation"&gt;Phing comme outil d&amp;#8217;automatisation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#un-projet-php"&gt;Un projet PHP&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#job-jenkins-pour-notre-projet"&gt;Un job Jenkins pour notre projet PHP&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#initialisation-du-job"&gt;Initialisation du job&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#acces-systeme-gestion-versions"&gt;Accès au système de gestion de versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#utiliser-phing-comme-outil-build"&gt;Utiliser Phing comme outil de build&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#script-de-construction-build-xml"&gt;Script de construction&amp;#160;: build.xml&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#initialisation-build-3-targets"&gt;Initialisation de build.xml&amp;#160;: 3 targets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#target-clean"&gt;Target clean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#target-qa-outils-analyse-qualite"&gt;Target qa&amp;#160;: les outils d&amp;#8217;analyse de qualité&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-principe"&gt;Principe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-pdepend"&gt;Target pdepend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpmd"&gt;Target phpmd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpcpd"&gt;Target phpcpd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phploc"&gt;Target phploc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpcs"&gt;Target phpcs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpdoc"&gt;Target phpdoc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpunit"&gt;Target phpunit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpcb"&gt;Target phpcb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-complete"&gt;Target qa complète&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#resultat-du-build"&gt;Résultat du build&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-resultats-build"&gt;Publier les résultats du build&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-analyse-checkstyle"&gt;Analyse checkstyle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-analyse-pmd"&gt;Analyse PMD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-analyse-cpd"&gt;Analyse CPD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-rapports-tests-unitaires"&gt;Rapports de Tests Unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-rapports-couverture-code"&gt;Rapports de Couverture de Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-documentation-api-code-browser"&gt;Documentation d&amp;#8217;API, et Code Browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-php-depend"&gt;Rapport PHP Depend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-violations"&gt;Rapport de violations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-phploc"&gt;Lignes de code, nombres de méthodes, classes, &amp;#8230;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#et-maintenant"&gt;Et maintenant&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;    &lt;p&gt;Cet article fait suite à &lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration"&gt;Intégration continue avec Jenkins&amp;#160;: installation et configuration de base&lt;/a&gt; &amp;#8212; et pré-suppose que vous avez installé une plate-forme d&amp;#8217;Intégration Continue Jenkins, avec les plugins qui seront nécessaires à la mise en intégration continue d&amp;#8217;un projet PHP.&lt;/p&gt;


&lt;p&gt;Nous allons maintenant passer à l&amp;#8217;utilisation de la plate-forme que nous avons installé il y a quelques jours, en la configurant pour qu&amp;#8217;elle effectue l&amp;#8217;intégration continue d&amp;#8217;un projet PHP.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;Oh, et, avant de commencer&amp;#160;: si vous cherchez juste des fichiers de configuration &amp;#171;&amp;#160;quasi tout-fait&amp;#160;&amp;#187; pour Jenkins + PHP et n&amp;#8217;êtes pas intéressés par un guide &amp;#171;&amp;#160;étape par étape&amp;#160;&amp;#187;, vous devriez faire un tour là&amp;#160;: &lt;a href="http://jenkins-php.org/" hreflang="en"&gt;Template for Jenkins Jobs for PHP Projects&lt;/a&gt; &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Sommaire&amp;#160;:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#integration-continue-projet-php"&gt;Intégration Continue d&amp;#8217;un projet PHP&amp;#160;?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#outils-analyse-php"&gt;Outils d&amp;#8217;analyse PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#builder-un-job"&gt;&amp;#171;&amp;#160;Builder un job&amp;#160;&amp;#187;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#automatisation-process-build"&gt;Automatisation du process de build&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#phing-outil-automatisation"&gt;Phing comme outil d&amp;#8217;automatisation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#un-projet-php"&gt;Un projet PHP&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#job-jenkins-pour-notre-projet"&gt;Un job Jenkins pour notre projet PHP&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#initialisation-du-job"&gt;Initialisation du job&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#acces-systeme-gestion-versions"&gt;Accès au système de gestion de versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#utiliser-phing-comme-outil-build"&gt;Utiliser Phing comme outil de build&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#script-de-construction-build-xml"&gt;Script de construction&amp;#160;: build.xml&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#initialisation-build-3-targets"&gt;Initialisation de build.xml&amp;#160;: 3 targets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#target-clean"&gt;Target clean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#target-qa-outils-analyse-qualite"&gt;Target qa&amp;#160;: les outils d&amp;#8217;analyse de qualité&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-principe"&gt;Principe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-pdepend"&gt;Target pdepend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpmd"&gt;Target phpmd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpcpd"&gt;Target phpcpd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phploc"&gt;Target phploc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpcs"&gt;Target phpcs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpdoc"&gt;Target phpdoc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpunit"&gt;Target phpunit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-phpcb"&gt;Target phpcb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#qa-target-complete"&gt;Target qa complète&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#resultat-du-build"&gt;Résultat du build&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-resultats-build"&gt;Publier les résultats du build&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-analyse-checkstyle"&gt;Analyse checkstyle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-analyse-pmd"&gt;Analyse PMD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-analyse-cpd"&gt;Analyse CPD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-rapports-tests-unitaires"&gt;Rapports de Tests Unitaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-rapports-couverture-code"&gt;Rapports de Couverture de Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-documentation-api-code-browser"&gt;Documentation d&amp;#8217;API, et Code Browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-php-depend"&gt;Rapport PHP Depend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-violations"&gt;Rapport de violations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#publier-phploc"&gt;Lignes de code, nombres de méthodes, classes, &amp;#8230;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#et-maintenant"&gt;Et maintenant&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(Ne prenez pas peur en regardant la taille de l&amp;#8217;ascenceur affiché par votre navigateur&amp;#160;: sans les nombreuses captures d&amp;#8217;écrans, cet article n&amp;#8217;est finalement pas si long)&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Intégration Continue d&amp;#8217;un projet PHP&amp;#160;? &lt;a name="integration-continue-projet-php"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Je disais dans l&amp;#8217;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration"&gt;article précédant celui-ci&lt;/a&gt; qu&amp;#8217;un des principes de l&amp;#8217;Intégration Continue est de vérifier, à chaque modification du code-source d&amp;#8217;une application, que le résultat de cette modification ne produit pas de régression sur l&amp;#8217;application en question.&lt;/p&gt;


&lt;h3&gt;Outils d&amp;#8217;analyse PHP &lt;a name="outils-analyse-php"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Cela implique donc la mise en place d&amp;#8217;outils capables d&amp;#8217;analyser une application et son code-source, afin de produire différents rappors de qualité &amp;#8212; que ce soit au niveau de la qualité du code-source, ou au niveau de la qualité / stabilité de l&amp;#8217;application.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Dans le monde PHP, les outils les plus fréquemment utilisés pour chaque type d&amp;#8217;analyse sont les suivants&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test Unitaires&amp;#160;: &lt;a href="https://github.com/sebastianbergmann/phpunit/" hreflang="en"&gt;PHPUnit&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;On pourrait aussi entendre parler de &lt;a href="http://www.simpletest.org/" hreflang="en"&gt;SimpleTest&lt;/a&gt;, mais, depuis des années, n&amp;#8217;est plus vraiment un projet vivant&lt;/li&gt;
&lt;li&gt;Ou de &lt;a href="https://github.com/mageekguy/atoum" hreflang="en"&gt;Atoum&lt;/a&gt; qui, bien que prometteur, n&amp;#8217;est pas encore très répandu.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Vérification du respect des normes de codage&amp;#160;: &lt;a href="http://pear.php.net/package/PHP_CodeSniffer/redirected" hreflang="en"&gt;PHP_CodeSniffer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dépendances entre composants&amp;#160;: &lt;a href="http://pdepend.org/" hreflang="en"&gt;PHP Depend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://phpmd.org/" hreflang="en"&gt;PHP Mess Detector&lt;/a&gt; pour la remontée de statistiques susceptibles de mettre en évidence des portions de code-source de qualité médiocre&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sebastianbergmann/phpcpd" hreflang="en"&gt;phpcpd&lt;/a&gt; pour la détection de portions de code copié-collé &lt;em&gt;(portions qui devraient souvent être factorisées)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sebastianbergmann/phploc" hreflang="en"&gt;phploc&lt;/a&gt; pour la collecte de statistiques du type nombres de méthodes, nombres de classes, nombres de lignes de code, &amp;#8230;&lt;/li&gt;
&lt;li&gt;Génération de documentation d&amp;#8217;API&amp;#160;:
&lt;ul&gt;
&lt;li&gt;Historiquement parlant, on pensera tout de suite à &lt;a href="http://www.phpdoc.org/" hreflang="en"&gt;phpDocumentor&lt;/a&gt; &lt;em&gt;(qui n&amp;#8217;est plus tellement vivant, et a quelques difficultés avec PHP &amp;gt;= 5.3)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Ou on se penchera plutôt vers &lt;a href="https://github.com/theseer/phpdox" hreflang="en"&gt;phpdox&lt;/a&gt;, pour PHP &amp;gt;= 5.3, qui semble prometteur.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Et enfin, pour intégrer un navigateur de code à Jenkins, qui prenne en compte une partie des résultats issus d&amp;#8217;outils cités ci-dessus, nous penserons à &lt;a href="https://github.com/Mayflower/PHP_CodeBrowser" hreflang="en"&gt;PHP_CodeBrowser&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Sans entrer dans les détails, la série de commandes suivantes devrait permettre d&amp;#8217;installer le plus gros de ces outils &lt;em&gt;&amp;#8212; notez que cette liste est extraite d&amp;#8217;un script d&amp;#8217;installation que je joue sur à peu près toutes mes machines de développement PHP, et contient donc quelques outils / bibliothèques que nous n&amp;#8217;utiliserons pas par la suite&lt;/em&gt;&amp;#160;:&lt;/p&gt;

&lt;pre class="bash bash" style="font-family:monospace;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;# Mise à jour des extensions PEAR déjà installées&lt;/span&gt;
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear upgrade-all
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear config-set auto_discover &lt;span style="color: #000000;"&gt;1&lt;/span&gt;
 
&lt;span style="color: #666666; font-style: italic;"&gt;# Installation de quelques extensions supplémentaires (pas forcément toujours utilisées, mais suffisament &amp;quot;souvent&amp;quot; pour que je les installe &amp;quot;par défaut&amp;quot;)&lt;/span&gt;
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear config-set preferred_state beta
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; &lt;span style="color: #660033;"&gt;--alldeps&lt;/span&gt; PHP_CodeSniffer PhpDocumentor php_CompatInfo Log Text_Diff HTML_QuickForm2 Image_GraphViz MDB2 Mail_Mime PHP_Beautifier-beta SOAP XML_Beautifier XML_RPC Structures_Graph components.ez.no&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Graph VersionControl_SVN-alpha Horde_Text_Diff XML_RPC2 VersionControl_Git-alpha
 
&lt;span style="color: #666666; font-style: italic;"&gt;# PHPUnit&lt;/span&gt;
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear channel-discover pear.phpunit.de
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; &lt;span style="color: #660033;"&gt;--alldeps&lt;/span&gt; phpunit&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;PHPUnit
 
&lt;span style="color: #666666; font-style: italic;"&gt;# Autres outils &amp;quot;QA&amp;quot;&lt;/span&gt;
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear channel-discover pear.pdepend.org
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear channel-discover pear.phpmd.org
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; pdepend&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;PHP_Depend
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; phpmd&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;PHP_PMD
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; phpunit&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;phpcpd
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; phpunit&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;File_Iterator
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; phpunit&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;phploc
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; &lt;span style="color: #660033;"&gt;--alldeps&lt;/span&gt; phpunit&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;PHP_CodeBrowser
 
&lt;span style="color: #666666; font-style: italic;"&gt;# DocBlox (en alternative plus récente (et compatible PHP 5.3) à PhpDocumentor)&lt;/span&gt;
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear channel-discover pear.docblox-project.org
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; &lt;span style="color: #660033;"&gt;--alldeps&lt;/span&gt; docblox&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;DocBlox&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;(Pour les scripts d&amp;#8217;installation de machine de développement PHP dont je parlais juste au-dessus, vous pouvez jeter un coup d&amp;#8217;oeil à &lt;a href="https://github.com/pmartin/vm-dev-php/"&gt;https://github.com/pmartin/vm-dev-php/&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;&amp;#171;&amp;#160;Builder un job&amp;#160;&amp;#187; &lt;a name="builder-un-job"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Avec Jenkins, l&amp;#8217;Intégration d&amp;#8217;un projet passe par un &lt;strong&gt;job&lt;/strong&gt;&amp;#160;: c&amp;#8217;est ce &lt;strong&gt;job&lt;/strong&gt; qui définira tout le processus d&amp;#8217;intégration de votre application&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extraction des sources depuis votre système de gestion de versions,&lt;/li&gt;
&lt;li&gt;Opérations de construction &amp;#8212; en particulier, lancement des outils d&amp;#8217;analyse de qualité que nous avons vu plus haut,&lt;/li&gt;
&lt;li&gt;Et publication des résultats de cette construction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Chaque &lt;em&gt;construction&lt;/em&gt; de votre application, idéalement, après chaque commit d&amp;#8217;une modification, est appelée un &lt;strong&gt;build&lt;/strong&gt; &amp;#8212; et, par extension, lorsque Jenkins exécute un &lt;strong&gt;build&lt;/strong&gt; de votre application, celle-ci sera &lt;strong&gt;buildée&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Jenkins vous permettra alors, pour chaque &lt;strong&gt;job&lt;/strong&gt;, de consulter l&amp;#8217;historique des &lt;strong&gt;builds&lt;/strong&gt;, ou de déclencher un nouveau &lt;strong&gt;build&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Automatisation du process de build &lt;a name="automatisation-process-build"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Bien entendu, le processus de build est piloté par un outil d&amp;#8217;automatisation&amp;#160;: vous configurez le build, et celui-ci sera rejoué à l&amp;#8217;identique à chaque construction, ce qui permettra de comparer les builds, d&amp;#8217;avoir un historique cohérent, et de mesurer l&amp;#8217;évolution du projet.&lt;/p&gt;


&lt;p&gt;Jenkins étant un outil JAVA, c&amp;#8217;est, par défaut, le programme &lt;a href="http://ant.apache.org/" hreflang="en"&gt;Ant&lt;/a&gt; qui est utilisé pour le processus de build.
&lt;br /&gt;Pour faire super-simple, Ant prend en paramètre un fichier XML définissant des tâches à effectuer, et les lance les unes à la suite des autres, tant qu&amp;#8217;aucune n&amp;#8217;a échoué.&lt;/p&gt;


&lt;p&gt;Ces tâches peuvent être fort simples, comme &amp;#171;&amp;#160;&lt;em&gt;effacer un fichier&lt;/em&gt;&amp;#160;&amp;#187;, plus complexes, comme &amp;#171;&amp;#160;&lt;em&gt;lancer une commande&lt;/em&gt;&amp;#160;&amp;#187;, voire même correspondre à du code personnalisé, répondant aux attentes d&amp;#8217;un programme spécifique ou d&amp;#8217;un besoin propre à votre projet.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Phing comme outil d&amp;#8217;automatisation &lt;a name="phing-outil-automatisation"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Pour ma part, je trouve dommage, dans le cadre d&amp;#8217;un projet PHP, d&amp;#8217;utiliser l&amp;#8217;outil Ant&amp;#160;; et j&amp;#8217;ai tendance à lui préférer &lt;a href="http://www.phing.info/trac/" hreflang="en"&gt;Phing&lt;/a&gt;, qui se veut être un clone de Ant, en PHP.
&lt;br /&gt;Avec, au minimum, trois avantages majeurs pour Phing&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Puisqu&amp;#8217;il s&amp;#8217;agit d&amp;#8217;un programme développé en PHP, il peut être utilisé sur une machine sans VM JAVA &amp;#8212; votre poste de développement, ou votre serveur de production, par exemple,&lt;/li&gt;
&lt;li&gt;Il fourni en standard plusieurs tâches correspondant à certains des outils PHP que nous avons vu plus haut,&lt;/li&gt;
&lt;li&gt;Et &lt;strong&gt;il est extensible en PHP&lt;/strong&gt;&amp;#160;: libre à vous de développer toute nouvelle tâche dont vous auriez besoin&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#pnote-102-1" id="rev-pnote-102-1"&gt;1&lt;/a&gt;]&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si besoin est, l&amp;#8217;installation de Phing est des plus simples &amp;#8212; via &lt;code&gt;pear&lt;/code&gt;, bien entendu&amp;#160;:&lt;/p&gt;
&lt;pre class="bash bash" style="font-family:monospace;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;# Phing&lt;/span&gt;
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear channel-discover pear.phing.info
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; pear &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; &lt;span style="color: #660033;"&gt;--alldeps&lt;/span&gt; phing&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;phing&lt;/pre&gt;


&lt;p&gt;Au cas où vous ne l&amp;#8217;auriez pas encore deviné, notez que, &lt;strong&gt;pour la suite de cet article, j&amp;#8217;utiliserai Phing comme outil de build &amp;#8212; et pas Ant&lt;/strong&gt;.&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Un projet PHP&amp;#160;? &lt;a name="un-projet-php"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Pour les besoins de cet article, je travaillerai avec un mini-projet PHP d&amp;#8217;exemple, avec SVN comme système de gestion de versions, à l&amp;#8217;URL suivante&amp;#160;: &lt;code&gt;https://svn.myserver/test-repository/trunk&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Note&amp;#160;: ce &lt;em&gt;projet&lt;/em&gt; étant en pleine phase de développement, c&amp;#8217;est le &lt;code&gt;trunk&lt;/code&gt; que nous placerons en Intégration Continue&amp;#160;; mais il va de soit qu&amp;#8217;au fur et à mesure que de nouvelles branches seront crées, nous ajouterons de nouveaux jobs à notre plate-forme d&amp;#8217;IC, correspondant à celles-ci.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Pour ce qui est des sources du projet en lui-même, elles sont plutôt minimalistes, et correspondent à l&amp;#8217;arborescence suivante&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.205-sources-example-project_m.png" alt="205-sources-example-project.png" style="display:block; margin:0 auto;" /&gt;&lt;/p&gt;


&lt;p&gt;Pour faire simple&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L&amp;#8217;application web que nous développons se trouve sous &lt;code&gt;www&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Le répertoire &lt;code&gt;utils&lt;/code&gt; contiendra les différents scripts &lt;em&gt;utilitaires&lt;/em&gt; &amp;#8212; dont le script Phing correspondant au processus de build&amp;#160;: &lt;code&gt;build.xml&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Et nos tests automatisés ont tout naturellement leur place sous &lt;code&gt;tests&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Un job Jenkins pour notre projet PHP &lt;a name="job-jenkins-pour-notre-projet"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Maintenant que nous avons un projet PHP, sur son système de gestion de versions, passons à sa mise en Intégration Continue sous Jenkins.&lt;/p&gt;


&lt;p&gt;Vous vous souvenez peut-être qu&amp;#8217;à la fin de l&amp;#8217;article &lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration"&gt;Intégration continue avec Jenkins&amp;#160;: installation et configuration de base&lt;/a&gt;, après que nous nous soyons identifiés, Jenkins nous proposait de &amp;#171;&amp;#160;&lt;code&gt;créer un nouveau Job&lt;/code&gt;&amp;#160;&amp;#187;&amp;#160;?&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-01-empty-dashboard.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-01-empty-dashboard_m.png" alt="200-new-job-01-empty-dashboard.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et bien, c&amp;#8217;est le moment ou jamais &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Initialisation du job &lt;a name="initialisation-du-job"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;La première étape est de spécifier le nom de notre job&amp;#160;; et de choisir de quel type il sera&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-02-job-name-and-type.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-02-job-name-and-type_m.png" alt="200-new-job-02-job-name-and-type.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Dans le cadre d&amp;#8217;un projet PHP, où nous gérerons nous-même le processus de Build &lt;em&gt;(via un script Phing dans mon cas, ou un script Ant dans le cas par défaut)&lt;/em&gt;, c&amp;#8217;est la première option que nous choisissons&amp;#160;: &amp;#171;&amp;#160;&lt;code&gt;Construire un projet free-style&lt;/code&gt;&amp;#160;&amp;#187;&amp;#160;; cela nous laissera toute liberté sur la configuration, tout en étant suffisant pour la plupart des projets.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Une fois cet écran renseigné, vous arriverez sur la page de configuration de votre job &amp;#8212; celle où vous allez pouvoir le paramétrer, indiquer à Jenkins quel script Phing est à utiliser pour construire votre projet, et quels types de rapports doivent être publiés&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-03-configuring-job-empty.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-03-configuring-job-empty_m.png" alt="200-new-job-03-configuring-job-empty.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Comme vous pouvez déjà le constater, cette page est un peu longue &amp;#8212; et encore, de nombreuses options sont masquées, leurs blocs étant repliés&amp;#160;; dans les faits, cet écran peut vous demander un peu de temps avant que vous ne l&amp;#8217;ayez vraiment pris en main&amp;#8230; N&amp;#8217;hésitez donc pas à le parcourir, en cliquant sur les nombreux boutons &amp;#171;&amp;#160;&lt;code&gt;Aide&lt;/code&gt;&amp;#160;&amp;#187; figurant à côté de quasiment chaque option.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
En fonction de l&amp;#8217;espace disque dont vous disposez sur votre serveur d&amp;#8217;intégration, ainsi que de la taille de chacun des builds de votre projet &lt;em&gt;(généralement assez faible, lors de la mise en place d&amp;#8217;une plate-forme d&amp;#8217;IC au début d&amp;#8217;un projet&amp;#160;; mais elle peut rapidement augmenter)&lt;/em&gt;, vous ne pourrez probablement pas conserver l&amp;#8217;ensemble de l&amp;#8217;historique des builds&amp;#8230;&lt;/p&gt;


&lt;p&gt;Vous tirerez donc certainement parti de la fonctionnalité de suppression des anciens builds&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-04-delete-old-builds.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-04-delete-old-builds_m.png" alt="200-new-job-04-delete-old-builds.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Tout en sachant que&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il est intéressant de conserver un certain nombre de builds, afin d&amp;#8217;avoir un peu d&amp;#8217;historique sur le projet, et de pouvoir mesurer les progrès accomplis,&lt;/li&gt;
&lt;li&gt;Vous pourrez indiquer manuellement, pour certains builds particulièrement intéressants, qu&amp;#8217;ils devront être conservés sans limite de temps&lt;/li&gt;
&lt;li&gt;Vous aurez la possibilité un peu plus loin, gràce aux plugins que nous avons installés, d&amp;#8217;indiquer à Jenkins qu&amp;#8217;il doit conserver un build de temps en temps&amp;#160;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-09-environment-build-one-every-x.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-09-environment-build-one-every-x_m.png" alt="200-new-job-09-environment-build-one-every-x.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;em&gt;(Cette option se trouve plus bas sur la page de configuration &amp;#8212; mais j&amp;#8217;en parle ici, afin que tout ce qui est &amp;#171;&amp;#160;nettoyage et conservation des anciens builds&amp;#160;&amp;#187; soit regroupé)&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Au passage, notez que, si besoin est, Jenkins vous permet de désactiver un job&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-05-disable-build.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-05-disable-build_m.png" alt="200-new-job-05-disable-build.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Je vois deux cas où ceci est utile&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lorsque vous savez que les modifications que vous allez faire sur le code-source de votre application vont la &amp;#171;&amp;#160;casser&amp;#160;&amp;#187; pendant un bon moment &lt;em&gt;(au début d&amp;#8217;une grosse phase de rework &amp;#8212; que vous aurez menée, pour une raison ou une autre, sur le &lt;code&gt;trunk&lt;/code&gt;, au lieu de passer par une branche)&lt;/em&gt;, et que vous ne souhaitez pas importuner votre équipe avec des mails indiquant &amp;#8212; inutilement &amp;#8212; des build failed.&lt;/li&gt;
&lt;li&gt;Lorsqu&amp;#8217;un projet n&amp;#8217;est plus en développement actif pendant quelques temps&amp;#160;; si vous avez un nombre important de jobs sur votre plate-forme d&amp;#8217;IC, en marquer quelques uns comme inactifs permet de mieux mettre en évidence ceux qui sont utiles à un instant donné.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Accès au système de gestion de versions &lt;a name="acces-systeme-gestion-versions"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;L&amp;#8217;étape suivante &lt;em&gt;(placée avant le configuration d&amp;#8217;accès au gestionnaire de versions &amp;#8212; ce qui peut sembler étrange)&lt;/em&gt; est de configurer la &amp;#171;&amp;#160;&lt;code&gt;Période d'attente&lt;/code&gt;&amp;#160;&amp;#187;.&lt;/p&gt;


&lt;p&gt;Dit simplement&amp;#160;: si un build est sur le point de se lancer alors qu&amp;#8217;un commit a eu lieu très peu de temps auparavant, alors, le build sera repoussé de quelques secondes&amp;#160;; l&amp;#8217;objectif étant de permettre aux développeurs de pousser leurs modifications vers le gestionnaire de versions en plusieurs commits, et d&amp;#8217;éviter qu&amp;#8217;un build ne se lance qu&amp;#8217;avec la moitié des commits effectués&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#pnote-102-2" id="rev-pnote-102-2"&gt;2&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-06-periode-attente.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-06-periode-attente_m.png" alt="200-new-job-06-periode-attente.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Nous pouvons maintenant passer à la configuration d&amp;#8217;accès au système de gestion de versions &amp;#8212; pour ce projet, il s&amp;#8217;agit de SVN.&lt;/p&gt;


&lt;p&gt;Les écrans sont assez parlant, et Jenkins essaye de vous guider au maximum &lt;em&gt;(par exemple&amp;#160;: bien souvent, dès qu&amp;#8217;un champ de formulaire perd le focus, une vérification est effectuée sur ce que vous y avez saisi)&lt;/em&gt;, mais, dans les grandes lignes&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vous devez renseigner les informations d&amp;#8217;accès à votre serveur de versions,&lt;/li&gt;
&lt;li&gt;Au besoin, vous devrez indiquer un couple login / password permettant à Jenkins de s&amp;#8217;identifier, si besoin est &lt;em&gt;(si votre repository ne permet pas l&amp;#8217;accès anonyme, par exemple)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici à quoi peut ressembler la saisie des informations d&amp;#8217;accès à un serveur SVN&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-07-svn-01.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-07-svn-01_m.png" alt="200-new-job-07-svn-01.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et en cliquant sur &amp;#171;&amp;#160;&lt;code&gt;Enter credentials&lt;/code&gt;&amp;#160;&amp;#187;, vous arriverez sur le formulaire suivant&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-07-svn-02-credentials.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-07-svn-02-credentials_m.png" alt="200-new-job-07-svn-02-credentials.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Attention tout de même&amp;#160;: &lt;strong&gt;l&amp;#8217;URL à renseigner correspond à celle du répertoire qui héberge les sources que vous souhaitez placer en intégration continue&lt;/strong&gt;.
&lt;br /&gt;Autrement dit, vous ne travaillerez pas forcément à la racine du projet&amp;#160;: il arrivera fréquemment que ce soit le répertoire &lt;code&gt;trunk&lt;/code&gt; que vous intégrerez&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/202-config-job-01-svn-trunk.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.202-config-job-01-svn-trunk_m.png" alt="202-config-job-01-svn-trunk.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Vous noterez aussi que &lt;strong&gt;j&amp;#8217;ai choisi de spécifier un nom de &amp;#171;&amp;#160;&lt;code&gt;répertoire local&lt;/code&gt;&amp;#160;&amp;#187;, que j&amp;#8217;ai nommé &lt;code&gt;src&lt;/code&gt;&lt;/strong&gt;, par habitude.
&lt;br /&gt;De la sorte, l&amp;#8217;extraction SVN du code-source de notre application se fera &lt;strong&gt;vers ce répertoire &lt;code&gt;src&lt;/code&gt;&lt;/strong&gt; &amp;#8212; et nous serons libre de travailler &amp;#171;&amp;#160;à côté&amp;#160;&amp;#187; de ce &lt;code&gt;src&lt;/code&gt;&amp;#160;; par exemple, notre script de build, que nous verrons plus loin, créera ses rapports d&amp;#8217;audit de code dans un répertoire &lt;code&gt;build&lt;/code&gt;, au même niveau que &lt;code&gt;src&lt;/code&gt;, et sans risque d&amp;#8217;interférer avec le contenu de celui-ci.&lt;/p&gt;


&lt;p&gt;Une fois les informations d&amp;#8217;identification saisies, Jenkins aura accès à votre système de gestion de sources&amp;#160;; et vous pourrez, au besoin, configurer quelques options supplémentaires&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-07-svn-03.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-07-svn-03_m.png" alt="200-new-job-07-svn-03.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Il ne reste plus qu&amp;#8217;à indiquer à Jenkins quand construire notre projet.&lt;/p&gt;


&lt;p&gt;Dans une logique d&amp;#8217;Intégration Continue, le principe est généralement de scruter régulièrement le système de gestion de versions, pour déterminer si des modifications ont été apportées aux sources du projet&amp;#160;; et, si c&amp;#8217;est le cas, de déclencher un build.&lt;/p&gt;


&lt;p&gt;On aura donc souvent tendance à cocher &amp;#171;&amp;#160;&lt;code&gt;Scruter l'outil de gestion de version&lt;/code&gt;&amp;#160;&amp;#187;, et à renseigner le champ &amp;#171;&amp;#160;&lt;code&gt;planning&lt;/code&gt;&amp;#160;&amp;#187; juste en-dessous&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-08-trigger-test-project.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-08-trigger-test-project_m.png" alt="200-new-job-08-trigger-test-project.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Bien sûr, en fonction de votre projet, vous pouvez spécifier autre chose que &lt;em&gt;toutes les minutes de toutes les heures de tous les jours&lt;/em&gt;.
&lt;br /&gt;Par exemple, pour ne scruter le gestionnaire de versions que pendant les heures et jours de travail&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-08-trigger-real-life.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-08-trigger-real-life_m.png" alt="200-new-job-08-trigger-real-life.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Si vous enregistrez la configuration en cet état, sans compléter la suite de l&amp;#8217;écran, le job devrait fonctionner &amp;#8212; il ne fera qu&amp;#8217;une seule chose&amp;#160;: extraire les sources depuis le système de gestion de versions&amp;#160;; mais cela vous permettra de vérifier que cette première étape est fonctionnelle.&lt;/p&gt;


&lt;p&gt;Après enregistrement, un build va être lancé automatiquement par Jenkins.
&lt;br /&gt;Une fois qu&amp;#8217;il sera terminé, si vous cliquez dessus dans &amp;#171;&amp;#160;&lt;code&gt;l'historique des builds&lt;/code&gt;&amp;#160;&amp;#187;, vous aurez accès, dans le menu gauche, à une entrée &amp;#171;&amp;#160;&lt;code&gt;Sortie de la console&lt;/code&gt;&amp;#160;&amp;#187;&amp;#160;; ceci vous amènera à un écran affichant le détail de la sortie console obtenue pendant l&amp;#8217;exécution du build.
&lt;br /&gt;Dans notre cas, voici à quoi cette console ressemble&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-09-build-success-console-output.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-09-build-success-console-output_m.png" alt="200-new-job-09-build-success-console-output.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Autrement dit, les sources de notre projet ont été extraite depuis le serveur SVN avec succès &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;


&lt;p&gt;Depuis l&amp;#8217;écran principal du job dans Jenkins, vous pourrez aussi accèder à l&amp;#8217;écran &amp;#171;&amp;#160;&lt;code&gt;Espace de travail&lt;/code&gt;&amp;#160;&amp;#187;, qui vous permet de naviguer à travers les fichiers extraits &amp;#8212; ceux-ci l&amp;#8217;ayant été vers le répertoire &lt;code&gt;src&lt;/code&gt; configuré plus haut&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-09-build-success-workspace.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-09-build-success-workspace_m.png" alt="200-new-job-09-build-success-workspace.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Utiliser Phing comme outil de build &lt;a name="utiliser-phing-comme-outil-build"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Maintenant que nous savons que les sources de notre projet sont extraites avec succès, et que Jenkins parvient à accéder à notre système de gestion de versions, il ne reste plus qu&amp;#8217;à retourner sur l&amp;#8217;écran de configuration de notre job, afin d&amp;#8217;indiquer que le build va être effectué par Phing.&lt;/p&gt;


&lt;p&gt;Pour cela, nous allons &amp;#171;&amp;#160;&lt;code&gt;ajouter une étape au build&lt;/code&gt;&amp;#160;&amp;#187;, qui invoquera une target phing&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-10-add-one-step-phing.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-10-add-one-step-phing_m.png" alt="200-new-job-10-add-one-step-phing.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Nous renseignons ensuite à la fois la liste &amp;#171;&amp;#160;&lt;code&gt;Targets&lt;/code&gt;&amp;#160;&amp;#187; &lt;em&gt;(pour ce projet, le build entier est invoqué depuis la target &lt;code&gt;ci&lt;/code&gt;, comme nous le verrons plus bas)&lt;/em&gt;, et le chemin vers le script de build &lt;em&gt;(le fichier &lt;code&gt;build.xml&lt;/code&gt;, dans le projet dont j&amp;#8217;ai montré l&amp;#8217;arborescence un peu plus haut)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/202-config-job-02-phing-build.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.202-config-job-02-phing-build_m.png" alt="202-config-job-02-phing-build.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
La dernière étape de configuration de notre job serait de sélectionner et configurer les actions à effectuer à la suite du Build&amp;#160;: typiquement, publier les résultats des analyses de qualité sur le code-source de notre application.&lt;/p&gt;


&lt;p&gt;Mais, pour l&amp;#8217;instant, nous ne cocherons rien&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avant de se préoccuper des outils de contrôle qualité, nous aimerions nous assurer que notre job fonctionne,&lt;/li&gt;
&lt;li&gt;Et nous allons de toute façon, pour cela, mettre en place le script de build Phing&amp;#160;: &lt;code&gt;build.xml&lt;/code&gt; &amp;#8212; sinon, notre projet ne se construira de toute manière pas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-12-actions-after-build-none.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-12-actions-after-build-none_m.png" alt="200-new-job-12-actions-after-build-none.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Une fois la configuration du job enregistrée, sa page d&amp;#8217;accueil devrait ressembler à quelque chose de ce type&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-13-home-job-01.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-13-home-job-01_m.png" alt="200-new-job-13-home-job-01.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et, à chaque fois que vous commiterez une modification sur le code-source de votre application, un nouveau build devrait se lancer &lt;em&gt;(Cf &amp;#171;&amp;#160;&lt;code&gt;Historique des builds&lt;/code&gt;&amp;#160;&amp;#187;, à gauche de l&amp;#8217;écran)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-13-home-job-02-launching.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-13-home-job-02-launching_m.png" alt="200-new-job-13-home-job-02-launching.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Bon, comme je disais plus haut, tant que nous n&amp;#8217;avons pas mis en place &lt;code&gt;build.xml&lt;/code&gt;, ça risque de ne pas très bien se passer, et les builds échoueront &lt;em&gt;(une puce rouge indique un build en échec, dans l&amp;#8217;historique)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-13-home-job-03-build-failed.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-13-home-job-03-build-failed_m.png" alt="200-new-job-13-home-job-03-build-failed.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et sur l&amp;#8217;écran de détail du build&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/200-new-job-13-home-job-05-build-failed-detail.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.200-new-job-13-home-job-05-build-failed-detail_m.png" alt="200-new-job-13-home-job-05-build-failed-detail.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Script de construction&amp;#160;: build.xml &lt;a name="script-de-construction-build-xml"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Un peu plus haut, nous avons indiqué à Jenkins, en configurant notre job, que celui-ci devait être construit via une target phing nommée &lt;code&gt;ci&lt;/code&gt;, dans le fichier &lt;code&gt;utils/build/build.xml&lt;/code&gt;.&lt;/p&gt;


&lt;h3&gt;Initialisation de build.xml&amp;#160;: 3 targets &lt;a name="initialisation-build-3-targets"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Cette target &lt;code&gt;ci&lt;/code&gt; dépendra elle-même de deux autres targets&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;clean&lt;/code&gt;, pour le nettoyage des répertoires de reporting &lt;em&gt;(où les outils d&amp;#8217;analyse enregistreront leurs rapports)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;et &lt;code&gt;qa&lt;/code&gt;, pour le lancement des outils &lt;em&gt;(qui généreront les rapports que Jenkins mettra à disposition des utilisateurs)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Créons donc ce fichier, en initialisant les trois targets correspondantes&amp;#160;:&lt;/p&gt;
&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;?xml&lt;/span&gt; &lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;encoding&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;project&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;TestJenkins&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;default&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ci&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;basedir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;../../..&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;property&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;source&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;src&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
 
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;ci&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;        &lt;span style="color: #000066;"&gt;description&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Tâche principale d'intégration continue&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;        &lt;span style="color: #000066;"&gt;depends&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;clean,qa&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;    &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
 
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;clean&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;description&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Vide les répertoires d'artefacts&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
 
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
 
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;description&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Lance les outils d'analyse&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
 
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
 
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/project&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Vous remarquerez que j&amp;#8217;ai commencé par initialiser une propriété, nommée &lt;code&gt;source&lt;/code&gt;, qui contient le nom du répertoire où les sources seront extraites sur la plate-forme d&amp;#8217;Intégration Continue &amp;#8212; si vous avez suivi ce que je disais plus haut, vous utiliserez la même valeur que moi&amp;#160;: &lt;code&gt;src&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Si vous commitez ce fichier et attendez quelques instants, Jenkins lancera un build&amp;#160;; et la sortie de la console correspondant à son exécution sera la suivante&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/300-build.xml-01-targets-console-output.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.300-build.xml-01-targets-console-output_m.png" alt="300-build.xml-01-targets-console-output.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Autrement dit&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le build a réussi&amp;#160;: le fichier &lt;code&gt;utils/build/build.xml&lt;/code&gt; existe, et correspond bien à un fichier Phing valide,&lt;/li&gt;
&lt;li&gt;Nos trois tâches ont été lancées&amp;#160;:
&lt;ul&gt;
&lt;li&gt;Tout d&amp;#8217;abord, la tâche &lt;code&gt;clean&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Puis la tâche &lt;code&gt;qa&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Et enfin, la tâche &lt;code&gt;ci&lt;/code&gt;, dont le seul rôle était de dépendre des deux autres, pour assurer leur bonne exécution.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Target clean &lt;a name="target-clean"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;La première étape de notre build est de supprimer les éventuels résultats d&amp;#8217;analyses du précédent &lt;em&gt;(pour être sûr que les reporting n&amp;#8217;utiliseront que les données issues du build courant)&lt;/em&gt;, et, au besoin, de créer les répertoires qui contiendront les résultats de ces analyses.&lt;/p&gt;


&lt;p&gt;Les répertoires à vider / créer dépendent des outils d&amp;#8217;analyse que vous utiliserez sur votre projet, mais, en supposant que vous utiliserez ceux que je vais mettre en place plus loin, votre target &lt;code&gt;clean&lt;/code&gt; devrait ressembler à ceci&amp;#160;:&lt;/p&gt;
&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;clean&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;description&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Vide les répertoires d'artefacts&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;delete&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/api&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;delete&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/code-browser&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;delete&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/coverage&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;delete&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/logs&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;delete&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/pdepend&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
 
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;mkdir&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/api&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;mkdir&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/code-browser&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;mkdir&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/coverage&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;mkdir&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/logs&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;mkdir&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/pdepend&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Et, une fois &lt;code&gt;build.xml&lt;/code&gt; commité, la sortie console de Jenkins devrait afficher quelque chose de ce type&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/300-build.xml-02-target-clean-console-output.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.300-build.xml-02-target-clean-console-output_m.png" alt="300-build.xml-02-target-clean-console-output.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et si vous jetez un coup d&amp;#8217;oeil au workspace de votre projet depuis Jenkins, vous y retrouverez les répertoires que nous venons de créer, dans un répertoire &lt;code&gt;build&lt;/code&gt; se trouvant au même niveau que notre répertoire &lt;code&gt;src&lt;/code&gt; contenant le code-source de notre application &lt;em&gt;(les résultats d&amp;#8217;analyse ne viennent donc pas s&amp;#8217;enregistrer au même endroit que notre code)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/300-build.xml-02-target-clean-workspace.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.300-build.xml-02-target-clean-workspace_m.png" alt="300-build.xml-02-target-clean-workspace.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Target qa&amp;#160;: les outils d&amp;#8217;analyse de qualité &lt;a name="target-qa-outils-analyse-qualite"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Nous en arrivons enfin à la partie la plus intéressante de notre script &lt;code&gt;build.xml&lt;/code&gt;&amp;#160;: la mise en place des outils d&amp;#8217;analyse de qualité.&lt;/p&gt;


&lt;h4&gt;Principe &lt;a name="qa-principe"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Dans le principe, ma target &lt;code&gt;qa&lt;/code&gt; ne fait généralement rien d&amp;#8217;autre qu&amp;#8217;appeler d&amp;#8217;autres targets&amp;#160;: une par outil.&lt;/p&gt;


&lt;p&gt;Typiquement, elle ressemblera donc à quelque chose de ce type&amp;#160;:&lt;/p&gt;
&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;description&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Lance les outils d'analyse&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;premier-outil&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;second-outil&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;troisime-outil&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Les targets spécifiques à chaque outil étant définies plus bas&amp;#160;:&lt;/p&gt;
&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;premier-outil&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;description&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #808080; font-style: italic;"&gt;&amp;lt;!-- Ici, le gros du boulot pour le premier outil &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt; --&amp;gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
 
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;second-outil&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;description&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #808080; font-style: italic;"&gt;&amp;lt;!-- Ici, le gros du boulot pour le second outil &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt; --&amp;gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
 
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;troisime-outil&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;description&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #808080; font-style: italic;"&gt;&amp;lt;!-- Et là, le gros du boulot pour le dernier &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt; --&amp;gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Je vois deux avantages à cette solution&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;D&amp;#8217;une part, les targets spécifiques à chaque outils portent des noms explicites, et ne font que quelques lignes de long&amp;#160;; elles sont donc plus facile à comprendre,&lt;/li&gt;
&lt;li&gt;Et, d&amp;#8217;autre part, il suffit de commenter ou dé-commenter une &lt;code&gt;&amp;lt;phingcall&amp;gt;&lt;/code&gt; pour activer ou désactiver un outil d&amp;#8217;analyse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ci-dessous, donc, à chaque nouvelle target que nous implémenterons pour un nouvel outil, il faudra penser à ajouter son appel, via &lt;code&gt;&amp;lt;phingcall&amp;gt;&lt;/code&gt;, à la target &lt;code&gt;qa&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Target pdepend &lt;a name="qa-target-pdepend"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;La première target que je reproduis ci-dessous est celle qui permet d&amp;#8217;invoquer l&amp;#8217;outil &lt;a href="http://pdepend.org/" hreflang="en"&gt;PHP Depend&lt;/a&gt;&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;pdepend&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phpdepend&lt;/span&gt; &lt;span style="color: #000066;"&gt;file&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/${source}/www&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;logger&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;jdepend-xml&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;outfile&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/logs/jdepend.xml&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;logger&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;jdepend-chart&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;outfile&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/pdepend/dependencies.svg&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;logger&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;overview-pyramid&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;outfile&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/pdepend/overview-pyramid.svg&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/phpdepend&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;On notera trois choses, ici&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tout d&amp;#8217;abord &lt;em&gt;(et c&amp;#8217;est le cas pour un bon nombre des targets que nous verrons ensuite)&lt;/em&gt;, phing fourni une tâche spécifique pour cet outil&amp;#160;: &lt;code&gt;&amp;lt;phpdepend&amp;gt;&lt;/code&gt; &amp;#8212; ce qui signifie que nous n&amp;#8217;avons pas besoin de passer par un tâche &lt;code&gt;&amp;lt;exec&amp;gt;&lt;/code&gt; pour directement lancer le binaire correspondant&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#pnote-102-3" id="rev-pnote-102-3"&gt;3&lt;/a&gt;]&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Dans pas mal de cas, nous allons specifier des formats de sortie correspondant à ceux des outils du monde JAVA &amp;#8212; ces formats étant déjà acceptés par Jenkins&lt;/li&gt;
&lt;li&gt;Et, enfin, nos fichiers de sortie seront générés dans le répertoire &lt;code&gt;build&lt;/code&gt;, que nous avons présenté plus haut.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Target phpmd &lt;a name="qa-target-phpmd"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Branchons ensuite l&amp;#8217;appel à l&amp;#8217;outil &lt;a href="http://phpmd.org/" hreflang="en"&gt;PHP Mess Detector&lt;/a&gt;, pour la remontée de statistiques susceptibles de mettre en évidence des portions de code-source de qualité médiocre&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpmd&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phpmd&lt;/span&gt; &lt;span style="color: #000066;"&gt;file&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/${source}/www&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;formatter&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;xml&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;outfile&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/phpmd.xml&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/phpmd&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ici encore, nous utilisons une tâche fournie spécialement par Phing, et indiquons que le fichier en sortie doit être généré vers le répertoire &lt;code&gt;build&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Target phpcpd &lt;a name="qa-target-phpcpd"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Passons ensuite à l&amp;#8217;appel de l&amp;#8217;outil &lt;a href="https://github.com/sebastianbergmann/phpcpd" hreflang="en"&gt;phpcpd&lt;/a&gt;, pour la détection de portions de code copié-collé&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpcpd&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phpcpd&lt;/span&gt; &lt;span style="color: #000066;"&gt;file&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/${source}/www&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;formatter&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;pmd&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;outfile&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/logs/pmd-cpd.xml&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/phpcpd&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;




&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Target phploc &lt;a name="qa-target-phploc"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Enchainons ensuite avec la collecte de statistiques du type nombres de méthodes, nombres de classes, nombres de lignes de code, &amp;#8230; avec l&amp;#8217;outil &lt;a href="https://github.com/sebastianbergmann/phploc" hreflang="en"&gt;phploc&lt;/a&gt;&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phploc&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;exec&lt;/span&gt; &lt;span style="color: #000066;"&gt;logoutput&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;command&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phploc --log-csv '${project.basedir}/build/logs/phploc.csv' '${project.basedir}/${source}/www'&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;escape&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ici, le fichier généré en sortie sera un fichier &lt;code&gt;.csv&lt;/code&gt; &amp;#8212; Jenkins ne saura pas en faire grand chose en l&amp;#8217;état, mais, avec un peu de configuration, nous obtiendrons des graphes de nombres de lignes de code, de nombres de méthodes, &amp;#8230;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Target phpcs &lt;a name="qa-target-phpcs"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Vérifions ensuite le respect des normes de codage, avec &lt;a href="http://pear.php.net/package/PHP_CodeSniffer/redirected" hreflang="en"&gt;PHP_CodeSniffer&lt;/a&gt;&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpcs&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phpcodesniffer&lt;/span&gt; &lt;span style="color: #000066;"&gt;standard&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Zend&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;fileset&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/${source}/www&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;include&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;**/*.php&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/fileset&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;formatter&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;checkstyle&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;outfile&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/logs/checkstyle.xml&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/phpcodesniffer&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;




&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Target phpdoc &lt;a name="qa-target-phpdoc"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Si vous utilisez &lt;a href="http://www.phpdoc.org/" hreflang="en"&gt;phpDocumentor&lt;/a&gt; pour la génération de votre documentation d&amp;#8217;API, voici une target qui devrait vous intéresser&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpdoc&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phpdoc&lt;/span&gt; &lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;API Documentation&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;            &lt;span style="color: #000066;"&gt;destdir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/build/api&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;            &lt;span style="color: #000066;"&gt;sourcecode&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;            &lt;span style="color: #000066;"&gt;output&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;HTML:Smarty:PHP&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;fileset&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/${source}/www&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;include&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;**/*.php&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/fileset&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;projdocfileset&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;include&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;README&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;include&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;INSTALL&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;include&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;CHANGELOG&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/projdocfileset&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/phpdoc&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Notez que si vous utilisez &lt;a href="https://github.com/theseer/phpdox" hreflang="en"&gt;phpdox&lt;/a&gt;, Phing fourni aussi une tâche &lt;code&gt;&amp;lt;docblox&amp;gt;&lt;/code&gt; &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Target phpunit &lt;a name="qa-target-phpunit"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Pour invoquer PHPUnit, Phing fournit une tâche &lt;code&gt;&amp;lt;phpunit&amp;gt;&lt;/code&gt;, mais je n&amp;#8217;ai pas réussi à la faire fonctionner en &lt;a href="http://www.phpunit.de/manual/3.6/en/appendixes.configuration.html" hreflang="en"&gt;utilisant un fichier phpunit.xml pour la configuration des tests&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Ne souhaitant pas dupliquer la configuration de PHPUnit &lt;em&gt;(une fois ici, dans &lt;code&gt;build.xml&lt;/code&gt;, et une fois dans &lt;code&gt;phpunit.xml&lt;/code&gt; tel qu&amp;#8217;attendu par PHPUnit)&lt;/em&gt;, j&amp;#8217;ai préféré utiliser la tâche &lt;code&gt;&amp;lt;exec&amp;gt;&lt;/code&gt;, pour invoquer directement l&amp;#8217;utilitaire &lt;code&gt;phpunit&lt;/code&gt; en ligne de commande&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpunit&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;exec&lt;/span&gt; &lt;span style="color: #000066;"&gt;logoutput&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;dir&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;${project.basedir}/${source}/tests&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;command&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpunit&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;escape&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Et voici un exemple de fichier &lt;code&gt;phpunit.xml&lt;/code&gt;, qui colle au projet d&amp;#8217;exemple que j&amp;#8217;ai utilisé pour rédiger cet article&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phpunit&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;testsuites&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;testsuite&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;My Test Suite&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;directory&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;./&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/directory&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/testsuite&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/testsuites&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
 
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;filter&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;whitelist&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;directory&lt;/span&gt; &lt;span style="color: #000066;"&gt;suffix&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;.php&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;../www&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/directory&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/whitelist&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/filter&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
 
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;logging&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;log&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;coverage-html&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;../../build/coverage&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Name of Project&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;             &lt;span style="color: #000066;"&gt;charset&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;yui&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;highlight&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;             &lt;span style="color: #000066;"&gt;lowUpperBound&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;35&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;highLowerBound&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;70&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;log&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;coverage-clover&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;../../build/logs/clover.xml&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;log&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;junit&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;../../build/logs/junit.xml&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;logIncompleteSkipped&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/logging&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/phpunit&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Immense avantage&amp;#160;: ce fichier &lt;code&gt;phpunit.xml&lt;/code&gt; va être utilisé à la fois par chacun des développeurs de votre équipe sur leurs postes de développement, et par la plate-forme d&amp;#8217;Intégration Continue.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Target phpcb &lt;a name="qa-target-phpcb"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Et pour finir, voici la target invoquant &lt;a href="https://github.com/Mayflower/PHP_CodeBrowser" hreflang="en"&gt;PHP_CodeBrowser&lt;/a&gt;, pour intégrer un navigateur de code à Jenkins, qui prenne en compte les résultats issus d&amp;#8217;outils cités ci-dessus&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpcb&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;exec&lt;/span&gt; &lt;span style="color: #000066;"&gt;logoutput&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;command&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpcb --log '${project.basedir}/build/logs' --source '${project.basedir}/${source}/www' --output '${project.basedir}/build/code-browser'&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;escape&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ici encore, Phing ne fourni pas de tâche spécifique, et nous passons donc par &lt;code&gt;&amp;lt;exec&amp;gt;&lt;/code&gt;&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#pnote-102-4" id="rev-pnote-102-4"&gt;4&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Target qa complète &lt;a name="qa-target-complete"&gt;&lt;/a&gt;&lt;/h4&gt;


&lt;p&gt;Maintenant que nous avons mis en place les targets correspondant à chacun de nos outils d&amp;#8217;analyse, nous pouvons revenir à la target &lt;code&gt;qa&lt;/code&gt;, chargée de les invoquer les uns après les autres, et la compléter&amp;#160;:&lt;/p&gt;

&lt;pre class="xml xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;target&lt;/span&gt; &lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;qa&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;description&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;Lance les outils d'analyse&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;pdepend&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpmd&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpcpd&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phploc&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpcs&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpdoc&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpunit&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;phingcall&lt;/span&gt; &lt;span style="color: #000066;"&gt;target&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;phpcb&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/target&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Résultat du build &lt;a name="resultat-du-build"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Si nous commitons notre fichier &lt;code&gt;build.xml&lt;/code&gt; et attendons quelques instants qu&amp;#8217;un build se lance, et allons faire un tour sur l&amp;#8217;écran &amp;#171;&amp;#160;&lt;code&gt;Sortie de la console&lt;/code&gt;&amp;#160;&amp;#187; de Jenkins, nous verrons que l&amp;#8217;ensemble des outils d&amp;#8217;analyse ont été invoqués.&lt;/p&gt;


&lt;p&gt;Je ne reproduis pas toute la sortie ici, mais voici un bref aperçu du début de la sortie &lt;em&gt;(On voit notamment que les targets &lt;code&gt;pdepend&lt;/code&gt; et &lt;code&gt;phpmd&lt;/code&gt; ont été invoquées)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/300-build.xml-03-all-tools-console-1.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.300-build.xml-03-all-tools-console-1_m.png" alt="300-build.xml-03-all-tools-console-1.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et voici un aperçu de la fin de la sortie console &lt;em&gt;(ici, on voit que les targets &lt;code&gt;phpunit&lt;/code&gt; et &lt;code&gt;phpcb&lt;/code&gt; ont été invoquées, et que le build s&amp;#8217;est terminé avec succès)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/300-build.xml-03-all-tools-console-2.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.300-build.xml-03-all-tools-console-2_m.png" alt="300-build.xml-03-all-tools-console-2.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Publier les résultats du build &lt;a name="publier-resultats-build"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Où en sommes-nous&amp;#160;?
&lt;br /&gt;Nous avons un projet PHP, nous avons mis en place une plate-forme d&amp;#8217;intégration continue, nous avons créé notre script de build, celui-ci lance plusieurs outils d&amp;#8217;analyse sur le code de notre projet&amp;#8230; Il ne nous reste donc plus qu&amp;#8217;à publier les résultats de ces analyses, n&amp;#8217;est-ce pas&amp;#160;?&lt;/p&gt;


&lt;p&gt;Pour mettre en place la configuration de ces résultats d&amp;#8217;analyses, nous allons retourner sur la page de configuration de notre job, sur l&amp;#8217;interface web de Jenkins&amp;#160;: en bas de cette page figure une section &amp;#171;&amp;#160;&lt;code&gt;Actions à la suite du Build&lt;/code&gt;&amp;#160;&amp;#187;, que nous n&amp;#8217;avions pas renseignée, plus haut&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-01-actions-suite-build-aucune.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-01-actions-suite-build-aucune_m.png" alt="400-publish-01-actions-suite-build-aucune.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Nous allons donc configurer les actions de publications correspondant aux outils que nous avons mis en place lors du build.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Analyse checkstyle &lt;a name="publier-analyse-checkstyle"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Dans notre fichier &lt;code&gt;build.xml&lt;/code&gt;, nous avons invoqué l&amp;#8217;outil &lt;code&gt;PHP_CodeSniffer&lt;/code&gt;, en lui demandant de générer en sortie un fichier &lt;code&gt;build/logs/checkstyle.xml&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Renseignons donc ce chemin dans le champ de formulaire correspondant&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-02-checkstyle.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-02-checkstyle_m.png" alt="400-publish-02-checkstyle.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Si vous souhaitez configurer plus finement certaines options, vous pouvez cliquer sur &amp;#171;&amp;#160;&lt;code&gt;Avancé&lt;/code&gt;&amp;#160;&amp;#187;, pour accéder au formulaire complet&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-02-checkstyle-all.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-02-checkstyle-all_m.png" alt="400-publish-02-checkstyle-all.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Une fois ceci configuré, enregistrez le job&amp;#160;; et lançons manuellement un build &lt;em&gt;(puisqu&amp;#8217;aucune modification de code source n&amp;#8217;a été effectuée sur le gestionnaire de versions, Jenkins ne lancera pas de build automatiquement)&lt;/em&gt;&amp;#8230;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Tout à la fin de la sortie console du build, nous voyons que Jenkins a analysé le fichier &lt;code&gt;checkstyle.xml&lt;/code&gt; que nous venons de lui indiquer&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-02-checkstyle-console.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-02-checkstyle-console_m.png" alt="400-publish-02-checkstyle-console.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Une entrée &amp;#171;&amp;#160;&lt;code&gt;Résultats Checkstyle&lt;/code&gt;&amp;#160;&amp;#187; figure maintenant dans le menu de notre projet, à gauche de l&amp;#8217;écran&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-02-checkstyle-menu.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-02-checkstyle-menu_m.png" alt="400-publish-02-checkstyle-menu.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et cliquer sur cette entrée nous mène à une série d&amp;#8217;écrans / onglets nous permettant de consulter les résultats de l&amp;#8217;analyse checkstyle&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-02-checkstyle-details.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-02-checkstyle-details_m.png" alt="400-publish-02-checkstyle-details.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Enfin, si nous re-lançons un build, nous verrons que, une fois son exécution terminée, un graphe remonte sur l&amp;#8217;écran d&amp;#8217;accueil de notre projet, mettant en évidence la &amp;#171;&amp;#160;tendance&amp;#160;&amp;#187; des résultats de notre analyse &lt;em&gt;(un seul build n&amp;#8217;étant pas assez pour tracer un graphe de progression&amp;#160;: il en faut au moins deux, pour qu&amp;#8217;une comparaison soit possible)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-02-checkstyle-dashboard-trend.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-02-checkstyle-dashboard-trend_m.png" alt="400-publish-02-checkstyle-dashboard-trend.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Analyse PMD &lt;a name="publier-analyse-pmd"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;L&amp;#8217;étape suivante est d&amp;#8217;activer la publication des rapports d&amp;#8217;analyse PMD&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-03-pmd.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-03-pmd_m.png" alt="400-publish-03-pmd.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Avec, ici aussi, la possibilité de configurer le publieur de manière un peu plus poussée&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-03-pmd-all.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-03-pmd-all_m.png" alt="400-publish-03-pmd-all.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Une fois un build lancé, nous pouvons constater à la fin de sa sortie console que les résultats de l&amp;#8217;analyse PMD ont été pris en compte&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-03-pmd-console.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-03-pmd-console_m.png" alt="400-publish-03-pmd-console.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le nombre de problèmes relevés est indiqué sur la page principale du build&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-03-pmd-detail.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-03-pmd-detail_m.png" alt="400-publish-03-pmd-detail.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et après quelques builds, l&amp;#8217;écran d&amp;#8217;accueil de notre job voit apparaitre un nouveau graphique de tendances&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-03-pmd-dashboard.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-03-pmd-dashboard_m.png" alt="400-publish-03-pmd-dashboard.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Analyse CPD &lt;a name="publier-analyse-cpd"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Après cela, passons à l&amp;#8217;activation de la publication des rapports de l&amp;#8217;analyse de détection de code copié-collé&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-04-cpd.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-04-cpd_m.png" alt="400-publish-04-cpd.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ou, pour la version &amp;#171;&amp;#160;avancée&amp;#160;&amp;#187;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-04-cpd-all.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-04-cpd-all_m.png" alt="400-publish-04-cpd-all.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et la sortie console d&amp;#8217;un build, une fois cette publication activée &lt;em&gt;(pour vérifier que notre demande de publication a bien été prise en compte &amp;#8212; et que nous n&amp;#8217;avons pas raté un point lors de sa configuration)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-04-cpd-console.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-04-cpd-console_m.png" alt="400-publish-04-cpd-console.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Une section supplémentaire s&amp;#8217;ajoute à l&amp;#8217;écran de détail de notre build, indiquant le nombre de portions de code dupliqué qui ont été relevées par l&amp;#8217;analyse &lt;em&gt;(vu la taille de notre projet d&amp;#8217;exemple, il aurait été difficile de vraiment trouver des portions de code copiées-collées&amp;#8230;)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-04-cpd-detail.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-04-cpd-detail_m.png" alt="400-publish-04-cpd-detail.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et ici encore, au bout de quelques builds, un nouveau graphique vient s&amp;#8217;ajouter à l&amp;#8217;écran principal de notre job, illustrant la tendance&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-04-cpd-dashboard.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-04-cpd-dashboard_m.png" alt="400-publish-04-cpd-dashboard.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Rapports de Tests Unitaires &lt;a name="publier-rapports-tests-unitaires"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Au tour, maintenant, des rapports de tests PHPUnit. Fort heureusement, PHPUnit est capable de générer des fichiers de rapports au format JUnit du monde JAVA &amp;#8212; ce qui tombe plutôt bien, quand notre plate-forme d&amp;#8217;Intégration Continue est un outil du monde JAVA &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;


&lt;p&gt;Donc, activons la publication des rapport JUnit &lt;em&gt;(PHPUnit, donc, mais faisons comme si)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-05-phpunit.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-05-phpunit_m.png" alt="400-publish-05-phpunit.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Une fois la configuration de notre job enregistrée, lançons un build, et vérifions la console&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-05-phpunit-console.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-05-phpunit-console_m.png" alt="400-publish-05-phpunit-console.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Une entrée supplémentaire apparait sur l&amp;#8217;écran principal de chaque build&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-05-phpunit-detail.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-05-phpunit-detail_m.png" alt="400-publish-05-phpunit-detail.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et si nous cliquons sur le lien &amp;#171;&amp;#160;&lt;code&gt;Résultats des tests&lt;/code&gt;&amp;#160;&amp;#187;, nous pourrons naviguer plus en profondeur dans nos classes et méthodes de tests&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-05-phpunit-testclass.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-05-phpunit-testclass_m.png" alt="400-publish-05-phpunit-testclass.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Une fois un second &lt;em&gt;(ou plus)&lt;/em&gt; build lancé, nous constaterons une fois de plus qu&amp;#8217;un graphique supplémentaire vient s&amp;#8217;ajouter à l&amp;#8217;écran principal de notre projet, affichant la tendance de résultats de tests&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-05-phpunit-dashboard.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-05-phpunit-dashboard_m.png" alt="400-publish-05-phpunit-dashboard.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Rapports de Couverture de Code &lt;a name="publier-rapports-couverture-code"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;L&amp;#8217;exécution des Tests Unitaires, dont nous venons de publier le rapport, a permis la création des rapports de couverture de code &lt;em&gt;(qui mettent en évidence les lignes de code exécutées lors des tests unitaires &amp;#8212; et donc, le ratio de code testé vs code non testé)&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;Activons donc la publication de ces rapports&amp;#160;; en tenant compte à la fois du rapport XML &lt;em&gt;(utilisé par Jenkins pour afficher ses statistiques)&lt;/em&gt; et du rapport HTML &lt;em&gt;(qui permettra de naviguer dans le code, en visualisant les lignes exécutées ou non)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-06-clover.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-06-clover_m.png" alt="400-publish-06-clover.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Encore une fois, vérifions la sortie console du build que nous lancerons après avoir enregistré notre configuration, pour nous assurer que ce nouveau point est bien pris en compte en fin de build&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-06-clover-console.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-06-clover-console_m.png" alt="400-publish-06-clover-console.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et sur l&amp;#8217;écran de détail du build le plus récent, nous voyons apparaitre une section &amp;#171;&amp;#160;&lt;code&gt;Clover Code Coverage&lt;/code&gt;&amp;#160;&amp;#187; &lt;em&gt;(bon, 22%, c&amp;#8217;est pas terrible ^^)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-06-clover-detail-build.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-06-clover-detail-build_m.png" alt="400-publish-06-clover-detail-build.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En naviguant vers &amp;#171;&amp;#160;&lt;code&gt;Clover HTML report&lt;/code&gt;&amp;#160;&amp;#187;, via le menu à gauche, nous arrivons sur le rapport HTML généré par PHPUnit, qui permet de naviguer dans le code, en visualisant ce qui a ou non été couvert par nos tests automatisés&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-06-clover-html.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-06-clover-html_m.png" alt="400-publish-06-clover-html.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et en choisissant &amp;#171;&amp;#160;&lt;code&gt;Clover Summary report&lt;/code&gt;&amp;#160;&amp;#187;, nous avons, présentées de façon un peu plus succinte, quelques statistiques&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-06-clover-summary.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-06-clover-summary_m.png" alt="400-publish-06-clover-summary.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ces statistiques se retrouvent d&amp;#8217;ailleurs aussi sur la page principale de notre projet, pour ceux qui voudraient y avoir accès en un coup d&amp;#8217;oeil&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-06-clover-dashboard.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-06-clover-dashboard_m.png" alt="400-publish-06-clover-dashboard.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Documentation d&amp;#8217;API, et Code Browser &lt;a name="publier-documentation-api-code-browser"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Nous avons intégré à notre processus de build la génération de la documentation d&amp;#8217;API &lt;em&gt;(via phpDocumentor, ici)&lt;/em&gt; et d&amp;#8217;un navigateur de code &lt;em&gt;(via PHP_CodeBrowser)&lt;/em&gt;.
&lt;br /&gt;Ces deux outils générent une série de pages HTML, dont Jenkins ne peut pas extraire d&amp;#8217;information spécifique&amp;#160;; nous les publierons donc sous forme de &amp;#171;&amp;#160;&lt;code&gt;HTML reports&lt;/code&gt;&amp;#160;&amp;#187;, ce qui nous permettra tout de même d&amp;#8217;y avoir accès depuis notre plate-forme d&amp;#8217;Intégration Continue&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-07-api-code-browser-01.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-07-api-code-browser-01_m.png" alt="400-publish-07-api-code-browser-01.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Après avoir ajouté les deux rapports correspondant &lt;em&gt;(les chemins utilisés ici correspondent à ceux que nous avons renseigné dans notre script de construction, &lt;code&gt;build.xml&lt;/code&gt;, bien entendu)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-07-api-code-browser-02.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-07-api-code-browser-02_m.png" alt="400-publish-07-api-code-browser-02.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Comme d&amp;#8217;habitude, nous vérifions, via la sortie console du build lancé après enregistrement de ces nouveaux paramètres, que ceux-ci ont bien été pris en compte&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-07-api-code-browser-console.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-07-api-code-browser-console_m.png" alt="400-publish-07-api-code-browser-console.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et la page d&amp;#8217;accueil de notre job &lt;em&gt;(ainsi que le menu gauche)&lt;/em&gt; s&amp;#8217;enrichit de deux liens, correspondant aux deux rapports dont nous avons demandé la publication&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;#171;&amp;#160;&lt;code&gt;API Documentation&lt;/code&gt;&amp;#160;&amp;#187;,&lt;/li&gt;
&lt;li&gt;et &amp;#171;&amp;#160;&lt;code&gt;Code Browser&lt;/code&gt;&amp;#160;&amp;#187;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-07-api-code-browser-dashboard.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-07-api-code-browser-dashboard_m.png" alt="400-publish-07-api-code-browser-dashboard.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Après avoir cliqué sur le premier lien, nous arrivons à la documentation d&amp;#8217;API de notre projet &lt;em&gt;(si j&amp;#8217;avais positionné quelques docblocks dans mon code, ça serait un peu plus parlant, certes)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-07-api-code-browser-phpdoc.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-07-api-code-browser-phpdoc_m.png" alt="400-publish-07-api-code-browser-phpdoc.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et le second lien mène à un navigateur de code, qui intégre une partie des résultats d&amp;#8217;analyse produits par d&amp;#8217;autres outils &lt;em&gt;(ici, en exemple, un extrait de rapport checkstyle généré par PHP_CodeSniffer)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-07-api-code-browser-codebrowser.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-07-api-code-browser-codebrowser_m.png" alt="400-publish-07-api-code-browser-codebrowser.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Rapport PHP Depend &lt;a name="publier-php-depend"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Passons ensuite à la publication du rapport généré par PHP Depend &amp;#8212; qui a fourni un fichier correspondant au format JDepend du monde JAVA, ce qui, encore une fois, est bien arrangeant&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-08-jdepend.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-08-jdepend_m.png" alt="400-publish-08-jdepend.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et, une fois notre paramétrage enregistré, lançons un build et vérifions la sortie console&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-08-console.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-08-console_m.png" alt="400-publish-08-console.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le menu gauche de notre job s&amp;#8217;enrichit, encore une fois, d&amp;#8217;une entrée supplémentaire&amp;#160;: &amp;#171;&amp;#160;&lt;code&gt;JDepend&lt;/code&gt;&amp;#160;&amp;#187;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-08-jdepend-detail-build.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-08-jdepend-detail-build_m.png" alt="400-publish-08-jdepend-detail-build.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et voici un aperçu du rapport qui s&amp;#8217;affiche si nous cliquons dessus &lt;em&gt;(encore une fois, sur un projet d&amp;#8217;exemple aussi petit, le rapport n&amp;#8217;est pas aussi intéressant qu&amp;#8217;il pourrait l&amp;#8217;être sur un projet plus volumineux&amp;#8230;)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-08-jdepend-detail.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-08-jdepend-detail_m.png" alt="400-publish-08-jdepend-detail.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Rapport de violations &lt;a name="publier-violations"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Nous pouvons aussi demander à Jenkins de regrouper, sous forme d&amp;#8217;un graphe, plusieurs types de rapports.&lt;/p&gt;


&lt;p&gt;Typiquement, ici, nous allons regoruper au sein d&amp;#8217;un même graphe les informations issues des analyse checkstyle, cpd, et pmd&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-09-violations.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-09-violations_m.png" alt="400-publish-09-violations.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Comme d&amp;#8217;habitude, jetons un coup d&amp;#8217;oeil à la console après avoir lancé un build&amp;#8230; Bon, pas bien grand chose d&amp;#8217;utile, ce coup-ci&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-09-violations-console.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-09-violations-console_m.png" alt="400-publish-09-violations-console.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Par contre, maintenant &lt;em&gt;(éventuellement, au bout de quelques builds, pour avoir des points de comparaison pour pouvoir tracer un graphe)&lt;/em&gt;, nous avons sur la page d&amp;#8217;accueil de chaque build un graphe reprenant les informations que nous avons aggrégées au-dessus&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-09-violations-detail-build.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-09-violations-detail-build_m.png" alt="400-publish-09-violations-detail-build.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ce graphique se retrouve aussi sur la page principale de notre job, d&amp;#8217;ailleurs.&lt;/p&gt;


&lt;p&gt;Et si nous cliquons sur le lien &amp;#171;&amp;#160;&lt;code&gt;Violations&lt;/code&gt;&amp;#160;&amp;#187; dans le menu gauche, nous arrivons à une page de détails&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-09-violations-detail.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-09-violations-detail_m.png" alt="400-publish-09-violations-detail.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Cette page n&amp;#8217;est pas forcément celle qui vous sera la plus utile, mais le graphique sur la page principale du job, par contre, peut vous intéresser, pour détecter tout changement brutal du nombre de problèmes causées par les sources de votre projet &lt;em&gt;(par exemple, cela peut vous permettre de vérifier en un clin d&amp;#8217;oeil que l&amp;#8217;arrivée d&amp;#8217;un nouveau développeur dans l&amp;#8217;équipe, ne connaissant pas encore vos normes de codage, ne s&amp;#8217;accompagne pas d&amp;#8217;une hausse catastrophique de violations de celles-ci)&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Lignes de code, nombres de méthodes, classes, &amp;#8230; &lt;a name="publier-phploc"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Il reste encore un outil d&amp;#8217;analyse dont nous n&amp;#8217;avons pas exploité les résultats&amp;#160;: &lt;code&gt;phploc&lt;/code&gt;.
&lt;br /&gt;Nous avons demandé à cet outil de nous générer en sortie un fichier CSV, enregistré dans &lt;code&gt;build/logs/phploc.csv&lt;/code&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-workspace.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-workspace_m.png" alt="400-publish-10-plots-workspace.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Si nous jetons un coup d&amp;#8217;oeil au contenu de ce fichier &lt;em&gt;(toujours sur le même mini-projet de test, qui n&amp;#8217;est probablement pas le plus intéressant pour ce genre de chose)&lt;/em&gt;, nous pouvons voir qu&amp;#8217;il contient quelque chose de ce type &lt;em&gt;(j&amp;#8217;ai ajouté des retours à la ligne dans la première ligne, pour faciliter la lecture)&lt;/em&gt;&amp;#160;:&lt;/p&gt;

&lt;pre&gt;
Lines of Code (LOC),Cyclomatic Complexity / Lines of Code,Comment Lines of Code (CLOC),Non-Comment Lines of Code (NCLOC),
    Namespaces,Interfaces,Classes,Abstract Classes,
    Concrete Classes,Average Class Length (NCLOC),Methods,Non-Static Methods,
    Static Methods,Public Methods,Non-Public Methods,Average Method Length (NCLOC),
    Cyclomatic Complexity / Number of Methods,Anonymous Functions,Functions,Constants,
    Global Constants,Class Constants
42,0,0,42,0,0,2,0,2,12.5,5,5,0,3,2,5,1,0,0,0,0,0
&lt;/pre&gt;


&lt;p&gt;Un fichier CSV tout ce qu&amp;#8217;il y a de plus classique, autrement dit, avec en première ligne les titres de colonnes, et en seconde ligne les valeurs.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Tel quel, ce fichier n&amp;#8217;est pas des plus intéressant&amp;#160;; et les chiffres qu&amp;#8217;il contient ne le sont pas bien plus.
&lt;br /&gt;Par contre, avec ce type d&amp;#8217;informations, ce qui peut être intéressant, c&amp;#8217;est la progression au cours du cycle de vie du projet, d&amp;#8217;un build sur l&amp;#8217;autre.&lt;/p&gt;


&lt;p&gt;Nous allons donc publier ces chiffres sous forme de graphes, reprenant l&amp;#8217;historique d&amp;#8217;un nombre non négligeable de constructions, permettant de voir en un rapide coup d&amp;#8217;oeil quelle est l&amp;#8217;évolution de notre projet en termes de nombres de lignes de codes, de nombres de classes, de nombres de méthodes, &amp;#8230;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Les paramètres de configuration que je vais reproduire ici sont ceux proposés par &lt;a href="https://github.com/sebastianbergmann" hreflang="en"&gt;Sebastian Bergmann&lt;/a&gt; dans ses &lt;a href="https://github.com/sebastianbergmann/php-jenkins-template" hreflang="en"&gt;Templates PHP pour Jenkins&lt;/a&gt; &amp;#8212; ils font plutôt bien l&amp;#8217;affaire&amp;#160;; et Sebastian sait de quoi il parle, puisque c&amp;#8217;est l&amp;#8217;auteur de, entre autre, &lt;a href="https://github.com/sebastianbergmann/phploc" hreflang="en"&gt;phploc&lt;/a&gt;, l&amp;#8217;outil utilisé pour effectuer les analyses dont nous présentons ici les résultats.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;A - Lines of code&lt;/h4&gt;


&lt;p&gt;Le premier graphe est celui des nombres de lignes de code.&lt;/p&gt;


&lt;p&gt;Il prendra en compte les colonnes suivantes du fichier CSV&amp;#160;: &lt;code&gt;Lines of Code (LOC),Comment Lines of Code (CLOC),Non-Comment Lines of Code (NCLOC)&lt;/code&gt;
&lt;br /&gt;La configuration correspondante dans Jenkins pourrait donc ressembler à ceci&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-01.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-01_m.png" alt="400-publish-10-plots-01.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Libre à vous de personnaliser le titre et le libellé sur l&amp;#8217;axe Y&amp;#160;; par contre, veillez à bien cocher la radio &amp;#171;&amp;#160;&lt;code&gt;Include columns by name&lt;/code&gt;&amp;#160;&amp;#187;, et à saisir en-dessous les noms des colonnes à utiliser &amp;#8212; cette remarque est vraie pour tous les graphes que nous construirons à partir du rapport généré par &lt;code&gt;phploc&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;B - Structures&lt;/h4&gt;


&lt;p&gt;Passons ensuite au graphe affichant les nombres de structures de chaque type, qui prendra en compte les colonnes suivantes du fichier CSV&amp;#160;: &lt;code&gt;Directories,Files,Namespaces,Interfaces,Classes,Methods,Functions,Anonymous Functions,Constants&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-02.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-02_m.png" alt="400-publish-10-plots-02.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;C - Testing&lt;/h4&gt;


&lt;p&gt;Au tour du graphique présentant les classes et méthodes de tests automatisés, qui tracera les courbes correspondant aux colonnes suivantes&amp;#160;: &lt;code&gt;Classes,Methods,Functions,Test Clases,Test Methods&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-03.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-03_m.png" alt="400-publish-10-plots-03.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;D - Types of Classes&lt;/h4&gt;


&lt;p&gt;Viennent ensuite les nombres de classes de chaque type, avec les colonnes suivantes&amp;#160;: &lt;code&gt;Classes,Abstract Classes,Concrete Classes&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-04.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-04_m.png" alt="400-publish-10-plots-04.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;E - Types of Methods&lt;/h4&gt;


&lt;p&gt;Puis les différents types de méthodes&amp;#160;: &lt;code&gt;Methods,Non-Static Methods,Static Methods,Public Methods,Non-Public Methods&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-05.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-05_m.png" alt="400-publish-10-plots-05.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;F - Types of Constants&lt;/h4&gt;


&lt;p&gt;On passe ensuite aux différents types de constantes&amp;#160;: &lt;code&gt;Constants,Global Constants,Class Constants&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-06.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-06_m.png" alt="400-publish-10-plots-06.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;G - Average Length&lt;/h4&gt;


&lt;p&gt;Pour enchainer avec les longueurs moyennes de classes et de méthodes &lt;em&gt;(on se rappelle au passage que les méthodes et classes trop longues, c&amp;#8217;est pas top &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt; )&lt;/em&gt;&amp;#160;: &lt;code&gt;Average Class Length (NCLOC),Average Method Length (NCLOC)&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-07.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-07_m.png" alt="400-publish-10-plots-07.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;H - Relative Cyclomatic Complexity&lt;/h4&gt;


&lt;p&gt;Et nous terminons avec la &lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity" hreflang="en"&gt;Complexité Cyclomatique&lt;/a&gt;, tirant profit des colonnes suivantes&amp;#160;: &lt;code&gt;Cyclomatic Complexity / Lines of Code,Cyclomatic Complexity / Number of Methods&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-08.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-08_m.png" alt="400-publish-10-plots-08.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4&gt;Et les résultats&amp;#160;?&lt;/h4&gt;


&lt;p&gt;Une seconde fois, rien de bien intéressant dans la sortie console de notre buid&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-console.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-console_m.png" alt="400-publish-10-plots-console.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Par contre, une entrée &amp;#171;&amp;#160;&lt;code&gt;Plots&lt;/code&gt;&amp;#160;&amp;#187; est venue s&amp;#8217;ajouter au menu gauche de notre job&amp;#160;; et cliquer dessus mène à une page présentant les différents graphes que nous venons de configurer.
&lt;br /&gt;Par exemple, pour le nombre de lignes de code&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-result-01.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-result-01_m.png" alt="400-publish-10-plots-result-01.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ou pour les différents types de méthodes&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/400-publish-10-plots-result-02.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.400-publish-10-plots-result-02_m.png" alt="400-publish-10-plots-result-02.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;em&gt;(Bon, OK, ça devient plus intéressant lorsque vous bossez sur un vrai projet bien vivant &amp;#8212; à vous de jouer, pour ça &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt; )&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Et maintenant&amp;#160;? &lt;a name="et-maintenant"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Voyons voir&amp;#8230; vous savez &lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration"&gt;installer Jenkins et ses plugins&lt;/a&gt;, et nous avons vu ici comment le configurer pour placer un projet PHP en intégration continue, construire ce projet avec Phing, et publier les résultats d&amp;#8217;analyse&amp;#8230; C&amp;#8217;est plutôt un bon début &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;


&lt;p&gt;Maintenant, la balle est dans votre camp&amp;#160;: c&amp;#8217;est ce que vous ferez de cette plate-forme d&amp;#8217;Intégration Continue, la façon dont vous travaillerez avec, qui déterminera son utilité réelle pour votre projet.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Si je puis tout de même me permettre quelques conseils&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plus les outils d&amp;#8217;analyse de qualité arrivent tôt &lt;em&gt;(s&amp;#8217;ils sont en place avant même que les développement ne commencent, c&amp;#8217;est encore mieux)&lt;/em&gt;, plus il sera facile de former vos équipes, de les sensibiliser à l&amp;#8217;importance de la qualité, et de tenir compte de ces retours &amp;#8212; si vous mettez en place PHP_CodeSniffer sur un projet en cours de développement depuis des mois, où chacun a codé à sa façon, vous aurez des milliers d&amp;#8217;erreurs&amp;#8230; et personne n&amp;#8217;aura jamais le courage de les corriger&amp;#160;; donc les résultats de cette analyse seront tout simplement ignorés&amp;#160;; et hop, une partie de votre plate-forme qui ne servira à rien&amp;#160;!&lt;/li&gt;
&lt;li&gt;La plate-forme d&amp;#8217;intégration continue ne doit pas être vue comme un ennemi&amp;#160;: un test qui échoue, ce n&amp;#8217;est pas la fin du monde, ce n&amp;#8217;est pas PHPUnit qui est méchant&amp;#160;; au contraire&amp;#160;: c&amp;#8217;est un problème potentiel identifié rapidement, avant livraison de l&amp;#8217;application en production, avant de ne devenir un problème réel&amp;#160;; c&amp;#8217;est donc une aide qui est apportée à toute l&amp;#8217;équipe&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#pnote-102-5" id="rev-pnote-102-5"&gt;5&lt;/a&gt;]&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;L&amp;#8217;Intégration Continue, tout comme le code de l&amp;#8217;application, ce n&amp;#8217;est pas réservé à une ou deux personnes&amp;#160;: c&amp;#8217;est toute l&amp;#8217;équipe du projet qui est concernée&amp;#160;; et doit donc être formée à son utilité, et à son utilisation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et, sur un plan plus technique&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si vous utilisez un Framework &lt;em&gt;(Zend Framework, symfony, &amp;#8230;)&lt;/em&gt;, ou construisez autour d&amp;#8217;un logiciel existant &lt;em&gt;(Drupal, Magento, &amp;#8230;)&lt;/em&gt;&amp;#160;: ne perdez pas de temps à jouer les tests de ces outils, ni à construire leur documentation d&amp;#8217;API &amp;#8212; de toute façon, vous n&amp;#8217;y arriverez probablement pas &lt;em&gt;(votre build durerait une éternité&amp;#160;; pour rien ou presque, finalement)&lt;/em&gt;&amp;#160;; au contraire, excluez les répertoires concernés.&lt;/li&gt;
&lt;li&gt;Au fur et à mesure que votre projet va grossir, votre plate-forme d&amp;#8217;Intégration Continue va avoir besoin de plus de ressources machine &lt;em&gt;(CPU, RAM, disque, &amp;#8230;)&lt;/em&gt; &amp;#8212; évitez donc de la déployer sur un petit serveur dans un coin, déjà utilisé pour 36 autres trucs &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Quelques liens et sources d&amp;#8217;inspiration&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.phing.info/docs/guide/stable/" hreflang="en"&gt;Documentation de Phing&lt;/a&gt;&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#pnote-102-6" id="rev-pnote-102-6"&gt;6&lt;/a&gt;]&lt;/sup&gt;&amp;#160;: elle vous sera utile, lorsque vous aurez besoin de rendre votre &lt;code&gt;build.xml&lt;/code&gt; plus spécifique, ou de développer des tâches personnalisées &lt;em&gt;(ce qui, dans le cadre de l&amp;#8217;IC, ne m&amp;#8217;est pas arrivé bien souvent&amp;#160;; mais phing, comme outil d&amp;#8217;automatisation, peut être utilisé dans d&amp;#8217;autres contextes &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt; )&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jenkins-php.org/" hreflang="en"&gt;Template for Jenkins Jobs for PHP Projects&lt;/a&gt;&amp;#160;: comment mettre un projet en Intégration Continue sous Jenkins &amp;#8212; en utilisant Ant, et pas Phing&amp;#160;; si vous n&amp;#8217;avez pas envie de faire toute la création du script de build et toute la configuration du job Jenkins &amp;#171;&amp;#160;à la main&amp;#160;&amp;#187;, ces templates sont fait pour vous &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/sebastian_bergmann/integrate-your-php-project-with-jenkins" hreflang="en"&gt;Integrate Your PHP Project with Jenkins&lt;/a&gt;&amp;#160;: une série de slides &lt;em&gt;(en anglais)&lt;/em&gt; de &lt;a href="http://sebastian-bergmann.de/" hreflang="en"&gt;Sebastian Bergmann&lt;/a&gt; sur le sujet,&lt;/li&gt;
&lt;li&gt;et &lt;a href="http://www.slideshare.net/hhamon/intgration-continue-des-projets-php-avec-jenkins" hreflang="fr"&gt;Intégration continue des projets PHP avec Jenkins&lt;/a&gt;&amp;#160;: une série de slides de &lt;a href="http://www.hugohamon.com/"&gt;Hugo Hamon&lt;/a&gt;&amp;#160;; en français, ceux-ci &amp;#8212; jetez-y un coup d&amp;#8217;oeil&amp;#160;!&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class="footnotes"&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#rev-pnote-102-1" id="pnote-102-1"&gt;1&lt;/a&gt;] Et rien que cette extensibilité en PHP, c&amp;#8217;est une énorme force pour Phing, dans le cadre de projets PHP où les équipes de développement ne savent pas forcément coder en JAVA &amp;#8212; en encore moins débugger un programme JAVA qui planterait.&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#rev-pnote-102-2" id="pnote-102-2"&gt;2&lt;/a&gt;] Si votre projet est sous SVN et que vous bossez sur plusieurs demandes en même temps, sans utiliser de branche, vous voyez probablement de quoi je parle&amp;#8230;&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#rev-pnote-102-3" id="pnote-102-3"&gt;3&lt;/a&gt;] Un autre avantage de Phing, outil du monde PHP &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#rev-pnote-102-4" id="pnote-102-4"&gt;4&lt;/a&gt;] Libre à vous de coder la tâche correspondante, et de soumettre un patch &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#rev-pnote-102-5" id="pnote-102-5"&gt;5&lt;/a&gt;] Je ne sais pas vous, mais moi, je suis bien content quand j&amp;#8217;arrive au bureau et que, avant de livrer une évolution en production, j&amp;#8217;ai un mail qui me dit &amp;#171;&amp;#160;build failed&amp;#160;&amp;#187;&amp;#160;; c&amp;#8217;est quand même plus agréable que le coup de fil du client deux heures après, ralant parce que ça fait deux heures que les utilisateurs ne peuvent plus passer de commande sur sa boutique et qu&amp;#8217;il a perdu X milliers d&amp;#8217;euro sur la matinée&amp;#8230; surtout si vous lui avez déjà fait le coup trois semaines avant&amp;#8230;&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#rev-pnote-102-6" id="pnote-102-6"&gt;6&lt;/a&gt;] Oui, la documentation de Phing, en son état actuel, est mal foutue &amp;#8212; j&amp;#8217;ai espoir que ça change dans le futur&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=grT9jUqd8s4:VOvFP1Uwx9A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=grT9jUqd8s4:VOvFP1Uwx9A:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=grT9jUqd8s4:VOvFP1Uwx9A:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=grT9jUqd8s4:VOvFP1Uwx9A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=grT9jUqd8s4:VOvFP1Uwx9A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=grT9jUqd8s4:VOvFP1Uwx9A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=grT9jUqd8s4:VOvFP1Uwx9A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=grT9jUqd8s4:VOvFP1Uwx9A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#comment-form</comments>
      <wfw:comment>http://blog.pascal-martin.fr/post/integration-continue-jenkins-projet-php#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pascal-martin.fr/feed/atom/comments/102</wfw:commentRss>
      </item>
    
  <item>
    <title>Intégration continue avec Jenkins : installation et configuration de base</title>
    <link>http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration</link>
    <guid isPermaLink="false">urn:md5:5b65ced7a2f9807652b6442a0811a52f</guid>
    <pubDate>lun., 26 sept. 2011 08:00:00 +0200</pubDate>
    <dc:creator>Pascal MARTIN</dc:creator>
        <category>Développement Web</category>
        <category>integration-continue</category><category>jenkins</category>    
    <description>&lt;p&gt;&lt;a href="http://jenkins-ci.org/" hreflang="en"&gt;Jenkins&lt;/a&gt;, précédemment connu sous le nom de &lt;a href="http://hudson-ci.org/" hreflang="en"&gt;Hudson&lt;/a&gt;&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#pnote-101-1" id="rev-pnote-101-1"&gt;1&lt;/a&gt;]&lt;/sup&gt;, est un outil Open-Source d&amp;#8217;Intégration Continue, écrit en JAVA.&lt;/p&gt;


&lt;p&gt;Cet article va montrer comment installer un serveur d&amp;#8217;Intégration Continue sous Jenkins&amp;#160;; et sera suivi d&amp;#8217;un second article, qui montrera comment utiliser cette plate-forme pour intégrer un projet PHP.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Sommaire&amp;#160;:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#integration-continue"&gt;Intégration continue&amp;#160;?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#ic-quoi"&gt;L&amp;#8217;intégration continue, qu&amp;#8217;est-ce que c&amp;#8217;est&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#ic-pre-requis"&gt;Pré-requis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#ic-pourquoi"&gt;Pourquoi&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-jenkins"&gt;Installation de Jenkins&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-jenkins-ubuntu"&gt;Sous Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-jenkins-windows"&gt;Et sous Windows&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-jenkins-ensuite"&gt;Une fois que Jenkins est installé&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#jenkins-acces-cli"&gt;Accès en CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#tour-interface-administration"&gt;Petit tour de l&amp;#8217;interface d&amp;#8217;administration, et gestion de base&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-plugins"&gt;Installation de plugins&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-plugins-principe"&gt;Principe de l&amp;#8217;installation de plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-plugins-quels-plugins"&gt;Quels plugins installer&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#configuration"&gt;Configuration&amp;#160;?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#configuration-systeme"&gt;Configuration du système&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#configuration-compte-utilisateur"&gt;Création d&amp;#8217;un compte utilisateur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#configuration-retour-cli"&gt;Et la CLI, alors&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#maj"&gt;Mises à jour&amp;#160;?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#maj-jenkins"&gt;Mise à jour de Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#maj-plugins"&gt;Mise à jour des plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#liens-utiles"&gt;Liens utiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnotes"&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#rev-pnote-101-1" id="pnote-101-1"&gt;1&lt;/a&gt;] Pour faire simple, le projet Hudson s&amp;#8217;est renommé en Jenkins suite à un désaccord avec Oracle &amp;#8212; et, maintenant, les deux projets ont tendance à se considérer l&amp;#8217;un-l&amp;#8217;autre comme des forks&amp;#8230;&lt;/p&gt;&lt;/div&gt;    &lt;p&gt;&lt;a href="http://jenkins-ci.org/" hreflang="en"&gt;Jenkins&lt;/a&gt;, précédemment connu sous le nom de &lt;a href="http://hudson-ci.org/" hreflang="en"&gt;Hudson&lt;/a&gt;&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#pnote-101-1" id="rev-pnote-101-1"&gt;1&lt;/a&gt;]&lt;/sup&gt;, est un outil Open-Source d&amp;#8217;Intégration Continue, écrit en JAVA.&lt;/p&gt;


&lt;p&gt;Cet article va montrer comment installer un serveur d&amp;#8217;Intégration Continue sous Jenkins&amp;#160;; et sera suivi d&amp;#8217;un second article, qui montrera comment utiliser cette plate-forme pour intégrer un projet PHP.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Sommaire&amp;#160;:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#integration-continue"&gt;Intégration continue&amp;#160;?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#ic-quoi"&gt;L&amp;#8217;intégration continue, qu&amp;#8217;est-ce que c&amp;#8217;est&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#ic-pre-requis"&gt;Pré-requis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#ic-pourquoi"&gt;Pourquoi&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-jenkins"&gt;Installation de Jenkins&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-jenkins-ubuntu"&gt;Sous Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-jenkins-windows"&gt;Et sous Windows&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-jenkins-ensuite"&gt;Une fois que Jenkins est installé&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#jenkins-acces-cli"&gt;Accès en CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#tour-interface-administration"&gt;Petit tour de l&amp;#8217;interface d&amp;#8217;administration, et gestion de base&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-plugins"&gt;Installation de plugins&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-plugins-principe"&gt;Principe de l&amp;#8217;installation de plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#installation-plugins-quels-plugins"&gt;Quels plugins installer&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#configuration"&gt;Configuration&amp;#160;?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#configuration-systeme"&gt;Configuration du système&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#configuration-compte-utilisateur"&gt;Création d&amp;#8217;un compte utilisateur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#configuration-retour-cli"&gt;Et la CLI, alors&amp;#160;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#maj"&gt;Mises à jour&amp;#160;?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#maj-jenkins"&gt;Mise à jour de Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#maj-plugins"&gt;Mise à jour des plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#liens-utiles"&gt;Liens utiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Intégration continue&amp;#160;? &lt;a name="integration-continue"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Pour commencer, quelques mots sur ce qu&amp;#8217;est l&amp;#8217;Intégration Continue, quelques pré-requis à la mise en Intégration Continue d&amp;#8217;un projet&amp;#8230; Et aussi quelques points expliquant en quoi l&amp;#8217;Intégration Cotninue peut être utile.&lt;/p&gt;


&lt;h3&gt;L&amp;#8217;intégration continue, qu&amp;#8217;est-ce que c&amp;#8217;est&amp;#160;? &lt;a name="ic-quoi"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Pour faire simple, le principe est de vérifier, idéalement à chaque modification de code source, que le résultat de ces modifications de produit pas de régression sur l&amp;#8217;application.&lt;/p&gt;


&lt;p&gt;Autrement dit, le but est de faire de l&amp;#8217;intégration un &lt;em&gt;non-événement&lt;/em&gt;&amp;#160;: au lieu d&amp;#8217;avoir le travail de 10 développeurs mis en commun une fois par mois &lt;em&gt;&amp;#8212; et, forcément, que tout casse pendant quelques jours, parce que chaque développeur avait interprêté les specs à sa façon &amp;#8212;&lt;/em&gt;, cette mise en commun se fait maintenant à chaque modification, en continu&amp;#160;; ce qui permet d&amp;#8217;augmenter les chances que chaque portion de l&amp;#8217;application fonctionne avec ses autres composantes.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Pré-requis &lt;a name="ic-pre-requis"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Pour que l&amp;#8217;intégration continue soit possible sur un projet, quelques pré-requis doivent être en place&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le code-source de l&amp;#8217;application doit être partagé entre tous les développeurs&amp;#160;; typiquement, en utilisant un &lt;a href="http://fr.wikipedia.org/wiki/Logiciel_de_gestion_de_versions" hreflang="fr"&gt;système de gestion de versions&lt;/a&gt; &lt;em&gt;(CVS, SVN, Bazaar, Git, &amp;#8230;)&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;Les développeurs doivent pousser réglièrement leurs modifications de code vers le système de gestion de versions,&lt;/li&gt;
&lt;li&gt;Et des tests &lt;em&gt;(automatisés)&lt;/em&gt; d&amp;#8217;intégration doivent être mis en place, pour valider l&amp;#8217;application &lt;em&gt;(intégrer les sources de l&amp;#8217;application sans vérifier le bon fonctionnement de celle-ci, c&amp;#8217;est peu utile, mine de rien&amp;#8230;)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J&amp;#8217;ajouterais que, pour que l&amp;#8217;Intégration Continue soit un succès, et pour que la plate-forme d&amp;#8217;IC soit pleinement utilisée, il est nécessaire que les équipes &lt;em&gt;(à tous les niveaux&amp;#160;: développeurs, testeurs, chefs de projets, &amp;#8230;)&lt;/em&gt; soient formés à la fois à sont utilité, mais aussi à son utilisation.
&lt;br /&gt;Typiquement, si le management se désintéresse de l&amp;#8217;intégration continue, une partie des équipes ne s&amp;#8217;en souciera plus, les rapports d&amp;#8217;échecs ne seront plus analysés, une partie des problèmes ne seront plus corrigés, et la plate-forme perdra petit à petit de son intérêt &amp;#8212; devenant, au mieux, un outil de déploiement régulier, et, au pire, un truc plein de rouge envoyant des mails que personne ne prend plus le temps de lire&amp;#8230;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Pourquoi&amp;#160;? &lt;a name="ic-pourquoi"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Les principaux avantages de l&amp;#8217;Intégration Continue sont les suivants&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les problèmes d&amp;#8217;intégration sont détectés rapidement, et peuvent donc être corrigés au fil de l&amp;#8217;eau, sans avoir à attendre une passe d&amp;#8217;intégration manuelle qui n&amp;#8217;a lieu que trop rarement&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#pnote-101-2" id="rev-pnote-101-2"&gt;2&lt;/a&gt;]&lt;/sup&gt;,&lt;/li&gt;
&lt;li&gt;Les tests automatisés mis en place sur l&amp;#8217;application, et joués à chaque intégration, permettent d&amp;#8217;&lt;strong&gt;identifier rapidement les changements problématiques&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;La dernière version stable de l&amp;#8217;application est connue, et peut rapidement être obtenue &lt;em&gt;(pour tests, démonstration, &amp;#8230;)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Installation de Jenkins &lt;a name="installation-jenkins"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Installer &lt;a href="http://jenkins-ci.org/" hreflang="en"&gt;Jenkins&lt;/a&gt; &lt;em&gt;(un des logiciels servant de base pour une plate-forme d&amp;#8217;Intégration Continue &amp;#8212; et le plus utilisé, en ce moment, pour les projets PHP)&lt;/em&gt;, pour peu que vous disposiez d&amp;#8217;un serveur d&amp;#8217;intégration à peu près à jour, n&amp;#8217;est pas bien compliqué&amp;#160;: l&amp;#8217;idée de base est de télécharger un &lt;code&gt;.war&lt;/code&gt;, et de le lancer&amp;#160;; en ajoutant éventuellement ce lancement aux services de la machine, pour qu&amp;#8217;il soit automatisé.&lt;/p&gt;


&lt;h3&gt;Sous Ubuntu &lt;a name="installation-jenkins-ubuntu"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;J&amp;#8217;ai l&amp;#8217;habitude d&amp;#8217;utiliser la distribution Ubuntu sur mes machines de développement et sur mes serveurs de test/intégration&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#pnote-101-3" id="rev-pnote-101-3"&gt;3&lt;/a&gt;]&lt;/sup&gt;&amp;#160;; et, justement, l&amp;#8217;installation de Jenkins sous Ubuntu est extrêment simple.&lt;/p&gt;


&lt;p&gt;Je ne vais pas faire grand chose de plus que citer la page &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu" hreflang="en"&gt;Installing Jenkins on Ubuntu&lt;/a&gt;&amp;#160;; mais vous avez juste quatre lignes de commandes à lancer pour installer Jenkins&amp;#160;:&lt;/p&gt;

&lt;pre class="bash bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;wget&lt;/span&gt; &lt;span style="color: #660033;"&gt;-q&lt;/span&gt; &lt;span style="color: #660033;"&gt;-O&lt;/span&gt; - http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;pkg.jenkins-ci.org&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;debian&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;jenkins-ci.org.key &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;apt-key&lt;/span&gt; add -
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;sh&lt;/span&gt; &lt;span style="color: #660033;"&gt;-c&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;'echo deb http://pkg.jenkins-ci.org/debian binary/ &amp;gt; /etc/apt/sources.list.d/jenkins.list'&lt;/span&gt;
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;apt-get&lt;/span&gt; update
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;apt-get&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; jenkins&lt;/pre&gt;


&lt;p&gt;Avantage&amp;#160;: Jenkins sera installé de la même manière que les autres composants du système, via le système de gestion de paquets de la distribution &amp;#8212; ce qui facilitera, entre autres, les mises à jour.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Et sous Windows&amp;#160;? &lt;a name="installation-jenkins-windows"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;C&amp;#8217;est généralement assez peu utile dans le cadre d&amp;#8217;un projet PHP &lt;em&gt;(encore que, en fonction du type de projet, vérifier son bon fonctionnement sous une large gamme d&amp;#8217;OS ne soit absolument pas une mauvaise idée)&lt;/em&gt;, mais Jenkins peut aussi être installé sous Windows.&lt;/p&gt;


&lt;p&gt;N&amp;#8217;ayant pas encore testé par moi-meme, je ne peux que vous pointer vers &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+as+a+Windows+service" hreflang="en"&gt;Install Jenkins as a Windows service&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Une fois que Jenkins est installé&amp;#160;? &lt;a name="installation-jenkins-ensuite"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Une fois Jenkins installé, il ne vous reste plus qu&amp;#8217;à accéder, via votre navigateur web, à son interface.&lt;/p&gt;


&lt;p&gt;Par défaut, Jenkins écoute sur le port &lt;code&gt;8080&lt;/code&gt;&amp;#160;; donc, en fonction de l&amp;#8217;adresse de votre serveur d&amp;#8217;intégration, vous utiliserez une URL de ce type pour y accéder&amp;#160;:&lt;/p&gt;

&lt;pre&gt;
http://192.168.0.14:8080/
&lt;/pre&gt;


&lt;p&gt;Ou, si vous avez défini une entrée DNS ou un alias dans votre fichier &lt;code&gt;hosts&lt;/code&gt;, vous utiliserez quelque chose de ce type&amp;#160;:&lt;/p&gt;

&lt;pre&gt;
http://jenkins:8080/
&lt;/pre&gt;


&lt;p&gt;Pour la suite de cet article, j&amp;#8217;utiliserai généralement cet alias &lt;code&gt;jenkins&lt;/code&gt; &amp;#8212; à vous d&amp;#8217;adapter mes URLs à votre environnement.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Accès en CLI &lt;a name="jenkins-acces-cli"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;En plus de cet accès Web, qui vous permet à la fois de gérer la plate-forme et vos projets via une interface relativement agréable à utiliser, il existe un accès en ligne de commande, qui est surtout utile pour scripter des opérations de maintenance.&lt;/p&gt;


&lt;p&gt;Depuis l&amp;#8217;interface Web, vous pouvez cliquer sur &lt;code&gt;Administrer Jenkins &amp;gt; Ligne de commande (CLI) Jenkins&lt;/code&gt; &lt;em&gt;(ou, plus simplement, accéder à &lt;code&gt;http://jenkins:8080/cli&lt;/code&gt;)&lt;/em&gt; pour plus d&amp;#8217;informations à ce sujet, mais le principe de base est de télécharger le fichier &lt;code&gt;.jar&lt;/code&gt; permettant l&amp;#8217;accès à distance&amp;#160;:&lt;/p&gt;

&lt;pre class="bash bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;wget&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;jnlpJars&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;jenkins-cli.jar&lt;/pre&gt;


&lt;p&gt;Et, ensuite, de l&amp;#8217;exécuter, avec les bons noms de commandes &amp;#8212; par exemple, pour afficher la liste des commandes disponibles, ainsi qu&amp;#8217;un court descriptif&amp;#160;:&lt;/p&gt;

&lt;pre class="bash bash" style="font-family:monospace;"&gt;java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;help&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Nous utiliserons un peu plus loin cet accès en ligne de commande, pour semi-automatiser l&amp;#8217;installation de plugins.&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Petit tour de l&amp;#8217;interface d&amp;#8217;administration, et gestion de base &lt;a name="tour-interface-administration"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Maintenant que nous avons installé Jenkins, et que nous savons y accéder, faisons un rapide tour de l&amp;#8217;interface d&amp;#8217;administration, avant de commencer à installer les plugins qui seront plus tard utilisés pour la mise en Intégration Continue d&amp;#8217;un projet PHP.&lt;/p&gt;


&lt;p&gt;Tout d&amp;#8217;abord, si nous pointons notre navigateur vers le port &lt;code&gt;8080&lt;/code&gt; de notre serveur d&amp;#8217;intégration &lt;em&gt;(dans mon cas, &lt;code&gt;http://192.168.0.14:8080/&lt;/code&gt; &amp;#8212; mais, comme vu plus haut, rien ne vous empêche d&amp;#8217;utiliser un nom de machine, comme &lt;code&gt;http://jenkins:8080/&lt;/code&gt;)&lt;/em&gt;, nous arrivons sur la page d&amp;#8217;accueil de Jenkins&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/001-just-installed-admin-screen.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.001-just-installed-admin-screen_m.png" alt="001-just-installed-admin-screen.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;On peut ici noter quelques premiers éléments&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En haut à gauche, le menu principal, à partir duquel nous pourrons administrer Jenkins, ajouter des utilisateurs, &amp;#8230;&lt;/li&gt;
&lt;li&gt;Juste en dessous, toujours à gauche, la file d&amp;#8217;attente de construction, qui, à terme, indiquera les projets en attente / en cours de construction,&lt;/li&gt;
&lt;li&gt;Et, bien sûr, au milieu de l&amp;#8217;écran, puisque nous n&amp;#8217;avons pas encore créé de job, un lien nous invitant à le faire.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Cliquer sur le lien &lt;code&gt;Administrer Jenkins&lt;/code&gt;, dans le menu gauche, nous mène à la page de gestion de notre plate-forme d&amp;#8217;Intégration Continue&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/002-just-installed-manage-screen.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.002-just-installed-manage-screen_m.png" alt="002-just-installed-manage-screen.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Je vous encourage à cliquer sur la première entrée de cette page, le lien &lt;code&gt;Configurer le système&lt;/code&gt;, qui vous permettra de configurer les paramètres généraux de la plate-forme&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/003-just-installed-manage-configure-system-01.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.003-just-installed-manage-configure-system-01_m.png" alt="003-just-installed-manage-configure-system-01.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Comme vous pouvez le constater, la liste d&amp;#8217;options offertes est déjà relativement longue, puisqu&amp;#8217;elle ne tient généralement pas sur un seul écran&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/003-just-installed-manage-configure-system-02.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.003-just-installed-manage-configure-system-02_m.png" alt="003-just-installed-manage-configure-system-02.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Heureusement, vous trouverez, pour quasiment chaque option et paramètre de Jenkins, un bouton &amp;#171;&amp;#160;&lt;code&gt;Aide&lt;/code&gt;&amp;#160;&amp;#187; à droite de l&amp;#8217;écran.
&lt;br /&gt;Cliquer dessus affichera quelques informations quant aux données attendues par le champ de formulaire à côté duquel cette icône figure.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Par exemple, si je clique sur le bouton &amp;#171;&amp;#160;&lt;code&gt;Aide&lt;/code&gt;&amp;#160;&amp;#187; à droite du champ &amp;#171;&amp;#160;&lt;code&gt;Période d'attente&lt;/code&gt;&amp;#160;&amp;#187;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/003-just-installed-manage-configure-system-03-help-01.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.003-just-installed-manage-configure-system-03-help-01_m.png" alt="003-just-installed-manage-configure-system-03-help-01.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En l&amp;#8217;état, il n&amp;#8217;y a pas grand chose à configurer&amp;#160;: les options par défaut ont tendance à faire l&amp;#8217;affaire.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Cela dit, je ne peux que vous conseiller de prendre le temps de lire l&amp;#8217;aide de chaque option&amp;#160;: cela vous permettra de voir ce que vous pouvez faire avec Jenkins, ainsi que de vous familiariser avec la plate-forme.&lt;/p&gt;


&lt;p&gt;Dans le même esprit, n&amp;#8217;hésitez pas à faire un tour sur les autres écrans de l&amp;#8217;interface d&amp;#8217;administration&amp;#160;: après tout, un peu de curiosité n&amp;#8217;a jamais fait de mal &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;




&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Installation de plugins &lt;a name="installation-plugins"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Une grande richesse de Jenkins &lt;em&gt;(qui, de base, ne fait pas bien grand chose &amp;#8212; surtout pour ce qui est de projets PHP)&lt;/em&gt; est son système de plugins, ainsi que le grand nombre de plugins existant.&lt;/p&gt;


&lt;p&gt;Pour accéder aux écrans de gestion des plugins,&amp;#160;: &lt;code&gt;Administrer Jenkins &amp;gt; Gestion des plugins&lt;/code&gt;, qui devrait vous mener à &lt;code&gt;http://jenkins:8080/pluginManager/&lt;/code&gt;.
&lt;br /&gt;Ici, vous aurez sous les yeux la liste des plugins installés &lt;em&gt;(quelques plugins sont fournis avec Jenkins, et, donc, déjà installés, même si ce n&amp;#8217;est pas par vous)&lt;/em&gt;, pour lesquels une mise à jour est disponible&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/004-just-installed-manage-plugins-01-updates-available.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.004-just-installed-manage-plugins-01-updates-available_m.png" alt="004-just-installed-manage-plugins-01-updates-available.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;L&amp;#8217;onglet d&amp;#8217;à-côté est celui qui donne la liste des plugins disponibles, plus ou moins rangés par catégories &amp;#8212; comme vous pouvez le constater, la liste est longue&amp;#160;; et la parcourir rapidement peut vous donner une idée des possibilités réelles d&amp;#8217;une plate-forme d&amp;#8217;Intégration Continue Jenkins&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/004-just-installed-manage-plugins-02-available.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.004-just-installed-manage-plugins-02-available_m.png" alt="004-just-installed-manage-plugins-02-available.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Continuons avec le troisième onglet, qui affiche la liste des onglets installés.
&lt;br /&gt;Pour l&amp;#8217;instant, il n&amp;#8217;y en n&amp;#8217;a que quelques uns, mais nous allons rapidement allonger cette liste&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/004-just-installed-manage-plugins-03-installed.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.004-just-installed-manage-plugins-03-installed_m.png" alt="004-just-installed-manage-plugins-03-installed.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et enfin, un quatrième onglet &amp;#171;&amp;#160;&lt;code&gt;Avancé&lt;/code&gt;&amp;#160;&amp;#187;, qui vous permettra notamment, si besoin est, de configurer un Proxy, par lequel Jenkins passera pour le téléchargement de plugins ou la recherche de mises à jour&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/004-just-installed-manage-plugins-04-advanced.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.004-just-installed-manage-plugins-04-advanced_m.png" alt="004-just-installed-manage-plugins-04-advanced.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Principe de l&amp;#8217;installation de plugins &lt;a name="installation-plugins-principe"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Généralement, l&amp;#8217;installation de nouveaux plugins va se faire via le second onglet vu plus haut&amp;#160;: cochez les plugins à installer, validez via le bouton en bas de la liste, et voilà.&lt;/p&gt;


&lt;p&gt;Mais j&amp;#8217;ai tendance à privilégier, pour ce type d&amp;#8217;opération, l&amp;#8217;interface en ligne de commandes&amp;#160;: ça a l&amp;#8217;immense avantage d&amp;#8217;être scriptable &lt;em&gt;(autrement dit, une fois que la liste des plugins est connue et la liste des commandes correspondantes saisie, il ne reste plus qu&amp;#8217;à la rejouer à chaque installation d&amp;#8217;une plate-forme Jenkins &amp;#8212; et celles-ci sont toujours installées avec à peu près les même plugins)&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;En cas d&amp;#8217;installation en ligne de commande, notons que le nom du plugin à utiliser dans la commande d&amp;#8217;installation est le &amp;#171;&amp;#160;&lt;em&gt;nom court&lt;/em&gt;&amp;#160;&amp;#187;
&lt;br /&gt;Par exemple, pour le plugin &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Green+Balls" hreflang="en"&gt;Green Balls&lt;/a&gt;, dont la page de présentation commence comme ceci&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/005-plugin-wiki-greenballs.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.005-plugin-wiki-greenballs_m.png" alt="005-plugin-wiki-greenballs.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le nom court sera &amp;#171;&amp;#160;&lt;code&gt;greenballs&lt;/code&gt;&amp;#160;&amp;#187;, et la commande d&amp;#8217;installation correspondante sera&amp;#160;:&lt;/p&gt;

&lt;pre class="bash bash" style="font-family:monospace;"&gt;java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin greenballs&lt;/pre&gt;


&lt;p&gt;&lt;br /&gt;
Que le plugin ait été installé en ligne de commande, ou directement via l&amp;#8217;interface web, un redémarrage de Jenkins sera nécessaire &amp;#8212; comme indiqué, par exemple, sur la page de liste des plugins installés&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/006-plugin-after-install-greenballs-01.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.006-plugin-after-install-greenballs-01_m.png" alt="006-plugin-after-install-greenballs-01.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Redémarrons donc la plate-forme&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/006-plugin-after-install-greenballs-02-jenkins-restart.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.006-plugin-after-install-greenballs-02-jenkins-restart_m.png" alt="006-plugin-after-install-greenballs-02-jenkins-restart.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et après quelques instants, le plugin que nous venons d&amp;#8217;installer et indiqué comme tel&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/006-plugin-after-install-greenballs-03-installed.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.006-plugin-after-install-greenballs-03-installed_m.png" alt="006-plugin-after-install-greenballs-03-installed.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Au passage, tant que j&amp;#8217;y suis&amp;#160;: dans une logique d&amp;#8217;automatisation de l&amp;#8217;installation des plugins, le redémarrage de Jenkins aurait aussi pu se faire depuis la ligne de commande&amp;#160;:&lt;/p&gt;

&lt;pre class="bash bash" style="font-family:monospace;"&gt;java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt; safe-restart&lt;/pre&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Quels plugins installer&amp;#160;?  &lt;a name="installation-plugins-quels-plugins"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Considérant la taille de la liste de plugins disponibles, il va vous falloir effectuer un peu de tri, pour n&amp;#8217;installer que ceux qui vous sont nécessaires&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#pnote-101-4" id="rev-pnote-101-4"&gt;4&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;Catégoriser les plugins n&amp;#8217;est pas forcément évident, mais essayons&amp;#160;; je dirais qu&amp;#8217;on peut les regrouper en quatre ensembles&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les plugins qui sont plus en rapport avec la plate-forme Jenkins en elle-même qu&amp;#8217;avec vos projets&amp;#160;: le suivi de sa configuration, la gestion des constructions, l&amp;#8217;envoi de mails de reporting, la signalisation d&amp;#8217;échecs de construction via Jabber, &amp;#8230;&lt;/li&gt;
&lt;li&gt;Les plugins qui permettent d&amp;#8217;accéder au code-source de votre projet&amp;#160;: SVN, Git, CVS, &amp;#8230;&lt;/li&gt;
&lt;li&gt;Les plugins qui effectuent les analyses sur votre projet&amp;#160;: tests unitaires, couverture de code, respect des normes de codage, &amp;#8230;&lt;/li&gt;
&lt;li&gt;Et, enfin, les plugins qui permettent de publier les résultats des analyses&amp;#160;: tracé de graphes, mise à disposition de rapports HTML, &amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Presque en vrac, voici une liste de plugins que j&amp;#8217;ai tendance à installer &lt;em&gt;(certains toujours&amp;#160;; d&amp;#8217;autres plus occasionnellement)&lt;/em&gt;, lorsqu&amp;#8217;il s&amp;#8217;agit de mettre en place une plate-forme d&amp;#8217;intégration continue pour un projet PHP&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#pnote-101-5" id="rev-pnote-101-5"&gt;5&lt;/a&gt;]&lt;/sup&gt;&amp;#160;:
&lt;br /&gt;&lt;em&gt;(je copie-colle sauvagement un bout de la présentation de chaque plugin depuis les pages wiki correspondantes &amp;#8212; cliquez sur les liens pour en savoir plus)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Green+Balls" hreflang="en"&gt;Green Balls&lt;/a&gt;&amp;#160;: Changes Hudson to use green balls instead of blue for successful builds.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/HTML+Publisher+Plugin" hreflang="en"&gt;HTML Publisher Plugin&lt;/a&gt;&amp;#160;: This plugin publishes HTML reports.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Publish+Over+SSH+Plugin" hreflang="en"&gt;Publish Over SSH Plugin&lt;/a&gt;&amp;#160;: Publish files and execute commands over SSH (SCP using SFTP)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Audit+Trail+Plugin" hreflang="en"&gt;Audit Trail Plugin&lt;/a&gt;&amp;#160;: Keep a log of who performed particular Jenkins operations, such as configuring jobs.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin" hreflang="en"&gt;Email-ext plugin&lt;/a&gt;&amp;#160;: This plugin allows you to configure every aspect of email notifications.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Instant+Messaging+Plugin" hreflang="en"&gt;Instant Messaging Plugin&lt;/a&gt;&amp;#160;: This plugin provides generic support for build notifications and a &amp;#8216;bot&amp;#8217; via instant messaging protocols.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Jabber+Plugin" hreflang="en"&gt;Jabber Plugin&lt;/a&gt;&amp;#160;: This plugin enables Jenkins to send build notifications via Jabber, as well as let users talk to Jenkins via a &amp;#8216;bot&amp;#8217; to run commands, query build status etc..&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Checkstyle+Plugin" hreflang="en"&gt;checkstyle&lt;/a&gt;&amp;#160;: This plugin generates the trend report for Checkstyle, an open source static code analysis program.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Clover+PHP+Plugin" hreflang="en"&gt;Clover PHP Plugin&lt;/a&gt;&amp;#160;: This plugin allows you to capture code coverage reports from PHPUnit.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/DRY+Plugin" hreflang="en"&gt;DRY Plugin&lt;/a&gt;&amp;#160;: This plugin generates the trend report for duplicate code checkers like CPD or Simian.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/JDepend+Plugin" hreflang="en"&gt;JDepend Plugin&lt;/a&gt;&amp;#160;: The JDepend Plugin is a plugin to generate JDepend reports for builds.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Plot+Plugin" hreflang="en"&gt;Plot Plugin&lt;/a&gt;&amp;#160;: This plugin provides generic plotting (or graphing) capabilities in Jenkins.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/PMD+Plugin" hreflang="en"&gt;PMD Plugin&lt;/a&gt;&amp;#160;: This plugin generates the trend report for PMD, an open source static code analysis program.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Task+Scanner+Plugin" hreflang="en"&gt;Task Scanner Plugin&lt;/a&gt;&amp;#160;: This plugin scans the workspace files for open tasks and generates a trend report.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Violations" hreflang="en"&gt;Violations&lt;/a&gt;&amp;#160;: This plug-in generates reports static code violation detectors such as checkstyle, pmd, cpd, findbugs, fxcop, stylecop and simian.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/xUnit+Plugin" hreflang="en"&gt;xUnit Plugin&lt;/a&gt;&amp;#160;: This plugin makes it possible to publish the test results of an execution of a testing tool in Hudson.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Phing+Plugin" hreflang="en"&gt;Phing Plugin&lt;/a&gt;&amp;#160;: This plugin allows you to use Phing to build PHP projects.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Post+build+task" hreflang="en"&gt;Post build task&lt;/a&gt;&amp;#160;: This plugin allows the user to execute a shell/batch task depending on the build log output.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Build+Keeper+Plugin" hreflang="en"&gt;Build Keeper Plugin&lt;/a&gt;&amp;#160;: Automatically keep every x builds to enable long term analysis trending when discarding old builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Et quelques autres plugins que je n&amp;#8217;utilise pas forcément, mais que je garde à l&amp;#8217;esprit, en me disant que, un jour ou l&amp;#8217;autre, il y a des chances qu&amp;#8217;ils servent &lt;em&gt;(en l&amp;#8217;occurence, ici, j&amp;#8217;ai choisi de les installer, sur la plate-forme d&amp;#8217;Intégration Continue que je met en place pour la rédaction de cet article)&lt;/em&gt;&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Performance+Plugin" hreflang="en"&gt;Performance Plugin&lt;/a&gt;&amp;#160;: This plugin allows you to capture reports from JMeter and JUnit. Hudson will generate graphic charts with the trend report of performance and robustness.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Monitoring" hreflang="en"&gt;Monitoring&lt;/a&gt;&amp;#160;: Monitoring of Hudson / Jenkins itself with JavaMelody.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/SCM+Sync+configuration+plugin" hreflang="en"&gt;SCM Sync configuration plugin&lt;/a&gt;&amp;#160;: Keep sync&amp;#8217;ed your config.xml (and other ressources) jenkins/hudson files with a SCM repository&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/WebSVN2+Plugin" hreflang="en"&gt;WebSVN2 Plugin&lt;/a&gt;&amp;#160;: This plugin integrates WebSVN Version 2 browser interface for Subversion with Hudson&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Subversion+Tagging+Plugin" hreflang="en"&gt;Subversion Tagging Plugin&lt;/a&gt;&amp;#160;: This plugin automatically performs subversion tagging (technically speaking svn copy) on successful build.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Bien entendu, à vous de personnaliser cette liste en fonction de vos besoins &amp;#8212; typiquement, si vous travaillez avec Git pour certains projets, il vous faudra installer un plugin permettant d&amp;#8217;interfacer Jenkins avec Git &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Et la série de lignes de commandes correspondant à l&amp;#8217;installation de l&amp;#8217;ensemble de ces plugins, pour ceux d&amp;#8217;entre vous qui, comme moi, préférent quelques copier-coller à une série de clicks dans une longue liste &lt;em&gt;(en n&amp;#8217;oubliant pas de redémarrer Jenkins en fin d&amp;#8217;installation, bien entendu)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;pre class="bash bash" style="font-family:monospace;"&gt;java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin greenballs
 
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin htmlpublisher
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin publish-over-ssh
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin audit-trail
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin email-ext
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin instant-messaging
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin jabber
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin checkstyle
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin cloverphp
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin dry
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin jdepend
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin plot
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin pmd
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin tasks
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin violations
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin xunit
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin phing
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin postbuild-task
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin build-keeper-plugin
 
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin performance
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin monitoring
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin scm-sync-configuration
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; install-plugin svn-tag
 
java &lt;span style="color: #660033;"&gt;-jar&lt;/span&gt; jenkins-cli.jar &lt;span style="color: #660033;"&gt;-s&lt;/span&gt; http:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;jenkins:&lt;span style="color: #000000;"&gt;8080&lt;/span&gt; safe-restart&lt;/pre&gt;


&lt;p&gt;&lt;br /&gt;
Une fois ces plugins installés, l&amp;#8217;écran &amp;#171;&amp;#160;&lt;code&gt;Administrer Jenkins&lt;/code&gt;&amp;#160;&amp;#187; s&amp;#8217;est un peu allongé&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/006-plugin-after-all-installs-01-manage.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.006-plugin-after-all-installs-01-manage_m.png" alt="006-plugin-after-all-installs-01-manage.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et ne parlons pas &lt;em&gt;(en fait, si, parlons-en ^^)&lt;/em&gt; de l&amp;#8217;écran &amp;#171;&amp;#160;&lt;code&gt;Configurer le système&lt;/code&gt;&amp;#160;&amp;#187;, qui s&amp;#8217;enrichit de la configuration d&amp;#8217;une partie des fonctionnalités offertes par les plugins que nous venons d&amp;#8217;installer&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/006-plugin-after-all-installs-02-configure.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.006-plugin-after-all-installs-02-configure_m.png" alt="006-plugin-after-all-installs-02-configure.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Configuration&amp;#160;? &lt;a name="configuration"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Maintenant que notre plate-forme d&amp;#8217;Intégration Continue Jenkins est installée, avec l&amp;#8217;ensemble des plugins dont nous aurons besoin pour nos projets PHP, il ne nous reste &lt;em&gt;plus qu&amp;#8217;à&lt;/em&gt; la configurer, avant de pouvoir passer à la mise en IC d&amp;#8217;un projet PHP.&lt;/p&gt;


&lt;h3&gt;Configuration du système &lt;a name="configuration-systeme"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Nous allons retourner sur l&amp;#8217;écran &amp;#171;&amp;#160;&lt;code&gt;Administrer Jenkins &amp;gt; Configurer le système&lt;/code&gt;&amp;#160;&amp;#187; que nous avions entre-aperçu plus haut, et passer en revue quelques éléments de configuration qui sont susceptibles d&amp;#8217;être intéressants &amp;#8212; tout en sachant que ce &lt;em&gt;intéressant&lt;/em&gt; dépend en bonne partie de vos besoin.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Tout d&amp;#8217;abord, Jenkins permet de configurer qui peut accéder à la plate-forme, comment, et quels types de manipulations sont autorisés&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/007-configure-01-security-access.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.007-configure-01-security-access_m.png" alt="007-configure-01-security-access.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En fonction de votre politique, vous choisirez de donner accès à toutes les fonctionnalités à tout utilisateur potentiel, ou vous configurez Jenkins pour que seuls les comptes &lt;em&gt;administrateurs&lt;/em&gt; puissent accéder à certaines opérations.&lt;/p&gt;


&lt;p&gt;N&amp;#8217;oubliez pas deux points, tout de même&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le succès de l&amp;#8217;Intégration Continue repose en partie sur &lt;strong&gt;l&amp;#8217;implication de l&amp;#8217;ensemble des membres de l&amp;#8217;équipe&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Si votre serveur est ouvert sur l&amp;#8217;Internet, vous ne voudrez peut-être pas &lt;em&gt;tout&lt;/em&gt; rendre public &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Si vous avez installé le plugin &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/SCM+Sync+configuration+plugin" hreflang="en"&gt;SCM Sync configuration plugin&lt;/a&gt;, vu plus haut, vous aurez la possibilité de sauvegarder la configuration de votre plate-forme d&amp;#8217;IC vers un serveur de gestion de versions&amp;#160;; cela peut potentiellement être intéressant, ne serait-ce que pour faciliter l&amp;#8217;annulation de modifications insuffisament réfléchies&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/007-configure-02-scm-sync-configuration.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.007-configure-02-scm-sync-configuration_m.png" alt="007-configure-02-scm-sync-configuration.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Ensuite, pour ceux d&amp;#8217;entre vous qui vont travailler avec des projets sous SVN, il peut être intéressant de configurer la version de SVN émulée par Jenkins &lt;em&gt;(en particulier, si vous voulez pouvoir bosser avec d&amp;#8217;autres outils sur l&amp;#8217;extraction effectuée par Jenkins)&lt;/em&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/007-configure-03-svn.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.007-configure-03-svn_m.png" alt="007-configure-03-svn.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
En fonction des projets, des équipes, de l&amp;#8217;attention que chacun porte aux mails, vous voudrez éventuellement configurer de manière un peu plus poussée le reporting par e-mails&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/007-configure-04-extended-email-notification.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.007-configure-04-extended-email-notification_m.png" alt="007-configure-04-extended-email-notification.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Notez tout de même que les notifications par e-mail pourront aussi être activées / configurées par projet.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Enfin, dans le cas où votre plate-forme Jenkins devra se connecter à d&amp;#8217;autres machines via SSH, vous voudrez probablement configurer une clef SSH pour Jenkins&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/007-configure-05-ssh-key.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.007-configure-05-ssh-key_m.png" alt="007-configure-05-ssh-key.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Exemple d&amp;#8217;utilisation&amp;#160;: pousser en SSH/SCP le résultat du build vers un serveur de reporting&amp;#160;; ou déployer à chaque intégration réussie une archive contenant le code-source correspondant à celle-ci.&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Création d&amp;#8217;un compte utilisateur &lt;a name="configuration-compte-utilisateur"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;En fonction des réglages que vous avez effectué plus haut, chaque utilisateur de la plate-forme devra peut-être se créer un compte utilisateur &amp;#8212; j&amp;#8217;ai tendance à préférer cela à un fonctionnement &lt;em&gt;anonyme&lt;/em&gt;, ne serait-ce que pour pouvoir suivre qui agit sur la plate-forme&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/008-01-must-register.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.008-01-must-register_m.png" alt="008-01-must-register.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;En l&amp;#8217;occurence, ici, j&amp;#8217;ai configuré Jenkins pour que seul les utilisateurs identifiés puissent créer / configurer des tâches.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Donc, remplissons le formulaire &amp;#8212; qui ne demande que peu de données à saisir&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/008-02-signup.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.008-02-signup_m.png" alt="008-02-signup.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et l&amp;#8217;identification devient possible&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/008-03-signed-in.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.008-03-signed-in_m.png" alt="008-03-signed-in.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Nous allons donc pouvoir passer à la création et au paramétrage d&amp;#8217;un premier &lt;em&gt;job&lt;/em&gt; &amp;#8212; dont je parlerai dans un second article, qui sera publié dans les jours à venir.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Et la CLI, alors&amp;#160;? &lt;a name="configuration-retour-cli"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Avant de terminer, je reproduis ici, à titre de curiosité, la liste des opérations qu&amp;#8217;il est maintenant possible d&amp;#8217;effectuer depuis la ligne de commandes&amp;#160;:&lt;/p&gt;

&lt;pre&gt;
$ java -jar jenkins-cli.jar -s http://jenkins:8080/ help
  build
    Builds a job, and optionally waits until its completion.
  cancel-quiet-down
    Cancel the effect of the &amp;quot;quiet-down&amp;quot; command.
  clear-queue
    Clears the build queue
  connect-node
    Reconnect to a node
  copy-job
    Copies a job
  create-job
    Creates a new job by reading stdin as a configuration XML file
  delete-builds
    Deletes build record(s)
  delete-job
    Deletes a job
  delete-node
    Deletes a node
  disable-job
    Disables a job
  disconnect-node
    Disconnects from a node
  enable-job
    Enables a job
  groovy
    Executes the specified Groovy script
  groovysh
    Runs an interactive groovy shell
  help
    Lists all the available commands
  install-plugin
    Installs a plugin either from a file, an URL, or from update center
  install-tool
    Performs automatic tool installation, and print its location to stdout. Can be only called from inside a build
  keep-build
    Mark the build to keep the build forever.
  list-changes
    Dumps the changelog for the specified build(s)
  login
    Saves the current credential to allow future commands to run without explicit credential information
  logout
    Deletes the credential stored with the login command
  mail
    Reads stdin and sends that out as an e-mail.
  offline-node
    Stop using a node for performing builds temporarily, until the next &amp;quot;online-node&amp;quot; command.
  online-node
    Resume using a node for performing builds, to cancel out the earlier &amp;quot;offline-node&amp;quot; command.
  quiet-down
    Quiet down Jenkins, in preparation for a restart. Don't start any builds.
  reload-configuration
    Discard all the loaded data in memory and reload everything from file system. Useful when you modified config files directly on disk.
  restart
    Restart Jenkins
  safe-restart
    Safely restart Jenkins
  set-build-description
    Sets the description of a build
  set-build-result
    Sets the result of the current build. Works only if invoked from within a build.
  version
    Outputs the current version
  wait-node-offline
    Wait for a node to become offline
  wait-node-online
    Wait for a node to become online
&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Si ça peut donner des idées à certains d&amp;#8217;entre vous &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Mises à jour&amp;#160;? &lt;a name="maj"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Tout comme l&amp;#8217;installation, les mises à jour sont relativement simple à effectuer.&lt;/p&gt;


&lt;h3&gt;Mise à jour de Jenkins &lt;a name="maj-jenkins"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;J&amp;#8217;ai rédigé le plus gros de cet article il y a plusieurs semaines, et, depuis, une &lt;em&gt;(au moins)&lt;/em&gt; nouvelle version de Jenkins a été publiée.
&lt;br /&gt;Si une mise à jour existe, Jenkins le signale, en haut de l&amp;#8217;écran d&amp;#8217;administration&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/500-update-01-update-available.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.500-update-01-update-available_m.png" alt="500-update-01-update-available.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Vous pourriez cliquer sur le lien pour télécharger la nouvelle version du fichier &lt;code&gt;.war&lt;/code&gt; de Jenkins, et le déployer à la main, mais, considérant que nous avons effectué notre installation en utilisant le gestionnaire de paquets de notre distribution Linux, ce serait un peu dommage&amp;#8230;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
A la place, utilisons ce gestionnaire de paquets pour installer la mise à jour&amp;#160;: tout d&amp;#8217;abord, mettons à jour la liste des paquets disponibles&amp;#160;:&lt;/p&gt;

&lt;pre class="bash bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;apt-get&lt;/span&gt; update&lt;/pre&gt;


&lt;p&gt;Et ensuite, nous pouvons soit mettre à jour l&amp;#8217;ensemble des logiciels installés sur notre serveur d&amp;#8217;Intégration Continue&amp;#160;:&lt;/p&gt;

&lt;pre class="bash bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;apt-get&lt;/span&gt; dist-upgrade&lt;/pre&gt;


&lt;p&gt;Soit ne mettre à jour que Jenkins&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#pnote-101-6" id="rev-pnote-101-6"&gt;6&lt;/a&gt;]&lt;/sup&gt;&amp;#160;:&lt;/p&gt;

&lt;pre class="bash bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sudo&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;apt-get&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;install&lt;/span&gt; jenkins&lt;/pre&gt;


&lt;p&gt;Ce qui donnerait&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/500-update-02-apt-get-install.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.500-update-02-apt-get-install_m.png" alt="500-update-02-apt-get-install.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et le numéro de version de notre plate-forme d&amp;#8217;Intégration Continue, en bas à droite de l&amp;#8217;écran, a changé&amp;#160;; ici, nous sommes passés de la version &lt;code&gt;1.424&lt;/code&gt; à la version &lt;code&gt;1.431&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/500-update-03-update-done.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.500-update-03-update-done_m.png" alt="500-update-03-update-done.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;Mise à jour des plugins &lt;a name="maj-plugins"&gt;&lt;/a&gt;&lt;/h3&gt;


&lt;p&gt;Pour ce qui est des plugins, il est aussi possible de les mettre à jour.&lt;/p&gt;


&lt;p&gt;Le plus &amp;#171;&amp;#160;simple&amp;#160;&amp;#187; est probablement d&amp;#8217;ouvrir l&amp;#8217;écran de gestion des plugins, qui affichera la liste des modules pouvant être mis à jour&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/500-update-04-plugins-updates-available.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.500-update-04-plugins-updates-available_m.png" alt="500-update-04-plugins-updates-available.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Cochez les plugins que vous souhaitez mettre à jour, cliquez sur le bouton &amp;#171;&amp;#160;&lt;code&gt;Installer&lt;/code&gt;&amp;#160;&amp;#187;, et voila, les plugins se mettent à jour &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/500-update-05-plugins-updates-working.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.500-update-05-plugins-updates-working_m.png" alt="500-update-05-plugins-updates-working.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et notez que vous pouvez même cocher la case en bas de l&amp;#8217;écran de mises à jour, pour que Jenkins redémarre tout seul après cette mise à jour, chargeant la nouvelle version des plugins&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;a href="http://blog.pascal-martin.fr/public/jenkins/500-update-06-plugins-updates-restart.png"&gt;&lt;img src="http://blog.pascal-martin.fr/public/jenkins/.500-update-06-plugins-updates-restart_m.png" alt="500-update-06-plugins-updates-restart.png" style="display:block; margin:0 auto;" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;Liens utiles &lt;a name="liens-utiles"&gt;&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Je ne peux terminer sans ajouter quelques liens, pour ceux qui voudraient en savoir plus, ou n&amp;#8217;auraient pas la patience d&amp;#8217;attendre&amp;#160;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wiki &amp;quot;utilisation&amp;quot;&amp;#160;: &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Use+Jenkins" hreflang="en"&gt;Use Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Les fiches wiki de l&amp;#8217;ensemble des plugins&amp;#160;: &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Plugins" hreflang="en"&gt;Plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Les sources de Jenkins&lt;sup&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#pnote-101-7" id="rev-pnote-101-7"&gt;7&lt;/a&gt;]&lt;/sup&gt;&amp;#160;: &lt;a href="https://github.com/jenkinsci"&gt;https://github.com/jenkinsci&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class="footnotes"&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#rev-pnote-101-1" id="pnote-101-1"&gt;1&lt;/a&gt;] Pour faire simple, le projet Hudson s&amp;#8217;est renommé en Jenkins suite à un désaccord avec Oracle &amp;#8212; et, maintenant, les deux projets ont tendance à se considérer l&amp;#8217;un-l&amp;#8217;autre comme des forks&amp;#8230;&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#rev-pnote-101-2" id="pnote-101-2"&gt;2&lt;/a&gt;] Pour ceux qui ont déjà travaillé sur des projets avec une intégration manuelle peu fréquente et difficile, l&amp;#8217;Intégration Continue est un changement agréable&amp;#160;!&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#rev-pnote-101-3" id="pnote-101-3"&gt;3&lt;/a&gt;] Je connais pas trop mal Ubuntu, que j&amp;#8217;utilise depuis plusieurs années, après avoir utilisé Debian pendant quelques années aussi&amp;#160;; ça marche pas trop mal pour un environnement de &amp;#171;&amp;#160;non-production&amp;#160;&amp;#187;&amp;#160;; il est assez facile &lt;em&gt;(indispensable pour ceux d&amp;#8217;entre-nous qui n&amp;#8217;ont pas trop l&amp;#8217;habitude de Linux)&lt;/em&gt; de trouver de la documentation et du support autour d&amp;#8217;Ubuntu&amp;#160;; et les paquets en rapport avec PHP sont à peu près à jour&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#rev-pnote-101-4" id="pnote-101-4"&gt;4&lt;/a&gt;] Si vous avez envie de vous amuser et de tester 36 plugins, libre à vous de le faire &amp;#8212; mais, éventuellement, privilégiez une installation &lt;em&gt;de test&lt;/em&gt; de Jenkins, sur une autre machine que votre vrai serveur d&amp;#8217;intégration &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#rev-pnote-101-5" id="pnote-101-5"&gt;5&lt;/a&gt;] Au pire, certains des modules installés ne seront pas utilisés pour certains projets &amp;#8212; en gardant à l&amp;#8217;esprit qu&amp;#8217;installer plein de plugins rend potentiellement plus complexe la configuration d&amp;#8217;un projet&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#rev-pnote-101-6" id="pnote-101-6"&gt;6&lt;/a&gt;] Oui, c&amp;#8217;est &lt;code&gt;apt-get install&lt;/code&gt; qui permet de mettre un jour un paquet spécifique, sans mettre à jour les autres logiciels&lt;/p&gt;
&lt;p&gt;[&lt;a href="http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#rev-pnote-101-7" id="pnote-101-7"&gt;7&lt;/a&gt;] C&amp;#8217;est de l&amp;#8217;Open Source, libre à vous de participer et d&amp;#8217;améliorer &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt; et l&amp;#8217;hébergement sur GitHub devrait vous aider à le faire &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=OM-F9t_g9CM:Unr5cdmasUU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=OM-F9t_g9CM:Unr5cdmasUU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=OM-F9t_g9CM:Unr5cdmasUU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=OM-F9t_g9CM:Unr5cdmasUU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=OM-F9t_g9CM:Unr5cdmasUU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=OM-F9t_g9CM:Unr5cdmasUU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=OM-F9t_g9CM:Unr5cdmasUU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=OM-F9t_g9CM:Unr5cdmasUU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#comment-form</comments>
      <wfw:comment>http://blog.pascal-martin.fr/post/integration-continue-jenkins-installation-configuration#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pascal-martin.fr/feed/atom/comments/101</wfw:commentRss>
      </item>
    
  <item>
    <title>Slides de ma conférence "Ligne de commandes sous Linux : effrayant ? Non : indispensable !" au Forum PHP 2010</title>
    <link>http://blog.pascal-martin.fr/post/slides-forum-php-2010-ligne-de-commandes-sous-linux-effrayant-non-indispensable</link>
    <guid isPermaLink="false">urn:md5:866792ce8aa8c24a67e3ba0cab2afa66</guid>
    <pubDate>mar., 16 nov. 2010 08:00:00 +0100</pubDate>
    <dc:creator>Pascal MARTIN</dc:creator>
        <category>Développement Web</category>
        <category>afup</category><category>conference</category><category>php</category>    
    <description>&lt;p&gt;Mardi 9 et mercredi 10 novembre avait lieu, à Paris, le &lt;a href="http://afup.org/pages/forumphp2010/" hreflang="fr"&gt;Forum PHP 2010, organisé par l&amp;#8217;AFUP&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;J&amp;#8217;y ai donné une conférence intitulée &amp;quot;&lt;a href="http://afup.org/pages/forumphp2010/sessions.php#451"&gt;Ligne de commande sous Linux&amp;#160;: effrayant&amp;#160;? Non&amp;#160;: indispensable&amp;#160;!&lt;/a&gt;&amp;quot;.
&lt;br /&gt;Voici les slides que j&amp;#8217;ai utilisé comme support lors de cette présentation&amp;#160;:&lt;/p&gt;

&lt;div class="noExternalLink" style="width: 100%; display: block; text-align: center;"&gt;
    &lt;div style="width:100%;text-align:center" id="__ss_2504359"&gt;
        &lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/pascalmartin/ligne-de-commandes-sous-linux-effrayant-non-indispensable" title="Ligne de commandes sous Linux : effrayant ? Non : indispensable !"&gt;
            Ligne de commandes sous Linux&amp;#160;: effrayant&amp;#160;? Non&amp;#160;: indispensable&amp;#160;!
        &lt;/a&gt;
        &lt;object style="margin:0px" width="425" height="355" type="application/x-shockwave-flash" data="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ligne-de-commandes-sous-linux-pmartin-forum-php-2010-101110061043-phpapp01&amp;amp;stripped_title=ligne-de-commandes-sous-linux-effrayant-non-indispensable&amp;amp;userName=pascalmartin"&gt;
            &lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ligne-de-commandes-sous-linux-pmartin-forum-php-2010-101110061043-phpapp01&amp;amp;stripped_title=ligne-de-commandes-sous-linux-effrayant-non-indispensable&amp;amp;userName=pascalmartin" /&gt;
            &lt;param name="allowFullScreen" value="true" /&gt;
            &lt;param name="allowScriptAccess" value="always" /&gt;
            
            
        &lt;/object&gt;
        &lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;
            View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; 
            from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/pascalmartin"&gt;Pascal MARTIN&lt;/a&gt;.
            &lt;br /&gt;(tags: 
            &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/php"&gt;php&lt;/a&gt;,
            &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/afup"&gt;afup&lt;/a&gt;,
            &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/forumphp"&gt;forumphp&lt;/a&gt;
            )
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;br /&gt;
Vous pouvez aussi directement télécharger le &lt;a href="http://blog.pascal-martin.fr/public/forum-php-paris-2010/ligne-de-commandes-sous-linux-pmartin-forum-php-2010.pdf"&gt;fichier PDF correspondant&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Bonne lecture&amp;#160;!&lt;/p&gt;


&lt;p&gt;Les slides des autres conférences ont été mis en ligne &lt;a href="http://afup.org/pages/forumphp2010/resumes.php" hreflang="fr"&gt;sur le site de l&amp;#8217;AFUP&lt;/a&gt;.
&lt;br /&gt;Et vous pouvez poster des commentaires sur l&amp;#8217;ensemble des conférences sur &lt;a href="http://joind.in/event/view/446"&gt;Joind.in&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Et, au passage, le photos de ces deux journées ont commencé à apparaitre sur flickr&amp;#160;: &lt;a href="http://www.flickr.com/groups/forumphp/pool/"&gt;Photos du groupe Forum PHP&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=vPBmIe8YO7w:llxUFWJzjfw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=vPBmIe8YO7w:llxUFWJzjfw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=vPBmIe8YO7w:llxUFWJzjfw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=vPBmIe8YO7w:llxUFWJzjfw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=vPBmIe8YO7w:llxUFWJzjfw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=vPBmIe8YO7w:llxUFWJzjfw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=vPBmIe8YO7w:llxUFWJzjfw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=vPBmIe8YO7w:llxUFWJzjfw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.pascal-martin.fr/post/slides-forum-php-2010-ligne-de-commandes-sous-linux-effrayant-non-indispensable#comment-form</comments>
      <wfw:comment>http://blog.pascal-martin.fr/post/slides-forum-php-2010-ligne-de-commandes-sous-linux-effrayant-non-indispensable#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pascal-martin.fr/feed/atom/comments/100</wfw:commentRss>
      </item>
    
  <item>
    <title>Forum PHP 2010, les 9 &amp; 10 novembre : j'y serai !</title>
    <link>http://blog.pascal-martin.fr/post/forum-php-2010-j-y-serai</link>
    <guid isPermaLink="false">urn:md5:cdcd8fa5ea224f9fd36440694d406f0c</guid>
    <pubDate>lun., 13 sept. 2010 13:00:00 +0200</pubDate>
    <dc:creator>Pascal MARTIN</dc:creator>
        <category>Développement Web</category>
        <category>afup</category><category>forum-php</category><category>php</category>    
    <description>&lt;p&gt;Cette année, le &lt;strong&gt;Forum PHP&lt;/strong&gt; organisé par l&amp;#8217;AFUP aura lieu les&lt;strong&gt; 9 et 10 novembre à la Cité des Sciences et de l&amp;#8217;Industrie à Paris&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Il sera organisé autour de quatre thèmes directeurs&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP de A à Z&lt;/strong&gt;&amp;#160;: Débuter en PHP, Réussir un projet avec PHP, Choisir son hébergement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les outils basés sur PHP&lt;/strong&gt;&amp;#160;: Drupal , outils de e-commerce et de business, CRM et ERP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L&amp;#8217;industrialisation de PHP&lt;/strong&gt;&amp;#160;: Performances, tests, authentification centralisée, frameworks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technologies autour de PHP&lt;/strong&gt;&amp;#160;: HTML 5, référencement&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Cette année, j&amp;#8217;animerai une session intitulée &lt;a href="http://afup.org/pages/forumphp2010/sessions.php#451"&gt;Ligne de commande sous Linux&amp;#160;: effrayant&amp;#160;? Non&amp;#160;: indispensable&amp;#160;!&lt;/a&gt;, qui s&amp;#8217;inscrit dans le premier de ces quatre thèmes.&lt;/p&gt;


&lt;p&gt;Pour résumer en quelques mots&amp;#160;: nos applications PHP sont souvent déployées sur des serveurs Linux &amp;#8212; et nous savons tous que, un jour ou l&amp;#8217;autre, nous aurons besoin de nous connecter à ce serveur&amp;#8230;
&lt;br /&gt;Alors, pourquoi ne pas anticiper, et découvrir quelques commandes qui vous seront forcément utiles un jour ou l&amp;#8217;autre&amp;#160;?&lt;/p&gt;



&lt;p&gt;&lt;br /&gt;
Pour les conférences auxquelles je pense assister, je n&amp;#8217;ai pas encore fait un choix définitif, mais une première pré-selectionne me donne au moins celles-ci&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/sessions.php#472" hreflang="en"&gt;PHP, son ecosystème&amp;#160;: passé, présent et futur&lt;/a&gt;&amp;#160;: forcément, la conférence donnée par Rasmus Lerdorf, je pense que tout le monde y assistera &amp;#8212; surtout qu&amp;#8217;il n&amp;#8217;y en n&amp;#8217;aura pas d&amp;#8217;autre en parallèle.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/sessions.php#408" hreflang="en"&gt;PHP inside&lt;/a&gt;, par curiosité, ou &lt;a href="http://afup.org/pages/forumphp2010/sessions.php#441" hreflang="fr"&gt;Les revues de code ou comment faire fructifier son capital humain&lt;/a&gt;, qui se rapproche de ce que j&amp;#8217;ai parfois l&amp;#8217;occasion de faire au bureau.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/deroulement.php" hreflang="fr"&gt;Plein phar&amp;#160;!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/deroulement.php" hreflang="fr"&gt;Migration d&amp;#8217;une base de code de subversion vers git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/sessions.php#445" hreflang="fr"&gt;Optimisation des performances LAMP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/deroulement.php" hreflang="fr"&gt;Un site web performant, tout est dans le réseau et le navigateur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/deroulement.php" hreflang="fr"&gt;Analyse statistique du code - Écoutez votre code PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/deroulement.php" hreflang="fr"&gt;HTML 5&amp;#160;: prêt à l&amp;#8217;usage&amp;#160;?&lt;/a&gt; ou &lt;a href="http://afup.org/pages/forumphp2010/deroulement.php" hreflang="fr"&gt;Windows et PHP&amp;#160;: Un couple qui évolue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/deroulement.php" hreflang="fr"&gt;APC &amp;amp; Memcached the High Performance Duo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enfin, bref, encore une fois, un lot de conférences intéressantes &amp;#8212; et le choix final va encore être difficile, dans certains cas &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/p&gt;


&lt;p&gt;&lt;br /&gt;
Et, pour finir, voici quelques liens susceptibles d’intéresser ceux qui hésitent encore&amp;#160;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/deroulement.php"&gt;Le planning des conférences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/sessions.php"&gt;Le détail des sessions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://afup.org/pages/forumphp2010/conferenciers.php"&gt;La liste des conférenciers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Et, bien sûr, &lt;a href="http://afup.org/pages/forumphp2010/inscription.php"&gt;la page d&amp;#8217;inscription&lt;/a&gt; &lt;img src="/themes/default/smilies/wink.png" alt=";-)" class="smiley" /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je suppose que cela sera l’occasion de croiser certains d’entre vous&amp;#160;; à bientôt, donc&amp;#160;!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=KCqEyaZGDok:UpOKzByd9Zg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=KCqEyaZGDok:UpOKzByd9Zg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=KCqEyaZGDok:UpOKzByd9Zg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=KCqEyaZGDok:UpOKzByd9Zg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=KCqEyaZGDok:UpOKzByd9Zg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=KCqEyaZGDok:UpOKzByd9Zg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?i=KCqEyaZGDok:UpOKzByd9Zg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/pascal-martin?a=KCqEyaZGDok:UpOKzByd9Zg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/pascal-martin?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.pascal-martin.fr/post/forum-php-2010-j-y-serai#comment-form</comments>
      <wfw:comment>http://blog.pascal-martin.fr/post/forum-php-2010-j-y-serai#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.pascal-martin.fr/feed/atom/comments/99</wfw:commentRss>
      </item>
    
</channel>
</rss>

