Plugin Sonar Hudson-Jenkins

De EjnTricks

Le plugin SonarQube Plugin permet d'exécuter des analyses SonarQube depuis des process Jenkins. Cet article présente la mise en place du plugin ainsi que sa configuration pour l'utilisation sur les projets.

Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Run-icon.png Version 2.4

A partir de la version 5.3 de SonarQube, un système de token a été mis en place pour les comptes utilisateurs. Il n'est plus nécessaire de spécifier le login et mot de passe du compte utilisé pour les analyses. De plus, la version 2.4 du plugin a été modifié pour proposer de nouveaux paramétrages. La mise en place de cette version nécessite donc de reconfiguré Jenkins afin de référencer les serveurs SonarQube.

User-icon.png Compte analyse

Il faut donc dans un premier temps configurer le compte pour effectuer les analyses. Dans le cadre de cette installation, le compte Sonar Analyze Runner a été mis en place. La définition des comptes est accéssible depuis la section Security → User de l'Administration.


Un token doit être généré pour le compte Sonar Analyze Runner, en cliquant sur l'icône dans la colonne Token.


En cliquant sur l'icône, la gestion des tokens pour cet utilisateur est présenté.


Il suffit de spécifier un nom, par exemple Jenkins Runner, et de cliquer sur le bouton Generate. Une valeur est alors générée et stockée pour cet utilisateur.


La valeur doit être récupérée pour la spécifier lors de la configuration sous Jenkins. Le bouton Copy permet de placer la valeur dans le presse papier.

System-Install-icon.png Installation

Il faut configurer l'instance SonarQube au niveau de Jenkins. Pour cela, il faut accéder à la section SonarQube dans la page Administration → Configurer le système. Dans le cadre de cet article, une instance de SonarQube est installée.


Il faut cliquer sur le bouton Ajouter une installation SonarQube pour ajouter un serveur SonarQube.


Les paramètres de configuration sont les suivants.

Paramètre Valeur
Nom Nom de l'instance.

Utilisé uniquement pour Jenkins afin d'identifier l'instance.

URL du serveur URL d'accès à l'instance SonarQube.
Server version Version de l'instance SonarQube.

Le choix dans cette liste conditionne les éléments de configuration pour le compte d'analyse. Dans le cadre de ce chapitre, une version supérieure ou égale à 5.3 est utilisée et seul le champ Server authentication token devient disponible.

Server authentication token Token d'accès pour l'exécution de l'analyse.

La valeur générée pour le compte doit être utilisée.

Configuration-icon.png Activation

Une fois la configuration mise en place, il faut cocher la case Enable injection of SonarQube server configuration as build environment variables afin de la rendre disponible au niveau des process Jenkins.

Icon-Configuration-Settings.png Configuration projets

Afin de pouvoir déclencher une analyse, il est nécessaire de rendre disponible les paramètres de configuration sur le projet. Dans la section Environnements de Build, il faut cocher la case Preparer l'environement pour SonarQube Scanner. Ainsi, les variables sont disponibles comme mentionné dans l'aide, affichable en cliquant sur l'icône en forme de point d'interrogation.


Une fois disponibles, les variables sont utilisables. Comme expliquer pour la version Version 2.3, il y a plusieurs modes de configuration possibles. Un seul choix est sélectionner à présent, qui est d'utiliser une cible Maven, avec les paramètres suivants.

sonar.host.url=$SONAR_HOST_URL
sonar.login=$SONAR_AUTH_TOKEN

Les valeurs injectées sont les suivantes.

Injection Objectif
$SONAR_HOST_URL URL d'accès à l'instance SonarQube.
$SONAR_AUTH_TOKEN Token généré pour exécuter l'analyse.

Attention le token doit être lié à un compte qui possède les droits suffisants pour exécuter une analyse sur le projet.

Dans le cadre des branches, il est possible d'ajouter l'argument sonar.branch. La configuration ressemble alors à ceci.


Update icon.png Configuration

Cette nouvelle version entraîne une modification sur les noms des variables. Un message d'avertissement est présenté sur l'interface d'administration de Jenkins indiquant que des données sont illisibles.

