106 lines
2.9 KiB
Groovy
106 lines
2.9 KiB
Groovy
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'
|
||
// Tag stable
|
||
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 code = sh(script: "curl -k -s -o /dev/null -w '%{http_code}' https://dsp5-archi-o24a-15m-g3.fr", returnStdout: true).trim()
|
||
if (code != '200') { error "Le frontend ne répond pas correctement (HTTP ${code})" }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
post {
|
||
success { echo "✅ Déploiement du frontend réussi !" }
|
||
failure { echo "❌ Échec du pipeline frontend." }
|
||
}
|
||
stage('Health Check') {
|
||
steps {
|
||
echo "🩺 Vérification de la disponibilité du frontend..."
|
||
script {
|
||
def success = false
|
||
for (int i = 1; i <= 3; 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.")
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|