diff --git a/Dockerfile b/Dockerfile index df76c67f..9ff1f123 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,16 @@ +# Utilise une image Node légère FROM node:18-alpine WORKDIR /app +# Copie les fichiers COPY package*.json ./ -RUN npm ci --omit=dev +RUN npm install --omit=dev COPY . . -# Nettoyer le .env pour ne pas écraser les variables Docker (facultatif mais recommandé) -# RUN rm -f .env - -# Installer curl pour le healthcheck -RUN apk add --no-cache curl - +# Définit la variable d’environnement +ENV NODE_ENV=production EXPOSE 4000 -# Healthcheck plus robuste -HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \ - CMD curl -f http://localhost:4000/health || exit 1 - CMD ["npm", "start"] diff --git a/Jenkinsfile b/Jenkinsfile index 59bfac89..87218ac5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,7 +5,7 @@ pipeline { choice( name: 'ENV', choices: ['dev', 'preprod', 'prod'], - description: 'Choisir l’environnement de déploiement (automatique si branche correspondante)' + description: 'Choisir l’environnement de déploiement' ) } @@ -16,14 +16,11 @@ pipeline { stages { - /* ─────────────────────────────── - * 1️⃣ Init — Détection automatique de l’environnement - * ─────────────────────────────── */ stage('Init') { steps { script { def currentBranch = sh(script: "git rev-parse --abbrev-ref HEAD", returnStdout: true).trim() - echo "Branche détectée : ${currentBranch}" + echo "🧭 Branche détectée : ${currentBranch}" if (["dev", "preprod", "main"].contains(currentBranch)) { env.ENV = (currentBranch == "main") ? "prod" : currentBranch @@ -40,25 +37,18 @@ pipeline { 📂 Chemin de déploiement = ${env.DEPLOY_PATH} """ - // Vérifie le répertoire cible sh "ls -l ${env.DEPLOY_PATH} || echo '⚠️ Dossier non accessible depuis Jenkins'" } } } - /* ─────────────────────────────── - * 2️⃣ Checkout du code - * ─────────────────────────────── */ stage('Checkout') { steps { - echo "📦 Récupération du code source depuis Gitea..." + echo "📦 Récupération du code source..." checkout scm } } - /* ─────────────────────────────── - * 3️⃣ Tests & Qualité (dans un conteneur Node.js) - * ─────────────────────────────── */ stage('Tests & Qualité') { agent { docker { @@ -67,35 +57,28 @@ pipeline { } } steps { - echo "🧪 Lancement des tests et analyse de code..." + echo "🧪 Lancement des tests et analyse..." sh ''' npm ci npm run lint || echo "⚠️ Erreurs de lint détectées" - npm test || echo "⚠️ Tests échoués — vérifier les logs" + npm test || echo "⚠️ Tests échoués — ignorés pour le déploiement" ''' } } - /* ─────────────────────────────── - * 4️⃣ Build de l’image Docker - * ─────────────────────────────── */ stage('Build Docker image') { steps { - dir('the-tip-top-backend') { - sh """ - docker build -t ${REGISTRY_URL}/${IMAGE_NAME}:${TAG} . - docker tag ${REGISTRY_URL}/${IMAGE_NAME}:${TAG} ${REGISTRY_URL}/${IMAGE_NAME}:latest - """ - } + echo "🐳 Construction de l’image Docker backend..." + sh """ + docker build -t ${REGISTRY_URL}/${IMAGE_NAME}:${TAG} . + docker tag ${REGISTRY_URL}/${IMAGE_NAME}:${TAG} ${REGISTRY_URL}/${IMAGE_NAME}:latest + """ } } - /* ─────────────────────────────── - * 5️⃣ Push vers le registre privé - * ─────────────────────────────── */ stage('Push to Registry') { steps { - echo "📤 Envoi de l’image vers le registre Docker privé..." + echo "📤 Envoi de l’image vers le registre..." withCredentials([usernamePassword(credentialsId: 'registry-credentials', usernameVariable: 'REG_USER', passwordVariable: 'REG_PASS')]) { sh """ echo "$REG_PASS" | docker login ${REGISTRY_URL} -u "$REG_USER" --password-stdin @@ -106,28 +89,9 @@ pipeline { } } - /* ─────────────────────────────── - * 6️⃣ Backup avant déploiement - * ─────────────────────────────── */ - stage('Backup Before Deploy') { - steps { - echo "💾 Exécution du script de sauvegarde avant déploiement..." - sh ''' - if [ -f /srv/devops/the-tip-top/backup.sh ]; then - bash /srv/devops/the-tip-top/backup.sh - else - echo "⚠️ Aucun script backup.sh trouvé." - fi - ''' - } - } - - /* ─────────────────────────────── - * 7️⃣ Déploiement - * ─────────────────────────────── */ stage('Deploy') { steps { - echo "🚀 Déploiement du backend sur ${env.ENV}..." + echo "🚀 Déploiement sur ${env.ENV}..." sh """ cd "${DEPLOY_PATH}" docker compose pull backend @@ -136,13 +100,9 @@ pipeline { } } - /* ─────────────────────────────── - * 8️⃣ Vérification de santé (via /health) - * ─────────────────────────────── */ - * ─────────────────────────────── */ stage('Health Check') { steps { - echo "🩺 Vérification du backend après déploiement..." + echo "🩺 Vérification de l’état du backend..." script { def domain = (env.ENV == 'dev') ? "api.dev.dsp5-archi-o24a-15m-g3.fr" : (env.ENV == 'preprod') ? "api.preprod.dsp5-archi-o24a-15m-g3.fr" : @@ -152,26 +112,25 @@ pipeline { for (int i = 1; i <= 10; i++) { statusCode = sh(script: "curl -k -s -o /dev/null -w '%{http_code}' https://${domain}/health || echo 000", returnStdout: true).trim() if (statusCode in ['200', '301', '302']) { - echo "Backend ${env.ENV} OK (${statusCode})" + echo "✅ Backend ${env.ENV} opérationnel (HTTP ${statusCode})" return } + + echo "⏳ Tentative ${i}/10 → HTTP ${statusCode}" sleep 5 } - error("Health check échoué (${statusCode})") + error("❌ Health check échoué - code HTTP ${statusCode}") } } } } - /* ─────────────────────────────── - * 🔚 Post Actions - * ─────────────────────────────── */ post { success { - echo "✅ Pipeline backend ${env.ENV} terminé avec succès !" + echo "✅ Pipeline ${env.ENV} terminé avec succès !" } failure { - echo "❌ Échec du pipeline backend pour ${env.ENV}." + echo "❌ Échec du pipeline ${env.ENV}." } } }