En les explorant, il se trouve que la variable hudson.plugins.sonar.action.UrlSonarAction est en cause.


L'impact est que le lien sur l'instance SonarQube n'est plus fonctionnel depuis la page du job.

Comme dans le cas d'une mise à jour, il est possible d'y remédier temporairement. L'exécution du job, après paramétrage, permet de rétablir la situation également.

En prenant en compte le projet TIKA 1.5 Extension extractions propriétés, le build Jenkins est Tika-1.5. Le répertoire de travail se trouve donc à l'emplacement /usr/share/tomcat7/.jenkins/jobs/Tika-1.5 dont le contenu est le suivant.

drwxr-xr-x  5 tomcat7 tomcat7 4096 mai   19 13:43 ./
drwxr-xr-x 28 tomcat7 tomcat7 4096 mai   11 16:30 ../
drwxr-xr-x  4 tomcat7 tomcat7 4096 janv. 19 14:00 builds/
-rw-r--r--  1 tomcat7 tomcat7 3833 mai   19 13:27 config.xml
-rw-r--r--  1 tomcat7 tomcat7 1136 mai   19 13:43 disk-usage.xml
lrwxrwxrwx  1 tomcat7 tomcat7   22 janv. 19 13:56 lastStable -> builds/lastStableBuild/
lrwxrwxrwx  1 tomcat7 tomcat7   26 janv. 19 13:56 lastSuccessful -> builds/lastSuccessfulBuild/
drwxr-xr-x  3 tomcat7 tomcat7 4096 mars  27  2014 modules/
-rw-r--r--  1 tomcat7 tomcat7    3 janv. 19 13:56 nextBuildNumber
-rw-r--r--  1 tomcat7 tomcat7   46 janv. 19 13:56 svnexternals.txt
drwxr-xr-x  5 tomcat7 tomcat7 4096 janv. 19 13:59 workspace/

En prenant le fichier de configuration de la dernière exécution réussie, fichier /usr/share/tomcat7/.jenkins/jobs/Tika-1.5/lastSuccessful/build.xml, la configuration SonarQube est la suivante.

    <hudson.plugins.sonar.action.UrlSonarAction plugin="sonar@2.3">
      <isNew>true</isNew>
      <sonarUrl>http://www.dev.jouvinio.net/sonar/dashboard/index/fr.ejn.tutorial:tika:1.5</sonarUrl>
    </hudson.plugins.sonar.action.UrlSonarAction>

Un exemple de configuration valide, le contenu de la balise est du type suivant.

    <hudson.plugins.sonar.action.SonarAnalysisAction plugin="sonar@2.4">
      <installationName>Jouvinio SonarQube</installationName>
      <ceTaskId>AVTIhlXPBUdxs9Nrd22i</ceTaskId>
      <url>http://www.dev.jouvinio.net/sonar/dashboard/index/fr.ejn.tutorial:tika:1.6</url>
      <isNew>true</isNew>
      <isSkipped>false</isSkipped>
    </hudson.plugins.sonar.action.SonarAnalysisAction>


Le fichier /usr/share/tomcat7/.jenkins/jobs/Tika-1.5/lastSuccessful/build.xml est donc modifié pour prendre à minima certaines informations.

    <hudson.plugins.sonar.action.SonarAnalysisAction plugin="sonar@2.4">
      <installationName>Jouvinio SonarQube</installationName>
      <isNew>true</isNew>
      <url>http://www.dev.jouvinio.net/sonar/dashboard/index/fr.ejn.tutorial:tika:1.5</url>
    </hudson.plugins.sonar.action.SonarAnalysisAction>


Run-icon.png Version 2.3

System-Install-icon.png Installation

Attention, une modification "radicale" a été mise en place à partir de la version 2.3. Jusqu'à cette version, il suffisait de rajouter une étape "post build" avec une configuration graphique très simple. Cependant, celle-ci n'est plus supportée et il est recommandé de passer à l'utilisation d'étape Maven.


Cependant, ce mode de configuration n'est pas si simple au premier abord, malgré la documentation. Il faut dans un premier temps, configurer l'instance SonarQube au niveau de Jenkins. Pour cela, il faut accéder à la section SonarQube dans la page Administration → Configurer le système. Dans le cadre de cet article, une instance de SonarQube est installée.


