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
324cd6603c
commit
5e5e5c0a71
131
Jenkinsfile
vendored
131
Jenkinsfile
vendored
|
|
@ -9,11 +9,12 @@
|
|||
* 1. Init - Détection de l'environnement (dev/preprod/prod)
|
||||
* 2. Checkout - Récupération du code source depuis Git
|
||||
* 3. Install - Installation des dépendances Node.js
|
||||
* 4. Quality - Vérification qualité (ESLint + Jest + SonarQube)
|
||||
* 5. Build - Construction de l'image Docker
|
||||
* 6. Push - Envoi de l'image vers le registre Docker privé
|
||||
* 7. Backup - Sauvegarde de la base de données (prod uniquement)
|
||||
* 8. Deploy - Déploiement sur le serveur cible
|
||||
* 4. Lint & Tests - ESLint + Jest avec couverture de code
|
||||
* 5. SonarQube - Analyse statique avec rapport de couverture
|
||||
* 6. Build - Construction de l'image Docker
|
||||
* 7. Push - Envoi de l'image vers le registre Docker privé
|
||||
* 8. Backup - Sauvegarde de la base de données (prod uniquement)
|
||||
* 9. Deploy - Déploiement sur le serveur cible
|
||||
*
|
||||
* ENVIRONNEMENTS :
|
||||
* - dev : Développement (branche dev)
|
||||
|
|
@ -129,77 +130,71 @@ 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
|
||||
// ESLint : Vérifie le style et les erreurs de code
|
||||
// Jest : Exécute les tests unitaires et d'intégration
|
||||
// Couverture : Génère un rapport de couverture (lcov)
|
||||
// =====================================================================
|
||||
stage('🔍 Quality - Contrôles qualité') {
|
||||
parallel {
|
||||
// -------------------------------------------------------------
|
||||
// 4a. LINT & TESTS
|
||||
// -------------------------------------------------------------
|
||||
// ESLint : Vérifie le style et les erreurs de code
|
||||
// Jest : Exécute les tests unitaires et d'intégration
|
||||
// Couverture : Génère un rapport de couverture (lcov)
|
||||
// -------------------------------------------------------------
|
||||
stage('🧪 Lint & Tests') {
|
||||
agent {
|
||||
docker {
|
||||
image 'node:18-alpine'
|
||||
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"
|
||||
}
|
||||
}
|
||||
stage('🧪 Lint & Tests') {
|
||||
agent {
|
||||
docker {
|
||||
image 'node:18-alpine'
|
||||
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 -- --coverage', returnStatus: true)
|
||||
|
||||
// -------------------------------------------------------------
|
||||
// 4b. SONARQUBE
|
||||
// -------------------------------------------------------------
|
||||
// Analyse statique du code pour détecter :
|
||||
// - Bugs potentiels
|
||||
// - Vulnérabilités de sécurité
|
||||
// - Code smells (mauvaises pratiques)
|
||||
// - Couverture de code insuffisante
|
||||
// -------------------------------------------------------------
|
||||
stage('📊 SonarQube Analysis') {
|
||||
agent {
|
||||
docker {
|
||||
image 'sonarsource/sonar-scanner-cli:latest'
|
||||
args '-u root'
|
||||
}
|
||||
// Stash coverage report for SonarQube
|
||||
stash includes: 'coverage/**', name: 'coverage', allowEmpty: true
|
||||
|
||||
if (lintStatus != 0) {
|
||||
error "❌ ESLint a échoué - Corrigez les erreurs de style"
|
||||
}
|
||||
steps {
|
||||
echo "📊 Analyse SonarQube en cours..."
|
||||
withSonarQubeEnv('SonarQube') {
|
||||
sh """
|
||||
sonar-scanner
|
||||
"""
|
||||
}
|
||||
echo "✅ Analyse SonarQube terminée"
|
||||
if (testStatus != 0) {
|
||||
error "❌ Les tests ont échoué - Vérifiez les tests unitaires"
|
||||
}
|
||||
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
|
||||
// =====================================================================
|
||||
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 backend
|
||||
// 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é
|
||||
// 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
|
||||
// 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
|
||||
// Actions :
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user