Mettre en place un SonarQube local
Le but est de fournir un moyen d'évaluer rapidement la couverture de code et les problèmes qu'une simple analyse Lint n'est pas en mesure de fournir. Cela ne se subtitue pas au SonarQube de la chaine CI/CD qui fera en outre le delta entre versions.
Conteneur Sonar
Image
docker run -d --name sonarqube \
-p 9000:9000 \
-e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true \
sonarqube:lts-community
Avec cette commande, un conteneur sonarqube sera créé et configuré pour écouter le port 9000
Lancement
docker start sonarqube && docker ps
Cela lancera le conteneur sonarqube
qui a été créé précédement et listera les conteneurs lancés.
Vous pouvez aussi vous créer un profil d'exécution dans intellij de type Shell Script
Configuration Sonar
Connexion
Pour ce connecter : http://localhost:9000
Par défaut, sonar crée un compte admin
/admin
. A la 1ere connection, il sera demandé de changer le mot de passe.
Token
Pour éviter de transmettre en clair un mot de passe, il faut créer un token
- aller dans
MyAccount
une fois connecté en tant qu'admin en cliquant sur le A à coté du champ de recherche dans la barre en haut. - aller dans Security
- générer un token de type
Global Analysis
avec une durée d'expiration qui vous convient - sauvegardez précieusement le contenu du token créé (par exemple dans votre keepass)
Configuration Gradle
plugins {
// ...
// mettre à jour vers la dernière version du plugin gradle de sonarqube
id 'org.sonarqube' version '6.0.1.5171'
}
// ajouter la tache pour jacoco
jacoco {
toolVersion = "0.8.10"
}
test {
useJUnitPlatform()
// ajouter à la tache de test la génération du rapport jacoco
finalizedBy 'jacocoTestReport'
}
jacocoTestReport {
// double sécurité : forcer la dépendance par rapport à la tache de test
dependsOn(test)
reports {
xml.required = true
html.required = true
}
}
sonar {
// Completer la tache sonarqube avec les éléments du fochier properties et les options suivantes
properties {
property "sonar.projectKey", System.getenv("SONAR_PROJECT_KEY")?: project.properties['sonar.project.key']
property "sonar.host.url", System.getenv("SONAR_URL")?: project.properties['sonar.url']
property "sonar.qualitygate.wait", true
property "sonar.coverage.jacoco.xmlReportPaths", "${getLayout().buildDirectory}/reports/jacoco/test/jacocoTestReport.xml"
property "sonar.login", "admin"
property "sonar.password", "vasco"
}
}
sonar.project.key=vasco-backend
sonar.url=http://localhost:9000
Configuration Run/Debug
- créer configuration gradle
- configurer le champ "run" avec
clean test jacocoTestReport sonar
- configurer le champ "Environment variables" avec
SONAR_TOKEN=<valeur_du_token>
Cette configuration va jouer tous les tests, générer le rapport Jacoco et envoyer le résultat au sonar en local. <valeur_du_token>
correspond au token qui a été créé avec le compte admin du sonarqube local
Utilisation
Etant donné que l'on applique pas l'analyse sur la même branche, le delta de l'analyse peut être inexact, mais il mettra quand même en évidence les nouveaux problèmes.
- Sur les "onglets" en dessous du nom du projet,
Overview | Issues | Security Hotspots | Measures | Code | Activity
, sélectionnerCode
. - Rechercher les classes de service impactées par votre branche
- vérifiez la couverture de code sur les services ajoutés/modifiés.
- completer la couverture si nécessaire