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:
parent
2e0beec338
commit
27965e4cc2
129
Jenkinsfile
vendored
129
Jenkinsfile
vendored
|
|
@ -9,10 +9,11 @@
|
||||||
* 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 (avec variables env)
|
* 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 (avec variables env)
|
||||||
* 7. Deploy - Déploiement sur le serveur cible
|
* 7. Push - Envoi de l'image vers le registre Docker privé
|
||||||
|
* 8. Deploy - Déploiement sur le serveur cible
|
||||||
*
|
*
|
||||||
* ENVIRONNEMENTS :
|
* ENVIRONNEMENTS :
|
||||||
* - dev : Développement (branche dev)
|
* - dev : Développement (branche dev)
|
||||||
|
|
@ -130,78 +131,72 @@ pipeline {
|
||||||
}
|
}
|
||||||
|
|
||||||
// =====================================================================
|
// =====================================================================
|
||||||
// ÉTAPE 4 : CONTRÔLES QUALITÉ (Exécution parallèle)
|
// ÉTAPE 4 : LINT & TESTS
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// Exécute en parallèle :
|
// ESLint : Vérifie le style et les erreurs de code
|
||||||
// - Lint & Tests : ESLint + Jest avec couverture de code
|
// Jest : Exécute les tests unitaires React/Next.js
|
||||||
// - SonarQube : Analyse statique de la qualité du code
|
// Couverture : Génère un rapport de couverture (lcov)
|
||||||
// =====================================================================
|
// =====================================================================
|
||||||
stage('🔍 Quality - Contrôles qualité') {
|
stage('🧪 Lint & Tests') {
|
||||||
parallel {
|
agent {
|
||||||
// -------------------------------------------------------------
|
docker {
|
||||||
// 4a. LINT & TESTS
|
image 'node:20'
|
||||||
// -------------------------------------------------------------
|
args "-u root -v ${NPM_CACHE}:/root/.npm"
|
||||||
// ESLint : Vérifie le style et les erreurs de code
|
|
||||||
// Jest : Exécute les tests unitaires React/Next.js
|
|
||||||
// Couverture : Génère un rapport de couverture (lcov)
|
|
||||||
// -------------------------------------------------------------
|
|
||||||
stage('🧪 Lint & Tests') {
|
|
||||||
agent {
|
|
||||||
docker {
|
|
||||||
image 'node:20'
|
|
||||||
args "-u root -v ${NPM_CACHE}:/root/.npm"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
unstash 'node_modules'
|
|
||||||
echo "🧪 Lancement ESLint et Jest..."
|
|
||||||
script {
|
|
||||||
def lintStatus = sh(script: 'npm run lint', returnStatus: true)
|
|
||||||
def testStatus = sh(script: 'npm test', returnStatus: true)
|
|
||||||
|
|
||||||
if (lintStatus != 0) {
|
|
||||||
error "❌ ESLint a échoué - Corrigez les erreurs de style"
|
|
||||||
}
|
|
||||||
if (testStatus != 0) {
|
|
||||||
error "❌ Les tests ont échoué - Vérifiez les tests unitaires"
|
|
||||||
}
|
|
||||||
echo "✅ Lint et tests passés avec succès"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
unstash 'node_modules'
|
||||||
|
echo "🧪 Lancement ESLint et Jest..."
|
||||||
|
script {
|
||||||
|
def lintStatus = sh(script: 'npm run lint', returnStatus: true)
|
||||||
|
def testStatus = sh(script: 'npm test -- --coverage', returnStatus: true)
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// Stash coverage report for SonarQube
|
||||||
// 4b. SONARQUBE
|
stash includes: 'coverage/**', name: 'coverage', allowEmpty: true
|
||||||
// -------------------------------------------------------------
|
|
||||||
// Analyse statique du code pour détecter :
|
if (lintStatus != 0) {
|
||||||
// - Bugs potentiels
|
error "❌ ESLint a échoué - Corrigez les erreurs de style"
|
||||||
// - Vulnérabilités de sécurité
|
|
||||||
// - Code smells (mauvaises pratiques)
|
|
||||||
// - Couverture de code insuffisante
|
|
||||||
// - Duplications de code
|
|
||||||
// -------------------------------------------------------------
|
|
||||||
stage('📊 SonarQube Analysis') {
|
|
||||||
agent {
|
|
||||||
docker {
|
|
||||||
image 'sonarsource/sonar-scanner-cli:latest'
|
|
||||||
args '-u root'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
steps {
|
if (testStatus != 0) {
|
||||||
echo "📊 Analyse SonarQube en cours..."
|
error "❌ Les tests ont échoué - Vérifiez les tests unitaires"
|
||||||
withSonarQubeEnv('SonarQube') {
|
|
||||||
sh """
|
|
||||||
sonar-scanner
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
echo "✅ Analyse SonarQube terminée"
|
|
||||||
}
|
}
|
||||||
|
echo "✅ Lint et tests passés avec succès"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// =====================================================================
|
// =====================================================================
|
||||||
// ÉTAPE 5 : BUILD IMAGE DOCKER
|
// ÉTAPE 5 : SONARQUBE
|
||||||
|
// ---------------------------------------------------------------------
|
||||||
|
// Analyse statique du code pour détecter :
|
||||||
|
// - Bugs potentiels
|
||||||
|
// - Vulnérabilités de sécurité
|
||||||
|
// - Code smells (mauvaises pratiques)
|
||||||
|
// - Couverture de code insuffisante
|
||||||
|
// - Duplications de code
|
||||||
|
// =====================================================================
|
||||||
|
stage('📊 SonarQube Analysis') {
|
||||||
|
agent {
|
||||||
|
docker {
|
||||||
|
image 'sonarsource/sonar-scanner-cli:latest'
|
||||||
|
args '-u root'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
// Unstash coverage report from tests
|
||||||
|
unstash 'coverage'
|
||||||
|
echo "📊 Analyse SonarQube en cours avec rapport de couverture..."
|
||||||
|
withSonarQubeEnv('SonarQube') {
|
||||||
|
sh """
|
||||||
|
sonar-scanner
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
echo "✅ Analyse SonarQube terminée"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// ÉTAPE 6 : BUILD IMAGE DOCKER
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// But : Construire l'image Docker du frontend Next.js
|
// But : Construire l'image Docker du frontend Next.js
|
||||||
// Spécificité : Injection des variables NEXT_PUBLIC_* au build time
|
// Spécificité : Injection des variables NEXT_PUBLIC_* au build time
|
||||||
|
|
@ -237,7 +232,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
|
||||||
|
|
@ -258,7 +253,7 @@ pipeline {
|
||||||
}
|
}
|
||||||
|
|
||||||
// =====================================================================
|
// =====================================================================
|
||||||
// ÉTAPE 7 : DÉPLOIEMENT
|
// ÉTAPE 8 : DÉPLOIEMENT
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// But : Déployer le frontend sur le serveur cible
|
// But : Déployer le frontend sur le serveur cible
|
||||||
// Actions :
|
// Actions :
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user