Les paramètres de configuration sont les suivants.

Paramètre Valeur
Nom Nom de l'instance.

Utilisé uniquement pour Jenkins afin d'identifier l'instance.

URL du serveur URL d'accès à l'instance SonarQube.
Login du compte SonarQube Login utilisé pour se connecter.

Attention, ce compte doit avoir des permissions suffisantes pour exécuter les analyses sur le projet. Il peut être vide, si cette permission est accordée au compte Anonyme.

Mot de passe du compte SonarQube Mot du passe du compte de connexion.
URL de la base de données Configuration de la base de données de SonarQube.

Il faut reprendre la valeur configurée sur l'instance.

Nom d'utilisateur BDD Login utilisé pour se connecter à la base de données.
Mot de passe BDD Mot du passe du compte de connexion à la base de données.


Configuration-icon.png Activation

Une fois la configuration mise en place, il faut cocher la case Enable injection of SonarQube server configuration as build environment variables afin de la rendre disponible au niveau des process Jenkins.


Icon-Configuration-Settings.png Configuration projets

Afin de pouvoir déclencher une analyse, il est nécessaire de rendre disponible les paramètres de configuration sur le projet. Dans la section Environnements de Build, il faut cocher la case Preparer l'environement pour SonarQube Scanner. Ainsi, les variables sont disponibles comme mentionné dans l'aide, affichable en cliquant sur l'icône en forme de point d'interrogation.


Une fois disponibles, les variables sont utilisables. Il existe alors deux moyens de mettre en place l'analyse SonarQube.

Warning-icon.png Configurations obsolètes

Depuis la version 2.7.1 du plugin sonar-maven-plugin, trois paramètres de configuration sont devenus obsolètes, comme l'indique la trace d'exécution.

[WARNING] Property 'sonar.jdbc.url' is not supported any more. There is no more DB connection to the SQ database. It will be ignored.
[WARNING] Property 'sonar.jdbc.username' is not supported any more. There is no more DB connection to the SQ database. It will be ignored.
[WARNING] Property 'sonar.jdbc.password' is not supported any more. There is no more DB connection to the SQ database. It will be ignored.

Ces paramètres sont présentés dans les paragraphes suivants, mais ils doivent être supprimés dans les configurations.

link Configuration ligne commande

Le premier mode de configuration consiste à injecter les variables dans la commande Maven. Dans le cadre de cette installation, il est nécessaire d'utiliser l'ensemble des configurations, car aucune ne correspond aux valeurs par défaut.

Ainsi la valeur de Goals et options, va être particulièrement longue.

clean compile $SONAR_MAVEN_GOAL -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_LOGIN -Dsonar.password=$SONAR_PASSWORD

Pour des versions plus anciennes de sonar-maven-plugin, la ligne de commande est la suivante.

clean compile $SONAR_MAVEN_GOAL -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_LOGIN -Dsonar.password=$SONAR_PASSWORD
-Dsonar.jdbc.url=$SONAR_JDBC_URL -Dsonar.jdbc.username=$SONAR_JDBC_USERNAME -Dsonar.jdbc.password=$SONAR_JDBC_PASSWORD

La configuration ressemble alors à ceci.


Cependant, cette mise en place n'est pas très lisible et se déclenche systématiquement.

link Configuration par paramètres

Un second mode de configuration permet de mieux contrôler l'analyse. Une première étape consistera à compiler, ou packager le projet, avec exéuction des tests unitaires et autre actions. Puis, l'exécution d'une "cible Maven" en "post build" est ajoutée en seconde étape, en choisissant Invoquer les cibles Maven de haut niveau dans la liste Ajouter une étape post-build.


Une nouvelle section est alors ajoutée à la configuration dans laquelle il faut spécifier les éléments suivants.

Paramètre Valeur
Version de Maven Instance Maven à utiliser.
Cibles Maven $SONAR_MAVEN_GOAL

Cette variable contient la commande Maven pour déclencher l'analyse.

POM pom.xml

