Fix Jenkinsfile: force recreate + health check

This commit is contained in:
soufiane 2025-10-30 23:32:49 +01:00
parent cd9f7613ad
commit 41c4f63ead

176
Jenkinsfile vendored
View File

@ -1,86 +1,112 @@
pipeline { pipeline {
agent any agent any
environment { environment {
REGISTRY = "registry.wk-archi-o24a-15m-g3.fr" REGISTRY_URL = "registry.wk-archi-o24a-15m-g3.fr"
IMAGE_NAME = "the-tip-top-backend" IMAGE_NAME = "the-tip-top-frontend"
APP_PATH = "/srv/devops/the-tip-top" CONTAINER_NAME = "the-tip-top-frontend"
DEPLOY_HOST = "localhost" DEPLOY_PATH = "/srv/devops/the-tip-top"
} DOMAIN = "dsp5-archi-o24a-15m-g3.fr"
API_URL = "https://api.${DOMAIN}"
stages {
stage('Checkout') {
steps {
echo "📦 Récupération du code source..."
checkout scm
}
} }
stage('Build Docker image') { stages {
steps { stage('Checkout') {
echo "🐳 Construction de limage Docker backend..." steps {
sh ''' echo "📦 Récupération du code source depuis Gitea..."
docker build -t $REGISTRY/$IMAGE_NAME:${BUILD_NUMBER} . checkout scm
docker tag $REGISTRY/$IMAGE_NAME:${BUILD_NUMBER} $REGISTRY/$IMAGE_NAME:latest }
'''
}
}
stage('Push to Registry') {
steps {
echo "📤 Envoi de limage 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
'''
} }
}
}
stage('Deploy') { stage('Install dependencies') {
steps { steps {
echo "🚀 Déploiement du backend..." echo "📦 Installation des dépendances NPM..."
sh ''' sh 'npm ci'
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 !"
}
} }
}
}
}
post { stage('Build Next.js') {
success { steps {
echo "✅ Déploiement backend terminé avec succès !" echo "⚙️ Compilation de lapplication Next.js (production)..."
sh 'npm run build'
}
}
stage('Build Docker image') {
steps {
echo "🐳 Construction de limage 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 limage 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."
}
} }
}
} }