name: Optimized Build and Deploy with Maintenance Window on: push: branches: - main jobs: remote-build-and-deploy: runs-on: ubuntu-latest 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 }} run: | set -e # Configura SSH apt-get update -qq && apt-get install -y openssh-client git mkdir -p ~/.ssh echo "${{ secrets.PROD_SERVER_SSH_KEY }}" > ~/.ssh/id_rsa 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' set -e echo "--- INICIO DEL DESPLIEGUE OPTIMIZADO ---" # --- SECCIÓN DE MONITOREO --- # 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 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" # 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}" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${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" 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 # Activamos el mantenimiento antes de tocar nada echo "--- Pausando monitoreo en Uptime Kuma ---" toggle_maintenance "$MAINTENANCE_ID" true # --- FIN SECCIÓN DE MONITOREO --- # 1. Preparar entorno (tu código original) TEMP_DIR=$(mktemp -d) REPO_OWNER="dmolinari" REPO_NAME="gestionintegralweb" GITEA_REPO_PATH="/var/lib/docker/volumes/gitea-stack_gitea-data/_data/git/repositories/${REPO_OWNER}/${REPO_NAME}.git" echo "Clonando repositorio desde: $GITEA_REPO_PATH ..." git clone "$GITEA_REPO_PATH" "$TEMP_DIR" cd "$TEMP_DIR" git checkout "${{ gitea.sha }}" # 2. Construcción paralela (tu código original) build_image() { local dockerfile=$1 local image_name=$2 local context=$3 echo "Construyendo $image_name..." 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) cd /opt/gestion-integral export DB_SA_PASSWORD='${DB_SA_PASSWORD_SECRET}' 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) 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