Nom du fichier "pom" contenant la configuration du projet Maven.

Propriétés sonar.host.url=$SONAR_HOST_URL

sonar.login=$SONAR_LOGIN

sonar.password=$SONAR_PASSWORD

sonar.jdbc.url=$SONAR_JDBC_URL (obsolète)

sonar.jdbc.username=$SONAR_JDBC_USERNAME (obsolète)

sonar.jdbc.password=$SONAR_JDBC_PASSWORD (obsolète)

Ici, tous les éléments de configuration sont spécifié. Ces propriétés seront mise à disposition lors de l'exécution des cibles Maven.

La configuration ressemble alors à ceci.


Pour des versions plus anciennes de sonar-maven-plugin, la configuration doit contenir le paramétrage de la base de données.


L'avantage de cette configuration est de permettre de paramétrer le déclenchement de cette étape. Ainsi, il est possible de désactiver l'analyse en cas d'échec des précédentes étapes.

Copy-icon.png Gestion des branches

Dans le cadre d'un projet avec plusieurs branches, SonarQube permet d'effectuer des analyses sur chacune d'elles. Pour cela, il faut spécifier une valeur pour l'argument sonar.branch. Avec le mode de configuration par paramètres, il suffit donc de le rajouter à la zone de saisie.


Pour cet exemple, l'analyse entrainera la création d'un rapport pour la branche 1.0.

Update icon.png Update Sonar

Il peut arriver de devoir migrer l'application Sonar, entraînant une modification des liens. Cependant les liens présentés sur les builds des projets deviennent invalides. Il est alors nécessaire de mettre à jour manuellement tous les builds pour prendre en compte le nouveau lien.


Dans le cadre de cette article, l'ancienne URL est www.jouvinio.net/sonar et devient www.dev.jouvinio.net/sonar.

L'opération n'est pas compliquée mais assez fastidieuse. L'exécution d'un build entraîne la création d'un ensemble de fichier dans le répertoire de travail de Jenkins. Pour cette installation, le répertoire de travail se trouve sous /usr/share/tomcat6/.jenkins/jobs.

En prenant en compte le projet TIKA 1.5 Extension extractions propriétés, le build Jenkins est Tika-1.5. Le répertoire de travail se trouve donc à l'emplacement /usr/share/tomcat6/.jenkins/jobs/Tika-1.5 dont le contenu est le suivant.

drwxr-xr-x  5 tomcat6 tomcat6 4096 août  15 22:02 ./
drwxr-xr-x 22 tomcat6 tomcat6 4096 août  15 20:41 ../
drwxr-xr-x 11 tomcat6 tomcat6 4096 août  15 22:02 builds/
-rw-r--r--  1 tomcat6 tomcat6 3523 août  15 11:16 config.xml
-rw-r--r--  1 tomcat6 tomcat6 2418 août  15 22:02 disk-usage.xml
lrwxrwxrwx  1 tomcat6 tomcat6   22 août  15 22:00 lastStable -> builds/lastStableBuild/
lrwxrwxrwx  1 tomcat6 tomcat6   26 août  15 22:00 lastSuccessful -> builds/lastSuccessfulBuild/
drwxr-xr-x  3 tomcat6 tomcat6 4096 mars  27 23:08 modules/
-rw-r--r--  1 tomcat6 tomcat6    3 août  15 22:00 nextBuildNumber
-rw-r--r--  1 tomcat6 tomcat6   46 août  15 22:00 svnexternals.txt
drwxr-xr-x  5 tomcat6 tomcat6 4096 août  15 22:01 workspace/

Il faut parcourir le contenu du répertoire builds qui liste l'ensemble des builds mémorisés.

