Aller au contenu

SonarQube Community Edition

Déployer un serveur d'analyse statique centralisé pour suivre la qualité de vos projets dans la durée.


SonarQube, c'est quoi ?

Les linters détectent les problèmes de style et certains bugs évidents. SonarQube va beaucoup plus loin :

  • Analyse de flux de données — détecte les null pointer dereferences, les ressources non fermées, les chemins de code morts
  • Complexité cyclomatique — mesure la difficulté de maintenance de chaque fonction
  • Détection de duplication — identifie le code copié-collé à travers tout le projet
  • Dashboard centralisé — historique, tendances, métriques par projet
  • Quality Gates — seuils automatiques qui bloquent les régressions

Linter vs SonarQube

Linter (ESLint/Ruff) SonarQube
Exécution Locale, CLI Serveur centralisé
Historique Non Oui, tendances
Multi-projet Non Oui, dashboard
Quality Gates Non Oui
Couverture Non Oui (avec rapport externe)

Complémentaires, pas concurrents

SonarQube ne remplacé pas vos linters. Il les complète avec une vision centralisée et un historique. Gardez ESLint/Ruff dans votre IDE et votre CI, et utilisez SonarQube pour le suivi global.


Déploiement Podman

Fichier podman-compose.yml

version: "3"
services:
  sonarqube:
    image: sonarqube:community
    container_name: sonarqube
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
      - "9000:9000"
  db:
    image: postgres:16
    container_name: sonarqube-db
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar
    volumes:
      - postgresql_data:/var/lib/postgresql/data
volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql_data:

Paramètre noyau requis

SonarQube utilisé Elasticsearch en interne, qui nécessite un vm.max_map_count élevé. Avant de lancer le conteneur, configurez le paramètre :

sudo sysctl -w vm.max_map_count=524288
echo "vm.max_map_count=524288" | sudo tee -a /etc/sysctl.d/99-sonarqube.conf

Si vous utilisez Podman rootless, consultez le guide des prérequis pour la configuration complète.

Lancement

podman-compose up -d

Vérifiez que les conteneurs sont bien démarrés :

podman-compose ps

Suivez les logs pour vérifier le démarrage :

podman-compose logs -f sonarqube

Attendez le message SonarQube is operational dans les logs, puis accédez à l'interface :

http://localhost:9000

Changement du mot de passe admin

Le compte par défaut est admin / admin. À la première connexion, SonarQube vous demande de changer ce mot de passe.

Sécurité

Changez immédiatement le mot de passe par défaut, même en environnement de développement. Un SonarQube exposé avec les identifiants par défaut est une cible facile.


Configuration projet

Créer un projet dans l'interface

  1. Connectez-vous à http://localhost:9000
  2. Cliquez sur Create ProjectManually
  3. Renseignez la Project Key (identifiant unique) et le Display Name
  4. Cliquez sur Set Up
  5. Choisissez Locally comme méthode d'analyse
  6. Générez un token d'authentification — copiez-le précieusement, il ne sera plus affiché

Fichier sonar-project.properties

Créez ce fichier à la racine de votre projet :

