III. Analyse d'un projet▲
III-A. Prérequis▲
Sonar est capable d'analyser des projets de différents langages.
- Java
- C
- C#
- PHP
- Cobol (plugin commercial)
- Natural (plugin commercial)
- PL/SQL (plugin commercial)
- Flex
- Visual Basic 6 (plugin commercial)
- JavaScript
- XML
- Groovy
- JSP et JSF
Dans la suite de cet article, nous nous concentrerons plus particulièrement sur l'analyse de projets Java. Pour connaître la procédure nécessaire à l'analyse d'un projet autre que Java, il suffit de se référer à la documentation du plugin gérant ce langage. À noter que les résultats et fonctionnalités proposées par Sonar sont généralement indépendants du langage, et donc ce qui sera par la suite expliqué sur l'analyse des projets Java est généralement vrai pour les analyses des autres projets.
Concernant l'analyse d'un projet Java en elle-même, elle peut être réalisée de trois façons :
III-B. Utilisation du plugin Java▲
Si votre projet utilise déjà Maven 2 ou 3, le plus simple est de faire appel au plugin Maven de Sonar. La première chose à faire est de définir quelques paramètres Maven à placer de préférence dans son fichier settings.xml. Nous redéfinissons là les paramètres de connexion à la base de données, ainsi que l'URL du serveur Sonar.
...
<profile>
<id>
sonar</id>
<activation>
<activeByDefault>
true</activeByDefault>
</activation>
<properties>
<sonar.jdbc.url>
jdbc:mysql://localhost:3306/sonar?useUnicode=true&
characterEncoding=utf8</sonar.jdbc.url>
<sonar.jdbc.driver>
com.mysql.jdbc.Driver</sonar.jdbc.driver>
<sonar.jdbc.username>
sonar</sonar.jdbc.username>
<sonar.jdbc.password>
sonar</sonar.jdbc.password>
<!-- La ligne ci-dessous n'est utile que si le port par défaut (9000) est modifié dans le fichier de configuration. -->
<sonar.host.url>
http://url-serveur:1234</sonar.host.url>
</properties>
</profile>
...
Il suffit ensuite de lancer la commande suivante :
mvn sonar:sonar
Il est recommandé de réaliser une installation des artefacts Maven de son projet avant (surtout dans le cas d'un projet multimodules). Nous procéderons ainsi (on notera que les tests sont ignorés lors de la première commande, car ils seront exécutés par le plugin Sonar) :
mvn clean install -Dtest=false -DfailIfNoTests=false
mvn sonar:sonar
Si la commande précédente ne peut être utilisée, ou que l'on souhaite réaliser l'analyse en une seule commande Maven, on privilégiera la commande suivante, ce qui aura toutefois l'inconvénient d'exécuter les tests deux fois :
mvn clean install sonar:sonar -Dmaven.test.failure.ignore=true
Une fois cette commande exécutée, il sera possible de consulter l'analyse en se rendant sur le serveur de Sonar.
III-C. Utilisation d'une tâche Ant▲
Pour lancer une analyse Sonar en utilisant Ant, il est nécessaire de disposer des versions au moins égales à 1.7.1 d'Ant, 1.5 de Java et 2.8 de Sonar.
Il faut ensuite télécharger la tâche Ant ici, puis déclarer cette tâche dans son script Ant :
...
<!-- Ajout de la tâche Sonar pour Ant. -->
<taskdef
uri
=
"antlib:org.sonar.ant"
resource
=
"org/sonar/ant/antlib.xml"
>
<!-- Cette librairie peut aussi être ajoutée dans le répertoire ${ANT_HOME\}/lib -->
<!-- Dans ce cas, le node classpath ci-dessous est inutile. -->
<classpath
path
=
"path/to/sonar/ant/task/lib"
/>
</taskdef>
<!-- Propriétés propres à Sonar, par exemple pour MySQL : -->
<property
name
=
"sonar.jdbc.url"
value
=
"jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8"
/>
<property
name
=
"sonar.jdbc.driverClassName"
value
=
"com.mysql.jdbc.Driver"
/>
<property
name
=
"sonar.jdbc.username"
value
=
"sonar"
/>
<property
name
=
"sonar.jdbc.password"
value
=
"sonar"
/>
<!-- Et dans le cas où le serveur se trouve sur une autre machine -->
<property
name
=
"sonar.host.url"
value
=
"http://url-serveur:1234"
/>
...
On définira ensuite une target Ant dans son script :
<project
name
=
"Mon projet"
>
<!-- Définition de la tâche Sonar pour Ant. -->
<taskdef
uri
=
"antlib:org.sonar.ant"
resource
=
"org/sonar/ant/antlib.xml"
>
<classpath
path
=
"path/to/sonar/ant/task/lib"
/>
</taskdef>
<!-- Ajout de la cible Ant -->
<target
name
=
"sonar"
>
<!-- On définit les propriétés obligatoires pour Sonar -->
<property
name
=
"sonar.sources"
value
=
"list of source directories separated by a comma"
/>
<!-- On définit les propriétés optionnelles pour Sonar -->
<property
name
=
"sonar.projectName"
value
=
"this value overrides the name defined in Ant root node"
/>
<property
name
=
"sonar.binaries"
value
=
"list of directories which contain for example the Java bytecode"
/>
<property
name
=
"sonar.tests"
value
=
"list of test source directories separated by a comma"
/>
<property
name
=
"sonar.libraries"
value
=
"list of paths to libraries separated by a comma (These libraries are for example used by the Sonar Findbugs plugin)"
/>
...
<
sonar
:
sonar
key
=
"org.example:example"
version
=
"0.1-SNAPSHOT"
xmlns
:
sonar
=
"antlib:org.sonar.ant"
/>
</target>
</project>
Une fois ceci fait, il suffit de lancer la commande suivante pour lancer l'analyse :
ant sonar
Il est possible d'analyser de cette façon des projets multimodules. Pour ce faire, on se rendra sur la page wiki dédiée de Sonar.
III-D. Utilisation de l'exécuteur Java▲
La dernière possibilité pour analyser un projet Java est de passer par un exécuteur Java. Cela nécessite Java 1.5 et Sonar 2.6. Il faut ensuite télécharger l'exécuteur Java, disponible ici.
Pour analyser un projet, il faut créer un fichier appelé sonar-project.properties, dont le contenu sera le suivant :
# Métadonnées du projet.
sonar.projectKey=my:project
sonar.projectName=My project
sonar.projectVersion=1.0
# Chemin vers les sources (obligatoire).
sources=srcDir1,srcDir2
# Chemin vers les sources de test (optionnel).
tests=testDir1,testDir2
# Chemin vers les binaires du projet (optionnel).
binaries=binDir
# Chemin vers les librairies du projet (optionnel).
libraries=junit.jar
# Décommenter ces lignes si le projet utilise des spécificités de Java 1.5 ou 1.6
#sonar.java.source=1.5
#sonar.java.target=1.5
# Décommenter cette ligne dans le cas où le projet n'est pas un projet Java.
# Dans ce cas, il faut indiquer de quelle nature est le projet (ici Cobol).
#sonar.language=cobol
# Paramètres avancés, spécifiques au projet.
my.property=value
Une fois tout ceci configuré, il suffira de lancer la commande suivante pour analyser le projet :
sonar-runner
III-E. Automatisation▲
Nous venons de voir comment lancer l'analyse Sonar manuellement. Mais il est bien plus profitable de faire réaliser cette tâche automatiquement, grâce à un outil d'intégration continue. Parmi les serveurs d'intégration continue les plus connus, on citera :
- Jenkins ou Hudson (à lire mon article sur cet outil ici) ;
- Bamboo ;
- Cruise Control ;
- Et bien d'autres encore...
Sonar propose des plugins pour Jenkins / Hudson, Bamboo ou AnthillPro, offrant ainsi une meilleure interaction des outils.
Nous voyons ici la configuration de notre serveur Sonar depuis l'interface Jenkins / Hudson :