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¶
Vérifiez que les conteneurs sont bien démarrés :
Suivez les logs pour vérifier le démarrage :
Attendez le message SonarQube is operational dans les logs, puis accédez à l'interface :
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¶
- Connectez-vous à
http://localhost:9000 - Cliquez sur Create Project → Manually
- Renseignez la Project Key (identifiant unique) et le Display Name
- Cliquez sur Set Up
- Choisissez Locally comme méthode d'analyse
- 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) :
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
projectKeydanssonar-project.propertiescorrespond au projet créé
Navigation dans l'interface¶
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é¶
- Allez dans Quality Gates (menu du haut)
- Cliquez sur Create
- Donnez un nom à votre gate
- 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% |
- 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é¶
- Allez dans Quality Profiles (menu du haut)
- Cliquez sur Create en haut à droite
- Choisissez le langage (Python, JavaScript, TypeScript, Java...)
- Nommez votre profil
- Sélectionnez un profil parent (par exemple Sonar way) pour hériter de ses règles
Activer/désactiver des règles¶
- Ouvrez votre profil personnalisé
- Cliquez sur le nombre de Active Rules
- Utilisez les filtres pour trouver une règle spécifique
- Cliquez sur une règle pour voir sa description détaillée
- 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¶
- Allez dans les Settings de votre projet
- Section Quality Profiles
- Pour chaque langage, sélectionnez le profil à utiliser
- 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é.