sonar.projectKey=mon-projet
sonar.projectName=Mon Projet
sonar.sources=src
sonar.exclusions=**/node_modules/**,**/__pycache__/**
sonar.sourceEncoding=UTF-8
sonar.python.version=3.11
sonar.javascript.node.maxspace=4096

Installer sonar-scanner-cli

Téléchargez le binaire depuis le site officiel :

# Télécharger la dernière version
curl -LO https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-6.2.1.4610-linux-x64.zip

# Extraire
unzip sonar-scanner-cli-6.2.1.4610-linux-x64.zip

# Ajouter au PATH
export PATH="$PWD/sonar-scanner-6.2.1.4610-linux-x64/bin:$PATH"

Utilisation en environnement airgap

Si votre serveur n'a pas accès à Internet, téléchargez l'archive sonar-scanner-cli depuis un poste connecté, puis transférez-la via scp ou une clé USB. Le scanner est un binaire autonome — aucune dépendance réseau n'est requise à l'exécution (il a juste besoin de contacter votre serveur SonarQube).


Premier scan

Lancer l'analyse

Depuis la racine de votre projet (là où se trouve sonar-project.properties) :

sonar-scanner -Dsonar.login=<TOKEN>

Remplacez <TOKEN> par le token généré dans l'interface.

Lecture des logs

Un scan réussi se termine par :

INFO: ANALYSIS SUCCESSFUL
INFO: SonarQube server [http://localhost:9000]
INFO: Default locale: "en_US", source code encoding: "UTF-8"

Si vous voyez une erreur, vérifiez :

  • que le serveur SonarQube est bien démarré et accessible
  • que le token est correct
  • que la projectKey dans sonar-project.properties correspond au projet créé

Après le scan, explorez les onglets du projet :

Onglet Contenu
Overview Résumé global : bugs, vulnérabilités, code smells, couverture, duplication
Issues Liste détaillée de tous les problèmes détectés, avec filtre par sévérité et type
Measures Métriques quantitatives : complexité, taille, dette technique
Code Navigation dans le code source avec annotation des problèmes directement en ligne

Sévérités

SonarQube classe chaque problème selon 5 niveaux de sévérité :

Sévérité Description Action
Blocker Bug critique pouvant causer un crash ou une perte de données Corriger immédiatement
Critical Vulnérabilité de sécurité ou bug à fort impact Corriger avant la prochaine release
Major Problème de qualité significatif (code smell important) Planifier la correction
Minor Problème mineur de lisibilité ou de convention Corriger quand l'occasion se présente
Info Suggestion d'amélioration A considérer

Quality Gates

Concept

Un Quality Gate est un seuil minimum de qualité que votre code doit respecter. Si le code ne passe pas le gate, le projet est marqué comme Failed — signal clair que la qualité se dégrade.

Configurer un Quality Gate personnalisé

  1. Allez dans Quality Gates (menu du haut)
  2. Cliquez sur Create
  3. Donnez un nom à votre gate
  4. Ajoutez des conditions, par exemple :
Métrique Opérateur Valeur
Blocker Issues est supérieur à 0
Critical Vulnerabilities est supérieur à 0
Coverage est inférieur à 60%
  1. Cliquez sur Set as Default si vous voulez l'appliquer à tous les nouveaux projets

Résultat sur le dashboard

Après chaque scan, le dashboard affiche un badge :

  • Passed (vert) — le code respecte tous les seuils
  • Failed (rouge) — au moins un seuil est dépassé

Intégration CI

En CI/CD, vous pouvez configurer votre pipeline pour qu'il échoue automatiquement si le Quality Gate est en Failed. Le scanner retourné un code d'erreur exploitable par votre système de build.


Profils de règles

Concept

Un Quality Profile est un ensemble de règles appliqué lors de l'analyse. Chaque langage a un profil par défaut (Sonar way), mais vous pouvez créer des profils personnalisés adaptés à votre contexte.

Créer un profil personnalisé

  1. Allez dans Quality Profiles (menu du haut)
  2. Cliquez sur Create en haut à droite
  3. Choisissez le langage (Python, JavaScript, TypeScript, Java...)
  4. Nommez votre profil
  5. Sélectionnez un profil parent (par exemple Sonar way) pour hériter de ses règles

Activer/désactiver des règles

  1. Ouvrez votre profil personnalisé
  2. Cliquez sur le nombre de Active Rules
  3. Utilisez les filtres pour trouver une règle spécifique
  4. Cliquez sur une règle pour voir sa description détaillée
  5. Utilisez Activate / Deactivate pour ajuster le profil

Cas concret

Vous travaillez sur un projet legacy avec beaucoup de fonctions longues. Plutôt que de désactiver la règle de complexité, relevez le seuil temporairement (par exemple de 15 à 30), puis réduisez-le progressivement au fil des sprints.

Assigner un profil à un projet

  1. Allez dans les Settings de votre projet
  2. Section Quality Profiles
  3. Pour chaque langage, sélectionnez le profil à utiliser
  4. Les prochaines analyses utiliseront ce profil

Profil par défaut vs profil projet

Le profil marqué Default s'applique à tous les projets qui n'ont pas de profil explicitement assigné. Pour un projet spécifique, vous pouvez toujours surcharger avec un profil dédié.