# 📚 Resumen de la Sesión CI/CD - Puntos de Aprendizaje ## 🎯 Lo que Intentamos Lograr Configurar CI/CD automático para desplegar "Francia Ocupada" en producción usando Gitea Actions. ## 🔍 Problemas Encontrados ### 1. **Runner Personalizado vs Runner Estándar** **Tu configuración**: ```yaml runs-on: [production-ready] # Runner personalizado ``` **Ejemplo que funciona**: ```yaml runs-on: ubuntu-latest # Runner estándar de GitHub/Gitea ``` **Diferencia clave**: - `ubuntu-latest` tiene TODAS las herramientas preinstaladas (docker, node, git, etc.) - Tu runner personalizado es un contenedor vacío que solo tiene acceso al socket de Docker ### 2. **Socket de Docker ≠ Docker CLI** Tu runner tiene: - ✅ Acceso al socket de Docker (`/var/run/docker.sock`) - ❌ NO tiene el binario `docker` instalado Por eso todos los comandos `docker` fallan con "command not found". ### 3. **Comandos dentro del Runner vs Comandos en el Host** El runner ejecuta comandos **dentro de su contenedor**, no directamente en el host. ``` ┌─────────────────────────────────┐ │ HOST (Servidor) │ │ - Docker instalado ✅ │ │ - Proyecto en /home/marti/... │ │ │ │ ┌───────────────────────────┐ │ │ │ RUNNER (Contenedor) │ │ │ │ - Docker NO instalado ❌ │ │ │ │ - Comandos se ejecutan │ │ │ │ AQUÍ, no en el host │ │ │ └───────────────────────────┘ │ └─────────────────────────────────┘ ``` ## 📋 Soluciones Intentadas ### Intento 1: Usar variables de contexto de Gitea ❌ - No funcionó: Variables mal interpoladas ### Intento 2: Reordenar pasos (Node.js antes de checkout) ❌ - No funcionó: Seguía faltando Node.js ### Intento 3: Instalar Node.js manualmente ✅ - Funcionó: Node.js instalado correctamente ### Intento 4: Especificar `shell: bash` ❌ - No funcionó: Docker seguía sin encontrarse ### Intento 5: Instalar Docker CLI en el runner ❌ - No intentado: Demasiado complejo ### Intento 6: Script de deployment en el host ⚠️ - Parcialmente: Script creado pero falta ejecutarlo correctamente ### Intento 7: Eliminar copia con rsync ⏸️ - En progreso: Simplificado pero no probado ## 🎓 Conceptos Clave Aprendidos ### 1. **Etiquetas de Runner** ```yaml GITEA_RUNNER_LABELS=production-ready:host ``` - `production-ready`: Nombre de la etiqueta - `:host`: Indica que debe ejecutar en modo "host" (acceso al Docker del host) ### 2. **Volúmenes de Docker** ```yaml volumes: - /var/run/docker.sock:/var/run/docker.sock ``` Esto da acceso al **socket** de Docker, pero NO instala el **cliente** de Docker. ### 3. **Diferencia entre CI y CD** - **CI (Continuous Integration)**: Construir, probar, validar código - **CD (Continuous Deployment)**: Desplegar a producción Tu runner está configurado para CD (deployment), no para CI (build). ## 🛠️ Opciones para Continuar ### Opción 1: Usar un Runner Estándar (Más Fácil) ⭐ **Ventajas**: - Todo preinstalado - Funciona como el ejemplo que compartiste - Menos configuración **Desventajas**: - Necesitas configurar acceso SSH al servidor de producción - El deployment se hace remotamente **Cómo hacerlo**: ```yaml jobs: deploy: runs-on: ubuntu-latest # ← Cambiar a esto steps: - uses: actions/checkout@v4 - name: Deploy via SSH run: | ssh user@servidor 'cd /path/to/project && ./deploy.sh' ``` ### Opción 2: Configurar el Runner con Docker Preinstalado (Medio) Crear una imagen personalizada del runner con Docker ya instalado. **Dockerfile del runner**: ```dockerfile FROM gitea/act_runner:latest RUN apt-get update && apt-get install -y docker-ce-cli ``` ### Opción 3: Deployment Manual con Git Hooks (Más Simple) ⭐⭐ Usar Git hooks en el servidor para auto-desplegar cuando haces push. **En el servidor**: ```bash # .git/hooks/post-receive #!/bin/bash cd /home/marti/Documentos/Gitea/resistencia git pull ./deploy.sh ``` ### Opción 4: Usar Portainer o Watchtower (Automático) Herramientas que detectan cambios en imágenes Docker y auto-actualizan. ### Opción 5: Continuar con el Enfoque Actual (Más Complejo) Necesitarías: 1. Entender mejor cómo el runner accede al filesystem del host 2. Configurar permisos correctos 3. Posiblemente usar SSH desde el runner al host ## 📚 Recursos para Estudiar ### Gitea Actions - [Documentación oficial de Gitea Actions](https://docs.gitea.com/usage/actions/overview) - [Act Runner GitHub](https://github.com/nektos/act) - [Diferencias entre GitHub Actions y Gitea Actions](https://docs.gitea.com/usage/actions/comparison) ### Docker en CI/CD - [Docker-in-Docker (DinD)](https://www.docker.com/blog/docker-can-now-run-within-docker/) - [Docker socket mounting](https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-socket-option) ### Alternativas - [Drone CI](https://www.drone.io/) - CI/CD más simple - [Jenkins](https://www.jenkins.io/) - Más potente pero complejo - [GitLab CI/CD](https://docs.gitlab.com/ee/ci/) - Similar a Gitea Actions ## 💡 Mi Recomendación Para tu caso específico, te recomendaría **Opción 1 o Opción 3**: ### Opción 1: Runner Estándar + SSH ```yaml jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Deploy to Production uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.SSH_KEY }} script: | cd /home/marti/Documentos/Gitea/resistencia git pull ./deploy.sh ``` ### Opción 3: Git Hook (Sin CI/CD) ```bash # En el servidor, en el repositorio bare de Gitea # /path/to/gitea/data/gitea-repositories/marti/FranciaOcupada.git/hooks/post-receive #!/bin/bash cd /home/marti/Documentos/Gitea/resistencia git pull origin main ./deploy.sh ``` ## 📝 Estado Actual del Proyecto ### ✅ Lo que SÍ funciona: - Script `deploy.sh` - Listo para usar - Docker Compose configurado - Aplicación funcional en local ### ⚠️ Lo que NO funciona: - Workflow de Gitea Actions con runner personalizado - Ejecución automática de deployment ### 🎯 Lo que tienes listo para usar: ```bash # Deployment manual (esto SÍ funciona) cd /home/marti/Documentos/Gitea/resistencia ./deploy.sh ``` ## 🚀 Próximos Pasos Sugeridos 1. **Estudiar** los recursos mencionados arriba 2. **Decidir** qué opción se adapta mejor a tus necesidades 3. **Probar** el deployment manual mientras tanto: `./deploy.sh` 4. **Considerar** si realmente necesitas CI/CD automático o si el deployment manual es suficiente ## 📦 Archivos Útiles Creados Aunque el CI/CD automático no funcionó, estos archivos son útiles: - ✅ `deploy.sh` - Script de deployment manual (funciona) - ✅ `monitor-deploy.sh` - Monitoreo de contenedores - ✅ `useful-commands.sh` - Comandos de referencia - ✅ Documentación completa del proceso ## 💭 Reflexión Final CI/CD con runners personalizados es complejo. No es un fallo tuyo no haberlo logrado en la primera sesión. Muchos equipos profesionales tardan días o semanas en configurar correctamente su CI/CD. **Alternativa práctica**: Mientras estudias más sobre el tema, puedes usar deployment manual con `./deploy.sh`, que es perfectamente válido para proyectos pequeños/medianos. --- **Fecha**: 2025-12-13 **Estado**: En pausa para estudio **Próximo paso**: Decidir entre las opciones propuestas arriba