Plateforme e-commerce microservices axée sur la qualité du code et l'intégration continue avec SonarQube
Architecture • SonarQube Integration • Quality Gates • Getting Started
Safe-Zone est un projet d'apprentissage DevOps centré sur la maîtrise de SonarQube et son intégration dans le cycle de développement. Ce projet démontre les meilleures pratiques d'analyse de qualité du code, de couverture de tests et de gestion des quality gates dans un environnement microservices moderne.
- ✅ Maîtriser SonarQube : Configuration, intégration et utilisation avancée
- ✅ Analyse de Code Statique : Détection automatique des bugs, vulnérabilités et code smells
- ✅ Couverture de Code : Intégration JaCoCo pour le tracking de la couverture de tests
- ✅ Quality Gates : Mise en place de portes qualité strictes dans le pipeline CI/CD
- ✅ Reporting Qualité : Génération automatique de rapports de qualité par microservice
- ✅ Intégration Continue : Pipeline Jenkins avec blocage sur échec des quality gates
┌─────────────────────────────────────────────────────────────┐
│ API Gateway (8080) │
│ + Spring Cloud Gateway │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────┼────────────┬────────────┐
│ │ │ │
┌────▼───┐ ┌───▼────┐ ┌───▼────┐ ┌────▼─────┐
│ User │ │ Order │ │ Media │ │Discovery │
│Service │ │Service │ │Service │ │ Server │
│ (8081) │ │ (8084) │ │ (8083) │ │ (8761) │
└────────┘ └────────┘ └────────┘ └──────────┘
│
┌────▼────┐
│ Config │
│ Service │
│ (8888) │
└─────────┘
- Application SPA moderne avec TypeScript
- Interface utilisateur responsive
- Nginx reverse proxy avec SSL/TLS
| Technologie | Version | Usage |
|---|---|---|
| 21 | Language backend | |
| 3.5.4 | Framework microservices | |
| 2025.0.0 | Service mesh | |
| 3.9+ | Build automation |
| Technologie | Proportion | Usage |
|---|---|---|
| 32.6% | Language frontend | |
| 14.7% | Structure | |
| 21.5% | Styles | |
| - | Framework SPA |
| Outil | Version | Rôle |
|---|---|---|
| Latest | Analyse qualité code | |
| 0.8.12 | Couverture de code | |
| - | CI/CD avec Quality Gates | |
| - | Containerisation | |
| 5 | Tests unitaires | |
| - | Base de données |
Chaque microservice est configuré avec les plugins nécessaires :
<!-- pom.xml - Exemple pour user-service -->
<dependencies>
<!-- SonarQube Plugin API -->
<dependency>
<groupId>org.sonarsource.sonarqube</groupId>
<artifactId>sonar-plugin-api</artifactId>
<version>9.3.0.51899</version>
</dependency>
<!-- JaCoCo pour la couverture -->
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.13</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- JaCoCo Agent -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.12</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- SonarQube Scanner -->
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.9.1.2184</version>
</plugin>
</plugins>
</build>mvn clean verify -DskipTests=false sonar:sonar \
-Dsonar.projectKey=sonar-user \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.token=$SONAR_USER_TOKEN \
-Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml| Microservice | Project Key | Analyse |
|---|---|---|
| Discovery Service | sonar-discovery |
✅ Bugs, Vulnerabilities, Code Smells |
| Config Service | sonar-config |
✅ Bugs, Vulnerabilities, Code Smells |
| API Gateway | sonar-api-gateway |
✅ Bugs, Vulnerabilities, Code Smells |
| User Service | sonar-user |
✅ + Code Coverage (JaCoCo) |
| Order Service | sonar-order |
✅ + Code Coverage (JaCoCo) |
| Media Service | sonar-media |
✅ + Code Coverage (JaCoCo) |
Le pipeline Jenkins intègre un Quality Gate bloquant :
stage('Build & Unit Test') {
steps {
withSonarQubeEnv('safe-zone-mr-jenk') {
withCredentials([string(credentialsId: 'SONAR_USER_TOKEN', variable: 'SONAR_USER_TOKEN')]) {
sh '''
cd user-service
mvn clean verify -DskipTests=false sonar:sonar \
-Dsonar.projectKey=sonar-user \
-Dsonar.host.url=$SONAR_HOST_URL \
-Dsonar.token=$SONAR_USER_TOKEN \
-Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
'''
}
}
}
}
stage('Sonar Quality Gate') {
steps {
timeout(time: 25, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true // ⚠️ Bloque si échec
}
}
}- 🐛 Bugs : Détection automatique d'erreurs potentielles
- 🔒 Vulnerabilities : Analyse de sécurité du code
- 💡 Code Smells : Problèmes de maintenabilité
- 📊 Code Coverage : Taux de couverture des tests (JaCoCo)
- 🔄 Duplications : Détection de code dupliqué
- 📏 Technical Debt : Estimation du coût de la dette technique
graph TB
A[Git Push] --> B[Clean Docker]
B --> C[Build & Unit Tests]
C --> D[SonarQube Analysis]
D --> E{Quality Gate OK?}
E -->|✅ Success| F[Integration Tests]
E -->|❌ Fail| G[Pipeline Aborted]
F --> H[Build Docker Images]
H --> I[Push to Docker Hub]
I --> J[Deploy Locally]
J --> K[Email Notification]
G --> L[Rollback & Email]
docker system prune -af- Build Maven pour chaque microservice
- Exécution des tests unitaires (JUnit)
- Analyse SonarQube complète
- Génération des rapports JaCoCo
waitForQualityGate abortPipeline: true- ⏰ Timeout de 25 minutes
- 🚫 Blocage automatique si le Quality Gate échoue
- 📧 Notification email en cas d'échec
- Lancement de l'environnement complet avec Docker Compose
- Tests inter-services
- Nettoyage automatique
- Build des images Docker
- Push vers Docker Hub avec versioning
- Déploiement local automatique
- ✅ Success : Sauvegarde du numéro de build + Email de confirmation
- ❌ Failure : Rollback automatique vers la dernière version stable + Email d'alerte
- Docker & Docker Compose
- Java 21+
- Maven 3.9+
- Node.js 20+ (pour le frontend)
- SonarQube (Docker ou instance existante)
# Avec volumes persistants
docker run -d --name sonarqube \
-p 9000:9000 \
-v sonarqube_data:/opt/sonarqube/data \
-v sonarqube_extensions:/opt/sonarqube/extensions \
-v sonarqube_logs:/opt/sonarqube/logs \
sonarqube:latestAccéder à SonarQube : http://localhost:9000
- Credentials par défaut :
admin/admin
- Se connecter à SonarQube
- Aller dans My Account > Security
- Générer un token d'authentification
- Configurer les credentials Jenkins :
SONAR_USER_TOKEN- SonarQube server :
safe-zone-mr-jenk
# Cloner le repository
git clone https://github.com/mamadbah2/safe-zone.git
cd safe-zone
# Configurer les variables d'environnement
export GITHUB_TOKEN=your_github_token
export SONAR_USER_TOKEN=your_sonar_token# Option 1 : Avec Docker Compose
docker-compose up --build
# Option 2 : Build local avec analyse SonarQube
cd user-service
mvn clean verify sonar:sonar \
-Dsonar.projectKey=sonar-user \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.token=$SONAR_USER_TOKEN| Service | URL | Description |
|---|---|---|
| Frontend | http://localhost |
Interface utilisateur |
| API Gateway | http://localhost:8080 |
Point d'entrée API |
| Eureka Dashboard | http://localhost:8761 |
Service discovery |
| Config Server | http://localhost:8888 |
Configuration centralisée |
| SonarQube | http://localhost:9000 |
Dashboard qualité |
Après chaque build, consultez les dashboards SonarQube :
http://localhost:9000/dashboard?id=sonar-user
http://localhost:9000/dashboard?id=sonar-order
http://localhost:9000/dashboard?id=sonar-media
- Reliability Rating : A à E (bugs)
- Security Rating : A à E (vulnérabilités)
- Maintainability Rating : A à E (code smells)
- Coverage : Pourcentage de code couvert par les tests
- Duplications : Pourcentage de lignes dupliquées
- Technical Debt : Temps estimé pour corriger tous les problèmes
credentials {
'docker-hub-credentials' // Docker Hub user + token
'dockerhub-credential' // Docker Hub authentication
'GITHUB_TOKEN' // GitHub personal access token
'SONAR_USER_TOKEN' // SonarQube authentication token
}Dans Jenkins : Manage Jenkins > Configure System > SonarQube servers
Name: safe-zone-mr-jenk
Server URL: http://localhost:9000
Server authentication token: [SONAR_USER_TOKEN]
Dans SonarQube : Administration > Configuration > Webhooks
Name: Jenkins
URL: http://jenkins-server:8080/sonarqube-webhook/
- Configuration SonarQube dans un projet multi-modules
- Intégration JaCoCo pour la couverture de code
- Quality Gates automatiques dans le pipeline CI/CD
- Analyse différenciée par microservice
- Blocage du pipeline en cas de non-respect des standards
- Génération automatique de rapports de qualité
- Gestion de la dette technique
- ✅ SonarQube : Installation, configuration, quality gates
- ✅ Analyse Statique : Détection de bugs et vulnérabilités
- ✅ Code Coverage : JaCoCo, reporting, seuils
- ✅ Pipeline CI/CD : Intégration qualité dans le workflow
- ✅ Jenkins : Configuration avancée avec SonarQube
- ✅ Best Practices : Standards de code, maintenabilité
Le pipeline envoie des emails automatiques :
post {
success {
mail to: 'bahmamadoubobosewa@gmail.com',
subject: "SUCCESS: Pipeline ${env.JOB_NAME} [${env.BUILD_NUMBER}]",
body: "✅ Quality Gate passed. See details: ${env.BUILD_URL}"
}
failure {
mail to: 'bahmamadoubobosewa@gmail.com',
subject: "FAILURE: Pipeline ${env.JOB_NAME} [${env.BUILD_NUMBER}]",
body: "❌ Quality Gate failed or build error. See logs: ${env.BUILD_URL}"
}
}En cas d'échec du pipeline (including Quality Gate), rollback automatique :
failure {
script {
def lastSuccessfulBuild = sh(script: "cat last_successful_build.txt", returnStdout: true).trim()
if (lastSuccessfulBuild) {
echo "🔄 Rollback vers la version ${lastSuccessfulBuild}..."
withEnv(["IMAGE_VERSION=${lastSuccessfulBuild}"]) {
sh "docker-compose -f docker-compose-deploy.yml pull"
sh "docker-compose -f docker-compose-deploy.yml up -d"
}
}
}
}Ce projet est un exercice d'apprentissage axé sur SonarQube et la qualité du code. Les contributions sont les bienvenues !
- Fork le projet
- Créer une branche feature (
git checkout -b feature/quality-improvement) - Commit (
git commit -m 'Improve code quality') - Push (
git push origin feature/quality-improvement) - Ouvrir une Pull Request
Mamadou Bah - @mamadbah2
📧 Email : bahmamadoubobosewa@gmail.com
Project Link: https://github.com/mamadbah2/safe-zone