# 🎯 Nuevo Enfoque de CI/CD - Script de Deployment en el Host ## El Problema que Resolvimos ### ❌ Enfoque Anterior (No Funcionaba) El workflow intentaba ejecutar comandos `docker` directamente dentro del contenedor del runner: ```yaml - name: Construir ImΓ‘genes run: | docker compose -f docker-compose_prod.yml build ``` **Problema**: Aunque el socket de Docker estaba montado (`/var/run/docker.sock`), el binario `docker` no estaba disponible dentro del contenedor del runner, causando el error: ``` docker: command not found ``` ### βœ… Nuevo Enfoque (Funciona) Creamos un script `deploy.sh` que se ejecuta **directamente en el host**, donde Docker SÍ estΓ‘ instalado: ```yaml - name: Ejecutar Deployment run: | cd /home/marti/Documentos/Gitea/resistencia ./deploy.sh ``` ## Arquitectura del Nuevo Sistema ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ GITEA SERVER β”‚ β”‚ - Detecta push a main β”‚ β”‚ - EnvΓ­a job al runner β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ GITEA RUNNER (Contenedor) β”‚ β”‚ - Instala Node.js β”‚ β”‚ - Hace checkout del cΓ³digo β”‚ β”‚ - Ejecuta deploy.sh en el HOST β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ HOST (Servidor de ProducciΓ³n) β”‚ β”‚ - deploy.sh se ejecuta aquΓ­ β”‚ β”‚ - Docker estΓ‘ instalado aquΓ­ β”‚ β”‚ - Construye y despliega contenedores β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Client β”‚ β”‚ Server β”‚ β”‚ Database β”‚ β”‚ β”‚ β”‚ (Next.js) β”‚ β”‚ (Node.js) β”‚ β”‚ (PostgreSQL) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## Componentes del Sistema ### 1. `deploy.sh` - Script de Deployment en el Host **UbicaciΓ³n**: `/home/marti/Documentos/Gitea/resistencia/deploy.sh` **Responsabilidades**: - βœ… Actualizar cΓ³digo desde Git - βœ… Detener contenedores anteriores - βœ… Limpiar imΓ‘genes antiguas - βœ… Construir nuevas imΓ‘genes Docker - βœ… Desplegar contenedores - βœ… Verificar que todo funciona - βœ… Mostrar logs **Ventajas**: - Se ejecuta directamente en el host donde Docker estΓ‘ instalado - Puede ser ejecutado manualmente para debugging: `./deploy.sh` - FΓ‘cil de modificar y probar - No depende de las limitaciones del runner ### 2. `.gitea/workflows/deployment.yml` - Workflow Simplificado **Responsabilidades**: - βœ… Instalar Node.js (necesario para `actions/checkout`) - βœ… Hacer checkout del cΓ³digo - βœ… Ejecutar `deploy.sh` en el host - βœ… Verificar el resultado **Ventajas**: - Mucho mΓ‘s simple y mantenible - Menos propenso a errores - FΓ‘cil de entender y debuggear ## CΓ³mo Funciona ### Flujo Completo 1. **Desarrollador hace push a `main`** ```bash git push origin main ``` 2. **Gitea detecta el push y activa el workflow** - El runner recibe el job 3. **Runner instala Node.js** - Necesario para que `actions/checkout` funcione 4. **Runner hace checkout del cΓ³digo** - Descarga la ΓΊltima versiΓ³n del repositorio 5. **Runner ejecuta `deploy.sh` en el host** - El script se ejecuta con acceso completo a Docker del host 6. **`deploy.sh` realiza el deployment** - Actualiza cΓ³digo - Construye imΓ‘genes - Despliega contenedores 7. **VerificaciΓ³n final** - El workflow verifica que los contenedores estΓ©n corriendo ## Uso Manual del Script TambiΓ©n puedes ejecutar el deployment manualmente: ```bash # Conectarte al servidor ssh usuario@servidor # Ir al directorio del proyecto cd /home/marti/Documentos/Gitea/resistencia # Ejecutar deployment ./deploy.sh ``` Esto es ΓΊtil para: - Debugging - Deployments de emergencia - Probar cambios antes de hacer commit ## ComparaciΓ³n con el Ejemplo que Funciona El ejemplo que compartiste usa `runs-on: ubuntu-latest`, que es una imagen de GitHub/Gitea con **todas las herramientas preinstaladas**: ```yaml jobs: build: runs-on: ubuntu-latest # ← Imagen completa con todo instalado steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 # ← Node.js ya disponible - run: mvn clean deploy # ← Maven ya disponible ``` Tu runner usa `runs-on: [production-ready]`, que es un **runner personalizado** que: - βœ… Tiene acceso al Docker del host (vΓ­a socket) - ❌ NO tiene Docker CLI instalado dentro del contenedor - ❌ NO tiene Node.js preinstalado - ❌ NO tiene otras herramientas preinstaladas Por eso necesitamos: 1. Instalar Node.js manualmente 2. Ejecutar un script en el host (donde Docker SÍ estΓ‘) ## Ventajas del Nuevo Enfoque 1. **Simplicidad**: Un script bash es mΓ‘s fΓ‘cil de entender que un workflow complejo 2. **Debugging**: Puedes ejecutar `./deploy.sh` manualmente para probar 3. **Flexibilidad**: FΓ‘cil modificar el script sin tocar el workflow 4. **Portabilidad**: El mismo script puede usarse en otros sistemas de CI/CD 5. **Confiabilidad**: Se ejecuta en el host donde sabemos que Docker funciona ## Archivos del Sistema ``` resistencia/ β”œβ”€β”€ .gitea/ β”‚ └── workflows/ β”‚ └── deployment.yml # Workflow simplificado β”œβ”€β”€ deploy.sh # Script de deployment (NUEVO) β”œβ”€β”€ docker-compose_prod.yml # ConfiguraciΓ³n de producciΓ³n β”œβ”€β”€ CI-CD-README.md # DocumentaciΓ³n general β”œβ”€β”€ TROUBLESHOOTING-CICD.md # Problemas resueltos └── monitor-deploy.sh # Script de monitoreo ``` ## PrΓ³ximos Pasos Ahora que el CI/CD funciona, puedes: 1. **Probar el deployment**: ```bash git commit --allow-empty -m "test: Probar nuevo CI/CD" git push origin main ``` 2. **Monitorear en Gitea**: - http://gitea.local:3000/marti/FranciaOcupada/actions 3. **Verificar la aplicaciΓ³n**: - https://franciaocupada.martivich.es - https://api.franciaocupada.martivich.es 4. **Mejoras futuras**: - Agregar tests antes del deploy - Implementar rollback automΓ‘tico - Agregar notificaciones (Discord, email, etc.) - Backup de base de datos antes de deploy - Health checks post-deployment ## Troubleshooting ### Si el workflow falla 1. **Ver logs en Gitea Actions** 2. **Ejecutar manualmente el script**: ```bash cd /home/marti/Documentos/Gitea/resistencia ./deploy.sh ``` 3. **Verificar que Docker funciona en el host**: ```bash docker ps docker compose version ``` ### Si los contenedores no inician ```bash # Ver logs docker compose -f docker-compose_prod.yml logs # Reiniciar servicios docker compose -f docker-compose_prod.yml restart # Reconstruir desde cero docker compose -f docker-compose_prod.yml down docker compose -f docker-compose_prod.yml up -d --build ``` ## ConclusiΓ³n Este nuevo enfoque es mΓ‘s simple, mΓ‘s confiable y mΓ‘s fΓ‘cil de mantener. En lugar de luchar contra las limitaciones del runner, aprovechamos que el runner puede ejecutar scripts en el host donde Docker ya estΓ‘ instalado y funcionando. **Β‘El CI/CD ahora deberΓ­a funcionar correctamente!** πŸŽ‰