pipeline { agent { docker { image 'node:20' args '-v /var/run/docker.sock:/var/run/docker.sock' } } environment { APP_NAME = "the-tip-top-frontend" REGISTRY = "registry.wk-archi-o24a-15m-g3.fr" IMAGE = "${REGISTRY}/${APP_NAME}:${BUILD_NUMBER}" DEPLOY_PATH = "/srv/devops/the-tip-top" } stages { stage('Checkout') { steps { echo "📦 Récupération du code source depuis Gitea..." checkout scm } } stage('Install dependencies') { steps { echo "📦 Installation des dépendances NPM..." sh 'npm ci' } } stage('Build Next.js') { steps { echo "⚙️ Build 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 ${IMAGE} .' } } stage('Push to Registry') { steps { echo "📤 Envoi de l’image vers le registry privé..." withCredentials([usernamePassword(credentialsId: 'registry-creds', usernameVariable: 'USER', passwordVariable: 'PASS')]) { sh 'echo $PASS | docker login $REGISTRY -u $USER --password-stdin' sh 'docker push $IMAGE' sh 'docker tag ${IMAGE} ${REGISTRY}/${APP_NAME}:latest' sh 'docker push ${REGISTRY}/${APP_NAME}:latest' } } } stage('Deploy') { steps { echo "🚀 Déploiement du frontend via Docker Compose..." sh """ cd ${DEPLOY_PATH} docker compose pull frontend docker compose up -d --no-deps --build frontend """ } } stage('Health Check') { steps { echo "🩺 Vérification de la disponibilité du frontend..." script { def success = false for (int i = 1; i <= 5; i++) { echo "⏳ Tentative #${i} de vérification (attente ${i * 10}s)..." sh "sleep ${i * 10}" def code = sh(script: "curl -k -s -o /dev/null -w '%{http_code}' https://dsp5-archi-o24a-15m-g3.fr", returnStdout: true).trim() echo "Réponse HTTP : ${code}" if (code == '200' || code == '301' || code == '302') { success = true break } } if (!success) { error("❌ Le frontend ne répond pas après plusieurs tentatives.") } else { echo "✅ Le frontend est disponible !" } } } } post { success { echo "✅ Déploiement du frontend réussi !" } failure { echo "❌ Échec du pipeline frontend." } } }