Some checks failed
CI/CD - Francia Ocupada (La Resistencia) / build-and-deploy (push) Failing after 7s
256 lines
7.6 KiB
Markdown
256 lines
7.6 KiB
Markdown
# 📚 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
|