name: CI/CD - Francia Ocupada (La Resistencia) run-name: Build & Deploy por ${{ gitea.actor }} on: push: branches: - main - 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: Configurar Node.js (necesario para ejecutar las acciones de checkout) - name: ⚙️ Configurar Node.js (Necesario para las acciones) uses: actions/setup-node@v4 with: node-version: '20' # PASO 2: Checkout del Código - name: 🚀 Checkout del Código uses: actions/checkout@v4 with: fetch-depth: 0 # PASO 3: Detener y eliminar contenedores anteriores - name: 🛑 Detener Contenedores Anteriores run: | echo "Deteniendo contenedores existentes..." docker compose -f docker-compose_prod.yml down || true # Limpieza de contenedores huérfanos docker container prune -f || true echo "Contenedores anteriores detenidos y eliminados" # PASO 4: Limpiar imágenes antiguas (opcional pero recomendado) - name: 🧹 Limpiar Imágenes Antiguas 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 run: | echo "Construyendo imágenes con docker-compose_prod.yml..." docker compose -f docker-compose_prod.yml build --no-cache # 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 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 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 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 if: always() run: | echo "Logs del cliente (últimas 50 líneas):" docker compose -f docker-compose_prod.yml logs --tail=50 client || true echo "" echo "Logs del servidor (últimas 50 líneas):" docker compose -f docker-compose_prod.yml logs --tail=50 server || true