Categorie planetubuntu > zoom sur Sonar, l'analyseur de code, dans le cas du Php
zoom sur Sonar, l'analyseur de code, dans le cas du Php
2013-05-09
Introduction
Sonar est un outil d'analyse qualitative de code, à l'origine créé pour du java, il permet depuis d'y installer des plugins pour gérer beaucoup de langages (C, C++,C#,Javascript,Python...) et notamment php qui va nous interesser ici
L'installation
Il y a deux moyens d'installer sonar: le premier en téléchargeant les éléments sur le site, le second en passant par le gestionnaire de paquets (plus simple :)
Nous commençons par ajouter le dépot de sonar "deb http://downloads.sourceforge.net/project/sonar-pkg/deb binary/" à notre fichier /etc/apt/sources.list (sans les guillemets)
Mettez ensuite à jour votre cache (pour prendre en compte ce nouveau dépot)
sudo apt-get update
Installons ensuite le paquet sonar
sudo apt-get install sonar
Lançons ensuite celui-ci :
sudo /etc/init.d/sonar start
Rendez vous à l'adresse localhost:9000 (il faut attendre une bonne quelques instants avant que l'url ne soit accessible (le temps que sonar ai fini de démarrer)
Installons le support du PHP
Ouvrez votre navigateur sur http://localhost:9000
Cliquez sur "log in" et authentifiez vous avec le couple admin/admin,


cliquez sur l'onglet available plugins

cliquez sur "php" puis sur le bouton "install"

Sonar nécessite un redémarrage pour prendre en compte PHP

sudo /etc/init.d/sonar restart
La partie php nécessite l'installation d'outil php pour pouvoir fonctionner:
Installons d'abord PEAR
sudo apt-get install php-pear
pear upgrade pear
pear channel-discover pear.phpunit.de pear channel-discover pear.symfony-project.com pear install phpunit/PHPUnit-3.5.5
Installons PHPDepend
pear channel-discover pear.pdepend.org pear install pdepend/PHP_Depend-1.0.3
Installons PHPMD
pear channel-discover pear.phpmd.org pear install --alldeps phpmd/PHP_PMD-1.3.2
PHP CodeSniffer
pear install PHP_CodeSniffer-1.3.2
La partie serveur est installée, il nous faut désormais installer le "runner" (la partie qui analysera le code)
Télécharger l'archive du runner et décompressez-la dans un de vos répertoires, par exemple nous créerons ici le répertoire bin (dans notre répertoire home) et nous le renommons en sonar-runner ( /home/mika/bin/sonar-runner)
Paramétrage de l'analyse
En retournant sur localhost:9000, après s'être logué en tant qu'admin, on refait un tour dans la rubrique "configuration"

Sonar fonctionne avec des règles à paramétrer, par défaut l'outil vient avec une série de "profile" déjà paramétré, vous avez également la possibilité de créer votre propre profil (on y revient après)
Paramétrage du projet
Il reste une dernière étape avant de lancer l'analyse: le paramétrage de celui-ci pour le projet à analyser.
Créer un fichier "sonar-project.properties" dans le répertoire de l'application php à analyser
Ce fichier ressemble à ceci:
# 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 mkframework, on va créer ce fichier dans le répertoire du framework dans /home/mika/www/mkframework/
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
L'analyse
Plus qu'à lancer l'analyse à partir du répertoire où est situé le fichier sonar-project.properties
cd /home/mika/www/mkframework/ /home/mika/bin/sonar-runner/bin/sonar-runner
L'analyzer va tourner pendant un bon moment, une fois qu'il aura terminé, vous pourrez retourner sur la page web de sonar


Sonar va vous informer des variables/fonctions/méthodes non utilisées, de quelques erreurs de conceptions, identifier les méthodes jugées complexes... en clair vous analyser votre code en vous permettant de l'améliorer
Libre à vous de prendre en compte ou non ces remarques :)
Créer son profil de paramétrage
Déjà que vous pouvez switcher entre les différents profils proposés (sonar way,zend...) vous pouvez en plus créer votre propre profil.
Tout l'intérêt de sonar est ici: toutes les règles disponibles ne sont pas forcément pertinentes dans votre projet/pour votre société.
Dans Sonar on peut créer des profils

Saisissez le nom de votre profil

Cliquez sur votre profil qui apparait désormais dans la liste

Ici vous avez un block de recherche permettant de filtrer les differentes règles disponibles

Une fois vos recherches lancées, vous n'avez plus qu'a cocher les règles qui vous intérèssent (pas besoin de sauvegarder)
Ainsi vous pourrez à present lancer sonar sur votre profil, le plus simple étant de définir votre profil "par défaut"

Avec Sonar, quelque fois le mieux est l'énemi du bien
Attention à une chose: en voulant bien faire, souvent on à tendance à choisir la facilité: une méthode trop longue ? ok je vais la factoriser en deux, oui mais l'outil de contrôle de complexité va lever une alerte, tout ça pour dire que des fois avec sonar, en corrigeant des alertes, on se retrouve à diminuer sa note ;)
Il ne faut alors pas se décourager et essayer plusieurs méthodes différentes pour arriver a obtenir un code toujours plus performant et le plus succint possible. :)
Conclusion
Vous avez pu apprécier ici les subtilités qui font le charme de cet outil très puissant qu'est Sonar.
Je l'utilise personnellement régulièrement pour auditer le code de mon framework, cela permet d'avoir un "relecteur" objectif ;)