From 41c4f63eade5f66db3f75a17f9abdad09c193e86 Mon Sep 17 00:00:00 2001 From: soufiane Date: Thu, 30 Oct 2025 23:32:49 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20Fix=20Jenkinsfile:=20force=20recrea?= =?UTF-8?q?te=20+=20health=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 176 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 101 insertions(+), 75 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 8f6fb797..83fbe78b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,86 +1,112 @@ pipeline { - agent any + agent any - environment { - REGISTRY = "registry.wk-archi-o24a-15m-g3.fr" - IMAGE_NAME = "the-tip-top-backend" - APP_PATH = "/srv/devops/the-tip-top" - DEPLOY_HOST = "localhost" - } - - stages { - - stage('Checkout') { - steps { - echo "📩 RĂ©cupĂ©ration du code source..." - checkout scm - } + environment { + REGISTRY_URL = "registry.wk-archi-o24a-15m-g3.fr" + IMAGE_NAME = "the-tip-top-frontend" + CONTAINER_NAME = "the-tip-top-frontend" + DEPLOY_PATH = "/srv/devops/the-tip-top" + DOMAIN = "dsp5-archi-o24a-15m-g3.fr" + API_URL = "https://api.${DOMAIN}" } - stage('Build Docker image') { - steps { - echo "🐳 Construction de l’image Docker backend..." - sh ''' - docker build -t $REGISTRY/$IMAGE_NAME:${BUILD_NUMBER} . - docker tag $REGISTRY/$IMAGE_NAME:${BUILD_NUMBER} $REGISTRY/$IMAGE_NAME:latest - ''' - } - } - - stage('Push to Registry') { - steps { - echo "đŸ“€ Envoi de l’image vers le registre privĂ©..." - withCredentials([usernamePassword(credentialsId: 'registry-credentials', usernameVariable: 'REG_USER', passwordVariable: 'REG_PASS')]) { - sh ''' - echo "$REG_PASS" | docker login $REGISTRY -u $REG_USER --password-stdin - docker push $REGISTRY/$IMAGE_NAME:${BUILD_NUMBER} - docker push $REGISTRY/$IMAGE_NAME:latest - ''' + stages { + stage('Checkout') { + steps { + echo "📩 RĂ©cupĂ©ration du code source depuis Gitea..." + checkout scm + } } - } - } - stage('Deploy') { - steps { - echo "🚀 DĂ©ploiement du backend..." - sh ''' - if [ ! -f $APP_PATH/docker-compose.yml ]; then - echo "❌ Fichier docker-compose.yml introuvable !" >&2 - exit 1 - fi - - cd $APP_PATH - docker compose pull backend - docker compose up -d --force-recreate backend - ''' - } - } - - stage('Health Check') { - steps { - echo "đŸ©ș VĂ©rification du backend aprĂšs dĂ©ploiement..." - script { - def statusCode = sh( - script: "curl -k -s -o /dev/null -w '%{http_code}' https://api.dsp5-archi-o24a-15m-g3.fr || echo 000", - returnStdout: true - ).trim() - - if (statusCode != '200') { - error("❌ Health check Ă©chouĂ© - code HTTP ${statusCode}") - } else { - echo "✅ Health check rĂ©ussi - backend opĂ©rationnel !" - } + stage('Install dependencies') { + steps { + echo "📩 Installation des dĂ©pendances NPM..." + sh 'npm ci' + } } - } - } - } - post { - success { - echo "✅ DĂ©ploiement backend terminĂ© avec succĂšs !" + stage('Build Next.js') { + steps { + echo "⚙ Compilation de l’application Next.js (production)..." + sh 'npm run build' + } + } + + stage('Build Docker image') { + steps { + echo "🐳 Construction de l’image Docker frontend..." + sh ''' + docker build -t ${REGISTRY_URL}/${IMAGE_NAME}:${BUILD_NUMBER} . + docker tag ${REGISTRY_URL}/${IMAGE_NAME}:${BUILD_NUMBER} ${REGISTRY_URL}/${IMAGE_NAME}:latest + ''' + } + } + + stage('Push to Registry') { + steps { + echo "đŸ“€ Envoi de l’image vers le registre privĂ©..." + withCredentials([usernamePassword(credentialsId: 'registry-credentials', usernameVariable: 'REG_USER', passwordVariable: 'REG_PASS')]) { + sh ''' + echo "$REG_PASS" | docker login ${REGISTRY_URL} -u "$REG_USER" --password-stdin + docker push ${REGISTRY_URL}/${IMAGE_NAME}:${BUILD_NUMBER} + docker push ${REGISTRY_URL}/${IMAGE_NAME}:latest + ''' + } + } + } + + stage('Deploy') { + steps { + echo "🚀 DĂ©ploiement du frontend..." + sh ''' + if [ ! -f ${DEPLOY_PATH}/docker-compose.yml ]; then + echo "❌ Fichier docker-compose.yml introuvable dans ${DEPLOY_PATH}" + exit 1 + fi + + cd ${DEPLOY_PATH} + docker compose pull frontend + docker compose up -d --force-recreate frontend + ''' + } + } + + stage('Health Check') { + steps { + echo "đŸ©ș VĂ©rification du frontend aprĂšs dĂ©ploiement..." + script { + def maxRetries = 10 + def statusCode = "000" + + for (int i = 1; i <= maxRetries; i++) { + statusCode = sh( + script: "curl -k -s -o /dev/null -w '%{http_code}' https://${DOMAIN}/ || echo 000", + returnStdout: true + ).trim() + + if (statusCode == '200') { + echo "✅ Frontend opĂ©rationnel (HTTP ${statusCode}) aprĂšs ${i} essai(s)" + break + } else { + echo "⏳ Tentative ${i}/${maxRetries} → HTTP ${statusCode}" + sleep 5 + } + } + + if (statusCode != '200') { + error("❌ Health check Ă©chouĂ© - code HTTP ${statusCode}") + } + } + } + } } - failure { - echo "❌ Échec du pipeline backend." + + post { + success { + echo "✅ Pipeline frontend terminĂ© avec succĂšs !" + } + failure { + echo "❌ Échec du pipeline frontend." + } } - } }