fix: run tests before SonarQube to share coverage report

- Tests now run sequentially before SonarQube (not in parallel)
- Coverage report is stashed and passed to SonarQube stage
- SonarQube will now see actual test coverage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
soufiane 2025-12-02 00:50:18 +01:00
parent 324cd6603c
commit 5e5e5c0a71

51
Jenkinsfile vendored
View File

@ -9,11 +9,12 @@
* 1. Init - Détection de l'environnement (dev/preprod/prod) * 1. Init - Détection de l'environnement (dev/preprod/prod)
* 2. Checkout - Récupération du code source depuis Git * 2. Checkout - Récupération du code source depuis Git
* 3. Install - Installation des dépendances Node.js * 3. Install - Installation des dépendances Node.js
* 4. Quality - Vérification qualité (ESLint + Jest + SonarQube) * 4. Lint & Tests - ESLint + Jest avec couverture de code
* 5. Build - Construction de l'image Docker * 5. SonarQube - Analyse statique avec rapport de couverture
* 6. Push - Envoi de l'image vers le registre Docker privé * 6. Build - Construction de l'image Docker
* 7. Backup - Sauvegarde de la base de données (prod uniquement) * 7. Push - Envoi de l'image vers le registre Docker privé
* 8. Deploy - Déploiement sur le serveur cible * 8. Backup - Sauvegarde de la base de données (prod uniquement)
* 9. Deploy - Déploiement sur le serveur cible
* *
* ENVIRONNEMENTS : * ENVIRONNEMENTS :
* - dev : Développement (branche dev) * - dev : Développement (branche dev)
@ -129,21 +130,12 @@ pipeline {
} }
// ===================================================================== // =====================================================================
// ÉTAPE 4 : CONTRÔLES QUALITÉ (Exécution parallèle) // ÉTAPE 4 : LINT & TESTS
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Exécute en parallèle :
// - Lint & Tests : ESLint + Jest avec couverture de code
// - SonarQube : Analyse statique de la qualité du code
// =====================================================================
stage('🔍 Quality - Contrôles qualité') {
parallel {
// -------------------------------------------------------------
// 4a. LINT & TESTS
// -------------------------------------------------------------
// ESLint : Vérifie le style et les erreurs de code // ESLint : Vérifie le style et les erreurs de code
// Jest : Exécute les tests unitaires et d'intégration // Jest : Exécute les tests unitaires et d'intégration
// Couverture : Génère un rapport de couverture (lcov) // Couverture : Génère un rapport de couverture (lcov)
// ------------------------------------------------------------- // =====================================================================
stage('🧪 Lint & Tests') { stage('🧪 Lint & Tests') {
agent { agent {
docker { docker {
@ -156,7 +148,10 @@ pipeline {
echo "🧪 Lancement ESLint et Jest..." echo "🧪 Lancement ESLint et Jest..."
script { script {
def lintStatus = sh(script: 'npm run lint', returnStatus: true) def lintStatus = sh(script: 'npm run lint', returnStatus: true)
def testStatus = sh(script: 'npm test', returnStatus: true) def testStatus = sh(script: 'npm test -- --coverage', returnStatus: true)
// Stash coverage report for SonarQube
stash includes: 'coverage/**', name: 'coverage', allowEmpty: true
if (lintStatus != 0) { if (lintStatus != 0) {
error "❌ ESLint a échoué - Corrigez les erreurs de style" error "❌ ESLint a échoué - Corrigez les erreurs de style"
@ -169,15 +164,15 @@ pipeline {
} }
} }
// ------------------------------------------------------------- // =====================================================================
// 4b. SONARQUBE // ÉTAPE 5 : SONARQUBE
// ------------------------------------------------------------- // ---------------------------------------------------------------------
// Analyse statique du code pour détecter : // Analyse statique du code pour détecter :
// - Bugs potentiels // - Bugs potentiels
// - Vulnérabilités de sécurité // - Vulnérabilités de sécurité
// - Code smells (mauvaises pratiques) // - Code smells (mauvaises pratiques)
// - Couverture de code insuffisante // - Couverture de code insuffisante
// ------------------------------------------------------------- // =====================================================================
stage('📊 SonarQube Analysis') { stage('📊 SonarQube Analysis') {
agent { agent {
docker { docker {
@ -186,7 +181,9 @@ pipeline {
} }
} }
steps { steps {
echo "📊 Analyse SonarQube en cours..." // Unstash coverage report from tests
unstash 'coverage'
echo "📊 Analyse SonarQube en cours avec rapport de couverture..."
withSonarQubeEnv('SonarQube') { withSonarQubeEnv('SonarQube') {
sh """ sh """
sonar-scanner sonar-scanner
@ -195,11 +192,9 @@ pipeline {
echo "✅ Analyse SonarQube terminée" echo "✅ Analyse SonarQube terminée"
} }
} }
}
}
// ===================================================================== // =====================================================================
// ÉTAPE 5 : BUILD IMAGE DOCKER // ÉTAPE 6 : BUILD IMAGE DOCKER
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// But : Construire l'image Docker du backend // But : Construire l'image Docker du backend
// Tags créés : // Tags créés :
@ -218,7 +213,7 @@ pipeline {
} }
// ===================================================================== // =====================================================================
// ÉTAPE 6 : PUSH VERS LE REGISTRE // ÉTAPE 7 : PUSH VERS LE REGISTRE
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// But : Envoyer l'image Docker vers le registre privé // But : Envoyer l'image Docker vers le registre privé
// Registre : registry.wk-archi-o24a-15m-g3.fr // Registre : registry.wk-archi-o24a-15m-g3.fr
@ -239,7 +234,7 @@ pipeline {
} }
// ===================================================================== // =====================================================================
// ÉTAPE 7 : BACKUP BASE DE DONNÉES (Production uniquement) // ÉTAPE 8 : BACKUP BASE DE DONNÉES (Production uniquement)
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// But : Sauvegarder la base de données avant le déploiement // But : Sauvegarder la base de données avant le déploiement
// Condition : Seulement en environnement de production // Condition : Seulement en environnement de production
@ -260,7 +255,7 @@ pipeline {
} }
// ===================================================================== // =====================================================================
// ÉTAPE 8 : DÉPLOIEMENT // ÉTAPE 9 : DÉPLOIEMENT
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// But : Déployer le backend sur le serveur cible // But : Déployer le backend sur le serveur cible
// Actions : // Actions :