diff --git a/.gitea/workflows/deployment.yml b/.gitea/workflows/deployment.yml index f2792d8..d4868ed 100644 --- a/.gitea/workflows/deployment.yml +++ b/.gitea/workflows/deployment.yml @@ -8,17 +8,15 @@ on: - master workflow_dispatch: -# Otorga permiso de lectura al token del workflow (necesario para el checkout) permissions: contents: read jobs: build-and-deploy: - # Usamos la etiqueta que configuramos en el runner (production-ready:host) runs-on: [production-ready] steps: - # PASO 1: Instalar Node.js manualmente (requerido por las acciones de GitHub) + # PASO 1: Instalar Node.js (requerido por las acciones de GitHub) - name: 📦 Instalar Node.js shell: bash run: | @@ -26,21 +24,12 @@ jobs: if ! command -v node &> /dev/null; then echo "Node.js no encontrado, instalando..." - # Detectar el sistema operativo if [ -f /etc/debian_version ]; then - # Debian/Ubuntu curl -fsSL https://deb.nodesource.com/setup_20.x | bash - apt-get install -y nodejs - elif [ -f /etc/redhat-release ]; then - # RedHat/CentOS/Fedora - curl -fsSL https://rpm.nodesource.com/setup_20.x | bash - - yum install -y nodejs elif [ -f /etc/alpine-release ]; then - # Alpine Linux apk add --no-cache nodejs npm else - echo "Sistema operativo no soportado, intentando instalación genérica..." - # Intentar con nvm como fallback curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" @@ -50,7 +39,6 @@ jobs: echo "Node.js ya está instalado: $(node --version)" fi - # Verificar instalación node --version npm --version @@ -60,85 +48,46 @@ jobs: with: fetch-depth: 0 - # PASO 3: Detener y eliminar contenedores anteriores - - name: 🛑 Detener Contenedores Anteriores + # PASO 3: Ejecutar script de deployment en el host + - name: 🎯 Ejecutar Deployment shell: bash run: | - echo "Deteniendo contenedores existentes..." - docker compose -f docker-compose_prod.yml down || true + echo "🚀 Ejecutando script de deployment..." - # Limpieza de contenedores huérfanos - docker container prune -f || true + # Copiar archivos al directorio del proyecto en el host + # El runner ya tiene el código en su workspace + WORKSPACE_DIR=$(pwd) + PROJECT_DIR="/home/marti/Documentos/Gitea/resistencia" - echo "Contenedores anteriores detenidos y eliminados" - - # PASO 4: Limpiar imágenes antiguas (opcional pero recomendado) - - name: 🧹 Limpiar Imágenes Antiguas - shell: bash - run: | - echo "Limpiando imágenes sin usar..." - docker image prune -f || true - echo "Limpieza completada" - - # PASO 5: Construir las imágenes Docker - - name: 🔨 Construir Imágenes Docker - shell: bash - run: | - echo "Construyendo imágenes con docker-compose_prod.yml..." - docker compose -f docker-compose_prod.yml build --no-cache + echo "📂 Workspace del runner: $WORKSPACE_DIR" + echo "📂 Directorio del proyecto: $PROJECT_DIR" - # Etiquetar con el SHA del commit para trazabilidad - TAG_VERSION="${{ gitea.sha }}" - - docker tag resistencia-client:latest resistencia-client:${TAG_VERSION} - docker tag resistencia-server:latest resistencia-server:${TAG_VERSION} - - echo "✅ Imágenes construidas:" - echo " - resistencia-client:latest (${TAG_VERSION})" - echo " - resistencia-server:latest (${TAG_VERSION})" - - # PASO 6: Desplegar los contenedores - - name: 📦 Desplegar Aplicación - shell: bash - run: | - echo "Desplegando aplicación con docker-compose_prod.yml..." - docker compose -f docker-compose_prod.yml up -d - - echo "✅ Aplicación desplegada exitosamente" - echo "" - echo "📊 Estado de los contenedores:" - docker compose -f docker-compose_prod.yml ps - - # PASO 7: Verificar que los contenedores están corriendo - - name: ✅ Verificar Despliegue - shell: bash - run: | - echo "Esperando 10 segundos para que los contenedores inicien..." - sleep 10 - - echo "Verificando estado de los contenedores..." - docker compose -f docker-compose_prod.yml ps - - # Verificar que los contenedores están corriendo - if [ $(docker compose -f docker-compose_prod.yml ps -q | wc -l) -eq 0 ]; then - echo "❌ ERROR: No hay contenedores corriendo" - docker compose -f docker-compose_prod.yml logs - exit 1 + # Copiar el código actualizado al directorio del proyecto + # (esto asume que el runner tiene acceso al filesystem del host) + if [ "$WORKSPACE_DIR" != "$PROJECT_DIR" ]; then + echo "📋 Copiando archivos actualizados..." + rsync -av --exclude='.git' --exclude='node_modules' "$WORKSPACE_DIR/" "$PROJECT_DIR/" || \ + cp -r "$WORKSPACE_DIR/"* "$PROJECT_DIR/" || \ + echo "⚠️ No se pudo copiar, asumiendo que ya estamos en el directorio correcto" fi - echo "✅ Verificación completada" - echo "" - echo "🌐 Aplicación disponible en:" - echo " - Frontend: https://franciaocupada.martivich.es" - echo " - API: https://api.franciaocupada.martivich.es" - - # PASO 8: Mostrar logs recientes (útil para debugging) - - name: 📋 Mostrar Logs Recientes + # Ejecutar el script de deployment + cd "$PROJECT_DIR" + chmod +x deploy.sh + ./deploy.sh + + # PASO 4: Verificación Final + - name: ✅ Verificación Final if: always() shell: bash run: | - echo "Logs del cliente (últimas 50 líneas):" - docker compose -f docker-compose_prod.yml logs --tail=50 client || true + PROJECT_DIR="/home/marti/Documentos/Gitea/resistencia" + cd "$PROJECT_DIR" + + echo "📊 Estado final de los contenedores:" + docker compose -f docker-compose_prod.yml ps || echo "No se pudo verificar el estado" + echo "" - echo "Logs del servidor (últimas 50 líneas):" - docker compose -f docker-compose_prod.yml logs --tail=50 server || true + echo "🌐 URLs de la aplicación:" + echo " - Frontend: https://franciaocupada.martivich.es" + echo " - API: https://api.franciaocupada.martivich.es" diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..540e18a --- /dev/null +++ b/deploy.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Script de deployment para Francia Ocupada +# Este script se ejecuta en el HOST, no en el runner + +set -e # Salir si hay algún error + +echo "🚀 Iniciando deployment de Francia Ocupada..." +echo "================================================" + +# Directorio del proyecto +PROJECT_DIR="/home/marti/Documentos/Gitea/resistencia" +cd "$PROJECT_DIR" + +echo "📂 Directorio de trabajo: $(pwd)" +echo "" + +# PASO 1: Actualizar código desde Git +echo "📥 PASO 1: Actualizando código desde Git..." +git fetch origin +git reset --hard origin/main +echo "✅ Código actualizado" +echo "" + +# PASO 2: Detener contenedores anteriores +echo "🛑 PASO 2: Deteniendo contenedores anteriores..." +docker compose -f docker-compose_prod.yml down || true +docker container prune -f || true +echo "✅ Contenedores anteriores detenidos" +echo "" + +# PASO 3: Limpiar imágenes antiguas +echo "🧹 PASO 3: Limpiando imágenes antiguas..." +docker image prune -f || true +echo "✅ Limpieza completada" +echo "" + +# PASO 4: Construir imágenes Docker +echo "🔨 PASO 4: Construyendo imágenes Docker..." +docker compose -f docker-compose_prod.yml build --no-cache + +# Etiquetar con timestamp para trazabilidad +TAG_VERSION=$(date +%Y%m%d_%H%M%S) +docker tag resistencia-client:latest resistencia-client:${TAG_VERSION} || true +docker tag resistencia-server:latest resistencia-server:${TAG_VERSION} || true + +echo "✅ Imágenes construidas:" +echo " - resistencia-client:latest (${TAG_VERSION})" +echo " - resistencia-server:latest (${TAG_VERSION})" +echo "" + +# PASO 5: Desplegar contenedores +echo "📦 PASO 5: Desplegando aplicación..." +docker compose -f docker-compose_prod.yml up -d + +echo "✅ Aplicación desplegada exitosamente" +echo "" + +# PASO 6: Verificar deployment +echo "✅ PASO 6: Verificando deployment..." +sleep 10 + +echo "📊 Estado de los contenedores:" +docker compose -f docker-compose_prod.yml ps +echo "" + +# Verificar que los contenedores están corriendo +RUNNING_CONTAINERS=$(docker compose -f docker-compose_prod.yml ps -q | wc -l) +if [ "$RUNNING_CONTAINERS" -eq 0 ]; then + echo "❌ ERROR: No hay contenedores corriendo" + docker compose -f docker-compose_prod.yml logs + exit 1 +fi + +echo "✅ Verificación completada - $RUNNING_CONTAINERS contenedores corriendo" +echo "" + +# PASO 7: Mostrar logs recientes +echo "📋 PASO 7: Logs recientes..." +echo "" +echo "--- Logs del Cliente (últimas 20 líneas) ---" +docker compose -f docker-compose_prod.yml logs --tail=20 client || true +echo "" +echo "--- Logs del Servidor (últimas 20 líneas) ---" +docker compose -f docker-compose_prod.yml logs --tail=20 server || true +echo "" + +echo "================================================" +echo "🎉 Deployment completado exitosamente!" +echo "" +echo "🌐 Aplicación disponible en:" +echo " - Frontend: https://franciaocupada.martivich.es" +echo " - API: https://api.franciaocupada.martivich.es" +echo "================================================"