total 44
drwxr-xr-x 11 tomcat6 tomcat6 4096 août  15 22:02 ./
drwxr-xr-x  5 tomcat6 tomcat6 4096 août  15 22:29 ../
lrwxrwxrwx  1 tomcat6 tomcat6   19 mars  27 23:08 1 -> 2014-03-27_23-08-38/
lrwxrwxrwx  1 tomcat6 tomcat6   19 mars  27 23:28 2 -> 2014-03-27_23-28-54/
drwxr-xr-x  2 tomcat6 tomcat6 4096 mars  27 23:09 2014-03-27_23-08-38/
drwxr-xr-x  2 tomcat6 tomcat6 4096 mars  27 23:29 2014-03-27_23-28-54/
drwxr-xr-x  2 tomcat6 tomcat6 4096 mars  27 23:38 2014-03-27_23-37-18/
drwxr-xr-x  2 tomcat6 tomcat6 4096 août   9 15:21 2014-08-09_15-19-35/
drwxr-xr-x  2 tomcat6 tomcat6 4096 août   9 20:21 2014-08-09_20-18-40/
drwxr-xr-x  2 tomcat6 tomcat6 4096 août  14 12:00 2014-08-11_09-22-17/
drwxr-xr-x  2 tomcat6 tomcat6 4096 août  15 14:29 2014-08-15_14-28-23/
drwxr-xr-x  2 tomcat6 tomcat6 4096 août  15 14:49 2014-08-15_14-47-23/
drwxr-xr-x  2 tomcat6 tomcat6 4096 août  15 22:02 2014-08-15_22-00-53/
lrwxrwxrwx  1 tomcat6 tomcat6   19 mars  27 23:37 3 -> 2014-03-27_23-37-18/
lrwxrwxrwx  1 tomcat6 tomcat6   19 août   9 15:19 4 -> 2014-08-09_15-19-35/
lrwxrwxrwx  1 tomcat6 tomcat6   19 août   9 20:18 5 -> 2014-08-09_20-18-40/
lrwxrwxrwx  1 tomcat6 tomcat6   19 août  11 09:22 6 -> 2014-08-11_09-22-17/
lrwxrwxrwx  1 tomcat6 tomcat6   19 août  15 14:28 7 -> 2014-08-15_14-28-23/
lrwxrwxrwx  1 tomcat6 tomcat6   19 août  15 14:47 8 -> 2014-08-15_14-47-23/
lrwxrwxrwx  1 tomcat6 tomcat6   19 août  15 22:00 9 -> 2014-08-15_22-00-53/
lrwxrwxrwx  1 tomcat6 tomcat6    2 mars  27 23:08 lastFailedBuild -> -1
lrwxrwxrwx  1 tomcat6 tomcat6    1 août  15 22:02 lastStableBuild -> 9/
lrwxrwxrwx  1 tomcat6 tomcat6    1 août  15 22:02 lastSuccessfulBuild -> 9/
lrwxrwxrwx  1 tomcat6 tomcat6    1 mars  27 23:09 lastUnstableBuild -> 1/
lrwxrwxrwx  1 tomcat6 tomcat6    1 mars  27 23:09 lastUnsuccessfulBuild -> 1/

Par chance, le lien n'est affiché que sur la dernière exécution, il ne sera pas nécessaire d'effectuer la modification sur l'ensemble des exécutions. Il suffit donc de parcourir le contenu du lien dont l'indice est le plus élevé, à savoir 9 dans le cadre de cet exemple.

total 80
drwxr-xr-x  2 tomcat6 tomcat6  4096 août  15 22:02 ./
drwxr-xr-x 11 tomcat6 tomcat6  4096 août  15 22:02 ../
-rw-r--r--  1 tomcat6 tomcat6  9813 août  15 22:02 build.xml
-rw-r--r--  1 tomcat6 tomcat6     6 août  15 22:00 changelog.xml
lrwxrwxrwx  1 tomcat6 tomcat6    61 août  15 22:01 fr.ejn.tutorial$tika -> ../../modules/fr.ejn.tutorial$tika/builds/2014-08-15_22-00-55/
-rw-r--r--  1 tomcat6 tomcat6 46248 août  15 22:02 log
-rw-r--r--  1 tomcat6 tomcat6    49 août  15 22:00 revision.txt

Le lien vers Sonar est configuré sous le noeud hudson.plugins.sonar.BuildSonarAction du fichier build.xml.

    <hudson.plugins.sonar.BuildSonarAction plugin="sonar@2.1">
      <url>http://www.jouvinio.net/sonar</url>
    </hudson.plugins.sonar.BuildSonarAction>

