I. Préambule

I-A. Présentation

Sonar est un outil d'analyse qualitative de code, à l'origine créé pour Java, il supporte depuis bien d'autres langages (C, C++,C#, JavaScript, Python…) et notamment PHP qui va nous intéresser ici.

Cet outil permet entre autres de détecter des erreurs d'inattention telles que des variables oubliées, des paramètres de fonction inutilisés, ou encore des parties de codes qui ne s'exécutent jamais.

À l'issue de ce tutoriel, vous serez capable d'installer et de configurer Sonar pour analyser un projet PHP au sein d'un environnement GNU/Linux comme Debian ou Ubuntu.

I-B. Résultats attendus

Pour vous donner une idée de ce que Sonar peut faire, voici quelques exemples d'analyse concrets.

I-B-1. Variable non utilisée

Image non disponible

I-B-2. Paramètre non utilisé

Image non disponible

I-B-3. Code non exécutable

Image non disponible

I-B-4. Condition vide

Image non disponible

I-B-5. On peut voir les sources à tout moment

Image non disponible

II. L'installation

II-A. Le serveur Sonar

Il existe deux moyens d'installer Sonar (en téléchargeant les archives, ou via le gestionnaire de paquets).

Nous choisirons ici la seconde solution (plus simple).

Nous commençons par ajouter le dépôt de Sonar à notre fichier /etc/apt/sources.list :

 
Sélectionnez
deb http://downloads.sourceforge.net/project/sonar­pkg/deb binary/

Mettons ensuite à jour notre cache (pour prendre en compte ce nouveau dépôt) :

 
Sélectionnez
sudo apt­get update

Installons ensuite le paquet sonar :

 
Sélectionnez
sudo apt­get install sonar

Lançons ensuite celui-­ci :

 
Sélectionnez
sudo /etc/init.d/sonar start

Rendez-vous à l'adresse http://localhost:9000 (il faut attendre quelques instants avant que l'URL ne soit accessible : le temps que Sonar ai fini de démarrer).

II-B. Installons le support du PHP

Image non disponible
 
Sélectionnez
sudo /etc/init.d/sonar restart

Le plugin PHP pour Sonar nécessite l'installation de librairies PHP pour pouvoir fonctionner :

Installons d'abord PEAR :

 
Sélectionnez
sudo apt-get install php-pear

Mettons-le à jour :

 
Sélectionnez
pear upgrade pear

Ajoutons-y les dépôts nécessaires pour cet article :

 
Sélectionnez
pear channel-discover pear.phpunit.de
pear channel-discover pear.symfony-project.com
pear install phpunit/PHPUnit-3.5.5

Installons PHPDepend :

 
Sélectionnez
pear channel-discover pear.pdepend.org
pear install pdepend/PHP_Depend-1.0.3
				

Installons PHPMD :

 
Sélectionnez
pear channel-discover pear.phpmd.org
pear install --alldeps phpmd/PHP_PMD-1.3.2
				

Et enfin, PHP CodeSniffer :

 
Sélectionnez
pear install PHP_CodeSniffer­1.3.2

Une fois toutes ces dépendances installées, ouvrez votre navigateur à l'URL http://localhost:9000.

Cliquez sur « Log in » et authentifiez-vous avec le couple admin/admin :

Image non disponible

Puis cliquez sur le lien « configuration » (en haut), puis « Update Center » dans le menu de gauche :

Image non disponible

Cliquez sur l'onglet « available plugins » :

Image non disponible

Cliquez sur « php » puis sur le bouton « install » :

Image non disponible

Vous devez ensuite redémarrer Sonar pour terminer l'installation de l'analyseur PHP.

II-C. La partie « runner »

La partie « serveur » est installée, il nous faut désormais installer le « runner » (la partie qui analysera le code).

Téléchargez l'archive du runner à l'adresse http://www.sonarsource.org/downloads/ et décompressez l'archive dans le répertoire bin de votre home et renommez-le en sonar­runner (/home/mika/bin/sonar­runner).

III. Paramétrage de l'analyse

En retournant sur http://localhost:9000, après s'être authentifié en tant qu'admin, retournons dans la rubrique « configuration ».

Cette page est le tableau de bord de l'application.

Image non disponible

Sonar fonctionne avec des règles à paramétrer. Par défaut, il est livré avec une série de profils déjà paramétrés, vous avez également la possibilité de créer vos propres profils (on y revient après).

IV. Paramétrage du projet

