Aller au contenu principal

Mettre en place un SonarQube local

info

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

build.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"
}
}
gradle.properties
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électionner Code.
  • 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