Il suffit donc de modifier le text du noeud url avec la nouvelle URL, ainsi.

    <hudson.plugins.sonar.BuildSonarAction plugin="sonar@2.1">
      <url>http://www.dev.jouvinio.net/sonar</url>
    </hudson.plugins.sonar.BuildSonarAction>

Warning-icon.png Attention, il semblerait qu'il y ait un cache lors de l'affichage des détails d'un build. La modification du fichier n'est pas automatiquement prise en compte. Un moyen simple est d'arrêter et relancer le serveur.


Run-icon.png Version Pré 2.3

System-Install-icon.png Installation

Au niveau de la page de configuration de Hudson, il faut activer le plugin en cliquant sur le lien Add Sonar:


Il faut ensuite renseigner la configuration du plugin:


Dans le cadre de cette installation, la base de données est de type MySQL, et le serveur a été exposé sous un serveur Apache, voir Sonar.


Icon-Configuration-Settings.png Configuration

Attention, cette astuce ne s'applique plus à partir de la version 5.0. Celle-ci nécessite l'utilisation de Maven 3.X, avec laquelle la version de SonarQube est correctement détectée.

Pour une version antérieure de SOnarQube ou Sonar, il faut suivre les étapes suivantes.

Sur la configuration d'un projet, il faut cocher l'utilisation du plugin. Dans un cas simple, la configuration avancée n'est pas modifiée.


Avec l'utilisation de Maven 2.2.1, une erreur a été constatée lors de la construction du rapport Sonar:


Une version de plugin est recherchée, mais celle ci n'est pas disponible sous le serveur Nexus. En effet, celle ci est en version SNAPSHOT, et ces versions ne sont pas récupérées par défaut. Pour y remédier, il faut utiliser le plugin org.codehaus.mojo.sonar-maven-plugin, qui va vérifier la version de Sonar avant l'exécution du plugin. Cette dépendance est ajoutée au niveau de la section build.plugins:

<build>
	<sourceDirectory>src/main/java</sourceDirectory> 
	<testSourceDirectory>src/test/java</testSourceDirectory>
	<resources>
		<resource>
			<directory>src/main/resources</directory>
		</resource>
		<resource>
			<directory>src/main/config</directory>
		</resource>
	</resources>
	<testResources>
		<testResource>
			<directory>src/test/resources</directory>
		</testResource>
	</testResources>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-eclipse-plugin</artifactId>
			<version>2.8</version>
			<configuration>
				<wtpversion>2.0</wtpversion>
				<downloadSources>true</downloadSources>
				<downloadJavadocs>true</downloadJavadocs>
			</configuration>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.5</source>
				<target>1.5</target>
			</configuration>
		</plugin>
		<plugin>
			<groupId>org.codehaus.mojo</groupId>
			<artifactId>sonar-maven-plugin</artifactId>
			<version>1.0-beta-2</version>
		</plugin>
	</plugins>
</build>

Le problème est le même que pour la mise en place du plugin Sonar sous Maven.


Multiples-icon.png Configuration SVN

A partir de la version 5.0 de SonarQube, les analyses sous Jenkins nécessitent une version récente de SVN, en l'occurence 1.8. Cette configuration s'effectue dans la page de configuration du système au niveau de l'administration de Jenkins. Il faut sélectionner la version 1.8 dans la liste de choix Version de svn.


En cas de versions antérieurs du client SVN, une erreur est affichée dans la trace d'exécution du job.

svn: E155036: The working copy at '/usr/share/tomcat7/.jenkins/jobs/CXF Tutorial/workspace/src/main/java/fr/ejn/tutorial/cxf/phase'
is too old (format 8) to work with client version '1.8.10 (r1615264)' (expects format 31). You need to upgrade the working copy first.


	at org.codehaus.mojo.sonar.bootstrap.ExceptionHandling.handle(ExceptionHandling.java:41)
	at org.codehaus.mojo.sonar.bootstrap.RunnerBootstraper.execute(RunnerBootstraper.java:139)
	at org.codehaus.mojo.sonar.SonarMojo.execute(SonarMojo.java:132)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
	... 20 more