the-tip-top-frontend/Jenkinsfile

143 lines
4.6 KiB
Groovy
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

pipeline {
agent any
parameters {
choice(
name: 'ENV',
choices: ['dev', 'preprod', 'prod'],
description: 'Choisir lenvironnement de déploiement'
)
}
environment {
REGISTRY_URL = "registry.wk-archi-o24a-15m-g3.fr"
IMAGE_NAME = "the-tip-top-frontend"
}
stages {
stage('Init') {
steps {
script {
def currentBranch = sh(script: "git rev-parse --abbrev-ref HEAD", returnStdout: true).trim()
echo "🧭 Branche détectée : ${currentBranch}"
if (["dev", "preprod", "main"].contains(currentBranch)) {
env.ENV = (currentBranch == "main") ? "prod" : currentBranch
} else {
env.ENV = params.ENV ?: "dev"
}
env.TAG = "${env.ENV}-latest"
env.DEPLOY_PATH = "/srv/devops/the-tip-top/${env.ENV}"
echo """
🌍 Environnement = ${env.ENV}
🏷️ Tag Docker = ${env.TAG}
📂 Chemin de déploiement = ${env.DEPLOY_PATH}
"""
}
}
}
stage('Checkout') {
steps {
echo "📦 Récupération du code source..."
checkout scm
}
}
stage('Tests & Qualité') {
agent {
docker {
image 'node:20'
args '-u root'
}
}
steps {
echo "🧪 Lancement des tests et analyse du code..."
sh '''
npm ci
npm run lint || echo "⚠️ Erreurs ESLint détectées"
npm test || echo "⚠️ Tests échoués — à vérifier"
'''
}
}
stage('Build Frontend') {
agent {
docker {
image 'node:20'
args '-u root'
}
}
steps {
echo "⚙️ Build de lapplication Next.js..."
sh '''
npm ci
npm run build
'''
}
}
stage('Build Docker image') {
steps {
echo "🐳 Construction de limage Docker frontend..."
sh """
docker build -t ${REGISTRY_URL}/${IMAGE_NAME}:${env.TAG} .
docker tag ${REGISTRY_URL}/${IMAGE_NAME}:${env.TAG} ${REGISTRY_URL}/${IMAGE_NAME}:latest
"""
}
}
stage('Push to Registry') {
steps {
echo "📤 Envoi de limage vers le registre Docker..."
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}:${env.TAG}
docker push ${REGISTRY_URL}/${IMAGE_NAME}:latest
"""
}
}
}
stage('Backup before deploy') {
steps {
echo "💾 Sauvegarde avant déploiement (${env.ENV})..."
sh '''
BACKUP_DIR="/srv/backups/the-tip-top/${ENV}/$(date +%F_%H-%M-%S)"
mkdir -p $BACKUP_DIR
echo "📦 Sauvegarde du docker-compose et logs..."
cp -r ${DEPLOY_PATH}/docker-compose.yml $BACKUP_DIR/ 2>/dev/null || true
cp -r ${DEPLOY_PATH}/logs $BACKUP_DIR/ 2>/dev/null || true
tar -czf ${BACKUP_DIR}.tar.gz -C $(dirname $BACKUP_DIR) $(basename $BACKUP_DIR)
rm -rf $BACKUP_DIR
echo "✅ Sauvegarde compressée : ${BACKUP_DIR}.tar.gz"
'''
}
}
stage('Deploy') {
steps {
echo "🚀 Déploiement du frontend sur ${env.ENV}..."
sh """
cd "${env.DEPLOY_PATH}"
docker compose pull frontend
docker compose up -d --no-deps --force-recreate frontend
"""
}
}
}
post {
success {
echo "✅ Pipeline frontend ${env.ENV} terminé avec succès !"
}
failure {
echo "❌ Échec du pipeline frontend (${env.ENV})."
}
}
}