Dernière étape : paramétrer le projet à analyser.

Créez un fichier sonar­project.properties dans le répertoire de l'application PHP à analyser.

Ce fichier ressemble à ceci :

 
Sélectionnez
# required metadata 
sonar.projectKey=my:project 
sonar.projectName=My project 
sonar.projectVersion=1.0 
# path to source directories (required) 
sources=srcDir1,srcDir2 
# path to test source directories (optional) 
tests=testDir1,testDir2 
# path to project binaries (optional), for example directory of Java bytecode 
binaries=binDir 
# optional comma­separated list of paths to libraries. Only path to JAR file and path to directory of classes are 
supported. 
libraries=path/to/library.jar,path/to/classes/dir 
# Uncomment this line to analyse a project which is not a java project. 
# The value of the property must be the key of the language. 
#sonar.language=cobol

Par exemple : ici on va tester le code des librairies PHP du mkframeworkMkFramework, on va créer ce fichier dans le répertoire du framework dans /home/mika/www/mkframework/

 
Sélectionnez
sonar.projectKey=my:mkframework 
sonar.projectName=mkframework 
sonar.projectVersion=1.0 
# path to source directories (required) 
sources=lib/framework 
# Uncomment this line to analyse a project which is not a java project. 
# The value of the property must be the key of the language. 
sonar.language=php 
sonar.phpUnit.skip=true

Note : j'ai désactivé la vérification de phpUnit, car je ne l'utilise pas pour mes tests unitaires.

V. L'analyse

Il n'y a plus qu'à lancer l'analyse à partir du répertoire où est situé le fichier sonar­project.properties.

 
Sélectionnez
cd /home/mika/www/mkframework/ 
/home/mika/bin/sonar­runner/bin/sonar­runner

L'analyseur va tourner pendant un bon moment, une fois qu'il aura terminé, vous pourrez retourner sur la page web de Sonar.

Image non disponible
Image non disponible

Sonar va vous informer des variables, fonctions ou méthodes non utilisées, de quelques erreurs de conceptions, identifier les méthodes jugées complexes… en somme vous analysez votre code en vous permettant de l'améliorer.

Libre à vous de prendre en compte ou non ces remarques.

VI. Créer son profil de paramétrage

En plus de pouvoir basculer entre les différents profils proposés (Sonar Way, Zend…), vous pouvez créer votre propre profil.

Tout l'intérêt de Sonar est là : toutes les règles disponibles ne sont pas forcément pertinentes pour votre projet ou votre usage.

Image non disponible

Saisissez le nom de votre profil :

Image non disponible

Cliquez sur votre profil qui apparaît désormais dans la liste.

Image non disponible

Ici vous avez un bloc de recherche permettant de filtrer les différentes règles disponibles.

Image non disponible

Une fois vos recherches lancées, vous n'avez plus qu'à cocher les règles qui vous intéressent (pas besoin de sauvegarder).

Ainsi vous pourrez à présent lancer Sonar sur votre profil, le plus simple étant de définir votre profil en tant que profil par défaut.

Image non disponible

VII. Le mieux est l'ennemi du bien

Attention à une chose : en voulant bien faire, souvent on a tendance à choisir la facilité.
Vous trouvez qu'une méthode est trop longue et vous vous dites « ok je vais la scinder en deux » mais Sonar va lever une alerte. De fait, corriger certaines alertes peut paradoxalement faire baisser la note du projet, car ces corrections peuvent apporter davantage de complexité au projet.

Il vous appartient de trouver un compromis acceptable entre la qualité de votre code et ses performances.

VIII. Conclusion

Vous avez pu apprécier ici les subtilités qui font le charme de cet outil très puissant qu'est Sonar.

C'est un outil de qualité qui prouvera son utilité lors de toutes les étapes de vos projets. Il vous permet de vous assurer du respect des bonnes pratiques de programmation dans votre code et vous aide à y faire le ménage en vous facilitant l'identification de variables ou de traitements inutiles.

Je l'utilise régulièrement pour auditer le code de mon framework personnel (le mkframeworkmkFramework) ce qui me permet d'avoir un avis objectif sur la qualité de mon code.

IX. Remerciements

Pour ce tutoriel, je souhaite remercier f-lebf-leb pour sa correction orthographique , Benjamen DelespierreBenjamen Delespierre pour sa validation technique, DeepinDeepin pour sa gestion et Zoom61Zoom61 pour son soutien.