pipeline { agent any stages { stage('Configurar Entorno') { steps { script { // Selección de configuración según la rama if (env.BRANCH_NAME == 'master') { env.PROJECT_NAME = "django_master" env.APP_CONTAINER_NAME = "django_app_master" env.PORT = "8001" env.DEBUG_MODE = "0" env.ENV_CREDENTIAL_ID = "2" } else if (env.BRANCH_NAME == 'dev') { env.PROJECT_NAME = "django_dev" env.APP_CONTAINER_NAME = "django_app_dev" env.PORT = "8000" env.DEBUG_MODE = "1" env.ENV_CREDENTIAL_ID = "1" } } } } stage('Fase Final: Containerización') { when { anyOf { branch 'dev'; branch 'master' } } steps { withCredentials([file(credentialsId: env.ENV_CREDENTIAL_ID, variable: 'SECRET_ENV')]) { sh """ echo "--> Preparando configuración segura..." cp \$SECRET_ENV deployments/.env echo "--> 🚀 DESPLEGANDO PROYECTO: ${env.PROJECT_NAME}" # 1. Limpieza de contenedores previos para evitar conflictos de nombres docker compose -p ${env.PROJECT_NAME} -f deployments/docker-compose.yml down --remove-orphans # 2. Despliegue forzando la lectura del archivo .env específico # CRÍTICO: --env-file asegura que DATABASE_EXPOSE_PORT se lea correctamente docker compose \ -p ${env.PROJECT_NAME} \ -f deployments/docker-compose.yml \ --env-file deployments/.env \ up -d --build web """ } } } } post { success { echo "✅ Despliegue de ${env.BRANCH_NAME} completado con éxito." sh "rm -f deployments/.env" } failure { echo "❌ Error en el despliegue de ${env.BRANCH_NAME}." sh "rm -f deployments/.env" } } }