diff --git a/Jenkinsfile b/Jenkinsfile index feb76744..584f9558 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,36 +1,56 @@ pipeline { agent any - // πŸ” VΓ©rifie automatiquement toutes les 2 minutes s’il y a des commits sur Gitea + // πŸ” VΓ©rifie toutes les 2 minutes si du nouveau code a Γ©tΓ© poussΓ© triggers { pollSCM('H/2 * * * *') } - // βš™οΈ Choix de l’environnement de dΓ©ploiement (par dΓ©faut : dev) + // βš™οΈ ParamΓ¨tre manuel (fallback) parameters { choice( name: 'ENV', choices: ['dev', 'preprod', 'prod'], - description: 'Choisir l’environnement de dΓ©ploiement' + description: 'Choisir l’environnement de dΓ©ploiement (automatique si branche correspondante)' ) } - // 🌍 Variables globales environment { - REGISTRY_URL = "registry.wk-archi-o24a-15m-g3.fr" - IMAGE_NAME = "the-tip-top-backend" - - // DΓ©duit automatiquement ENV Γ  partir de la branche Git - ENV = sh(script: "git rev-parse --abbrev-ref HEAD", returnStdout: true).trim() - TAG = "${ENV}-latest" - DEPLOY_PATH = "/srv/devops/the-tip-top/${ENV}" -} + REGISTRY_URL = "registry.wk-archi-o24a-15m-g3.fr" + IMAGE_NAME = "the-tip-top-backend" + } stages { - /* ─────────────────────────────── - * 1️⃣ RΓ©cupΓ©ration du code source + * 1️⃣ Init β€” DΓ©tection automatique de l’environnement * ─────────────────────────────── */ + stage('Init') { + steps { + script { + // πŸ” DΓ©termine la branche Git courante + def currentBranch = sh(script: "git rev-parse --abbrev-ref HEAD", returnStdout: true).trim() + echo "🧭 Branche dΓ©tectΓ©e : ${currentBranch}" + + // 🧩 Si la branche correspond Γ  un environnement connu, on l’utilise + if (["dev", "preprod", "main"].contains(currentBranch)) { + env.ENV = (currentBranch == "main") ? "prod" : currentBranch + } else { + env.ENV = params.ENV ?: "dev" + } + + // 🧱 Variables de dΓ©ploiement dΓ©rivΓ©es + 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 depuis Gitea..." @@ -38,9 +58,6 @@ pipeline { } } - /* ─────────────────────────────── - * 2️⃣ Tests de qualitΓ© et unitaires - * ─────────────────────────────── */ stage('Tests & QualitΓ©') { steps { echo "πŸ§ͺ Lancement des tests et analyse de code..." @@ -52,20 +69,6 @@ pipeline { } } - /* ─────────────────────────────── - * 3️⃣ Informations sur l’environnement - * ─────────────────────────────── */ - stage('Show Environment Info') { - steps { - echo "🌍 Environnement : ${params.ENV}" - echo "πŸ“¦ Image : ${REGISTRY_URL}/${IMAGE_NAME}:${TAG}" - echo "πŸ“‚ Dossier de dΓ©ploiement : ${DEPLOY_PATH}" - } - } - - /* ─────────────────────────────── - * 4️⃣ Construction de l’image Docker - * ─────────────────────────────── */ stage('Build Docker image') { steps { echo "🐳 Construction de l’image Docker backend..." @@ -76,9 +79,6 @@ pipeline { } } - /* ─────────────────────────────── - * 5️⃣ Envoi de l’image au registre privΓ© - * ─────────────────────────────── */ stage('Push to Registry') { steps { echo "πŸ“€ Envoi de l’image vers le registre Docker privΓ©..." @@ -92,91 +92,65 @@ pipeline { } } - /* ─────────────────────────────── - * 6️⃣ Sauvegarde avant dΓ©ploiement - * ─────────────────────────────── */ stage('Backup Before Deploy') { steps { echo "πŸ’Ύ ExΓ©cution du script de sauvegarde avant dΓ©ploiement..." sh ''' if [ -f /srv/devops/the-tip-top/backup.sh ]; then - echo "▢️ Lancement du script de sauvegarde..." bash /srv/devops/the-tip-top/backup.sh else - echo "⚠️ Aucun script backup.sh trouvΓ©, dΓ©ploiement sans sauvegarde." + echo "⚠️ Aucun script backup.sh trouvΓ©." fi ''' } } - /* ─────────────────────────────── - * 7️⃣ DΓ©ploiement Docker Compose - * ─────────────────────────────── */ stage('Deploy') { steps { - echo "πŸš€ DΓ©ploiement du backend sur ${params.ENV}..." + echo "πŸš€ DΓ©ploiement du backend sur ${env.ENV}..." sh ''' if [ ! -f "${DEPLOY_PATH}/docker-compose.yml" ]; then echo "❌ Fichier docker-compose.yml introuvable dans ${DEPLOY_PATH}" exit 1 fi - echo "πŸ“ DΓ©ploiement dans ${DEPLOY_PATH}..." cd "${DEPLOY_PATH}" - - echo "⬇️ RΓ©cupΓ©ration de la derniΓ¨re image..." docker compose pull backend - - echo "πŸ” RedΓ©marrage du conteneur backend..." docker compose up -d --force-recreate backend ''' } } - /* ─────────────────────────────── - * 8️⃣ VΓ©rification du dΓ©ploiement - * ─────────────────────────────── */ stage('Health Check') { steps { echo "🩺 VΓ©rification du backend aprΓ¨s dΓ©ploiement..." script { - def domain = (params.ENV == 'dev') ? "api.dev.dsp5-archi-o24a-15m-g3.fr" : - (params.ENV == 'preprod') ? "api.preprod.dsp5-archi-o24a-15m-g3.fr" : + def domain = (env.ENV == 'dev') ? "api.dev.dsp5-archi-o24a-15m-g3.fr" : + (env.ENV == 'preprod') ? "api.preprod.dsp5-archi-o24a-15m-g3.fr" : "api.dsp5-archi-o24a-15m-g3.fr" - 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}/health || echo 000", - returnStdout: true - ).trim() - + for (int i = 1; i <= 10; i++) { + statusCode = sh(script: "curl -k -s -o /dev/null -w '%{http_code}' https://${domain}/health || echo 000", returnStdout: true).trim() if (statusCode in ['200', '301', '302']) { - echo "βœ… Backend ${params.ENV} opΓ©rationnel (HTTP ${statusCode}) aprΓ¨s ${i} essai(s)" + echo "βœ… Backend ${env.ENV} opΓ©rationnel (HTTP ${statusCode})" return - } else { - echo "⏳ Tentative ${i}/${maxRetries} β†’ HTTP ${statusCode}" - sleep(time: 5, unit: 'SECONDS') } + echo "⏳ Tentative ${i}/10 β†’ HTTP ${statusCode}" + sleep 5 } - - error("❌ Health check Γ©chouΓ© sur ${params.ENV} - code HTTP ${statusCode}") + error("❌ Health check Γ©chouΓ© - code HTTP ${statusCode}") } } } } - /* ─────────────────────────────── - * πŸ”š Post actions - * ─────────────────────────────── */ post { success { - echo "βœ… Pipeline backend ${params.ENV} terminΓ© avec succΓ¨s !" + echo "βœ… Pipeline backend ${env.ENV} terminΓ© avec succΓ¨s !" } failure { - echo "❌ Γ‰chec du pipeline backend pour ${params.ENV}." + echo "❌ Γ‰chec du pipeline backend pour ${env.ENV}." } } }