From 673fd55037b2fa6e64d0cee81ce011440556df0e Mon Sep 17 00:00:00 2001 From: dmolinari Date: Tue, 24 Jun 2025 21:37:45 -0300 Subject: [PATCH] Fix Deploy 2137 --- .gitea/workflows/deploy.yml | 77 +++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 075804b..0cf34bc 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -11,13 +11,7 @@ jobs: steps: - name: Run Optimized CI/CD Process on Host via SSH - # Pasamos los nuevos secretos al entorno del script SSH - env: - UPTIME_KUMA_URL: ${{ secrets.UPTIME_KUMA_URL }} - UPTIME_KUMA_API_KEY: ${{ secrets.UPTIME_KUMA_API_KEY }} - UPTIME_KUMA_MAINTENANCE_ID: ${{ secrets.UPTIME_KUMA_MAINTENANCE_ID }} - DB_SA_PASSWORD_SECRET: ${{ secrets.DB_SA_PASSWORD_SECRET }} - + # La sección 'env' aquí ya no es necesaria, pasamos los secretos directamente run: | set -e @@ -28,55 +22,62 @@ jobs: chmod 600 ~/.ssh/id_rsa ssh-keyscan -H ${{ secrets.PROD_SERVER_HOST }} >> ~/.ssh/known_hosts - # Ejecuta en el host remoto - ssh ${{ secrets.PROD_SERVER_USER }}@${{ secrets.PROD_SERVER_HOST }} << 'EOSSH' + # --- ¡CAMBIO CLAVE AQUÍ! --- + # Inyectamos los secretos como variables de entorno para el comando remoto + # Y luego ejecutamos el script del heredoc con 'bash -s' + ssh ${{ secrets.PROD_SERVER_USER }}@${{ secrets.PROD_SERVER_HOST }} " + export UPTIME_KUMA_URL='${{ secrets.UPTIME_KUMA_URL }}' + export UPTIME_KUMA_API_KEY='${{ secrets.UPTIME_KUMA_API_KEY }}' + export UPTIME_KUMA_MAINTENANCE_ID='${{ secrets.UPTIME_KUMA_MAINTENANCE_ID }}' + export DB_SA_PASSWORD='${{ secrets.DB_SA_PASSWORD_SECRET }}' + export GITEA_SHA='${{ gitea.sha }}' + bash -s + " << 'EOSSH' set -e echo "--- INICIO DEL DESPLIEGUE OPTIMIZADO ---" # --- SECCIÓN DE MONITOREO --- + # Las variables (UPTIME_KUMA_URL, etc.) ahora están disponibles gracias al comando 'export' anterior. + # Instalar curl y jq si no están presentes if ! command -v curl &> /dev/null || ! command -v jq &> /dev/null; then echo "Instalando curl y jq..." - apt-get update -qq && apt-get install -y curl jq + # Usar 'sudo' si el usuario no es root + sudo apt-get update -qq && sudo apt-get install -y curl jq fi - # Variables de Uptime Kuma (vienen de los secretos de Gitea) - KUMA_URL="${UPTIME_KUMA_URL}" - KUMA_API_KEY="${UPTIME_KUMA_API_KEY}" - MAINTENANCE_ID="${UPTIME_KUMA_MAINTENANCE_ID}" - # Función para cambiar el estado de la ventana de mantenimiento - # $1: El ID de la ventana - # $2: 'true' para activar, 'false' para desactivar toggle_maintenance() { local id=$1 local active_state=$2 - echo "Cambiando estado de mantenimiento a: $active_state" + echo "Cambiando estado de mantenimiento de la ventana ID:${id} a: ${active_state}" - # La API de Kuma para editar mantenimiento es un PATCH a /api/maintenance/{id} - local response=$(curl -s -w "%{http_code}" -X PATCH "${KUMA_URL}/api/maintenances/${id}" \ + # Corregido: el endpoint es '/maintenances/' (plural) + local response=$(curl -s -w "%{http_code}" -X PATCH "${UPTIME_KUMA_URL}/api/maintenances/${id}" \ -H "Content-Type: application/json" \ - -H "Authorization: Bearer ${KUMA_API_KEY}" \ + -H "Authorization: Bearer ${UPTIME_KUMA_API_KEY}" \ --data-raw "{\"active\": ${active_state}}") local http_code=$(tail -n1 <<< "$response") if [ "$http_code" -ne 200 ]; then - echo "Error al interactuar con la API de Uptime Kuma. Código: $http_code" + echo "Error al interactuar con la API de Uptime Kuma. Código HTTP: $http_code" + # Opcional: imprimir el cuerpo de la respuesta para más detalles + echo "Cuerpo de la respuesta: $(head -n -1 <<< "$response")" return 1 fi echo "Estado de mantenimiento actualizado con éxito." } - # ¡MUY IMPORTANTE! Usamos 'trap' para asegurar que el monitoreo se reanude - # incluso si el despliegue falla a la mitad. - trap 'echo "--- Limpiando: Reanudando monitoreo ---"; toggle_maintenance "$MAINTENANCE_ID" false' EXIT + # Usamos 'trap' para asegurar que el monitoreo se reanude siempre. + trap 'echo "--- Limpiando: Reanudando monitoreo ---"; toggle_maintenance "$UPTIME_KUMA_MAINTENANCE_ID" false' EXIT - # Activamos el mantenimiento antes de tocar nada + # Activamos el mantenimiento echo "--- Pausando monitoreo en Uptime Kuma ---" - toggle_maintenance "$MAINTENANCE_ID" true + toggle_maintenance "$UPTIME_KUMA_MAINTENANCE_ID" true + # --- FIN SECCIÓN DE MONITOREO --- - # 1. Preparar entorno (tu código original) + # 1. Preparar entorno TEMP_DIR=$(mktemp -d) REPO_OWNER="dmolinari" REPO_NAME="gestionintegralweb" @@ -85,39 +86,33 @@ jobs: echo "Clonando repositorio desde: $GITEA_REPO_PATH ..." git clone "$GITEA_REPO_PATH" "$TEMP_DIR" cd "$TEMP_DIR" - git checkout "${{ gitea.sha }}" + # La variable GITEA_SHA fue exportada antes del heredoc + git checkout "$GITEA_SHA" - # 2. Construcción paralela (tu código original) + # 2. Construcción paralela build_image() { local dockerfile=$1 local image_name=$2 local context=$3 - echo "Construyendo $image_name..." - docker build \ - -t "$image_name" \ - -f "$dockerfile" \ - "$context" + docker build -t "$image_name" -f "$dockerfile" "$context" } - echo "Construyendo imágenes en paralelo..." (build_image "Backend/GestionIntegral.Api/Dockerfile" "dmolinari/gestionintegralweb-backend:latest" ".") & (build_image "Frontend/Dockerfile" "dmolinari/gestionintegralweb-frontend:latest" ".") & wait - # 3. Despliegue con Docker Compose (tu código original) + # 3. Despliegue con Docker Compose cd /opt/gestion-integral - export DB_SA_PASSWORD='${DB_SA_PASSWORD_SECRET}' - + # La variable DB_SA_PASSWORD ya fue exportada al inicio. echo "--- INICIO DE LA RECREACIÓN DE SERVICIOS (MONITOREO PAUSADO) ---" docker compose up -d --force-recreate echo "--- FIN DE LA RECREACIÓN DE SERVICIOS ---" - # 4. Limpieza (tu código original) + # 4. Limpieza echo "Realizando limpieza de imágenes..." rm -rf "$TEMP_DIR" docker image prune -af --filter "until=24h" echo "--- DESPLIEGUE COMPLETADO CON ÉXITO ---" - # El 'trap' se ejecutará automáticamente aquí para reanudar el monitoreo EOSSH \ No newline at end of file