7.3 KiB
🔧 Troubleshooting CI/CD - Problemas Resueltos
Resumen de Problemas Encontrados y Soluciones
Durante la configuración del CI/CD con Gitea Actions, encontramos varios problemas que fueron resueltos paso a paso. Este documento sirve como referencia para futuros problemas similares.
Problema 1: Error en el Checkout - Variables de Contexto
❌ Error
%!t(string=http://gitea.local:3000)
%!t(string=***)
%!t(string=marti/FranciaOcupada)
🔍 Causa
El workflow intentaba usar variables de contexto de Gitea (${{ gitea.server_url }}, ${{ gitea.repository }}, ${{ gitea.token }}) en el paso de checkout, pero estas no se interpolaban correctamente.
✅ Solución
Simplificar el checkout eliminando los parámetros innecesarios:
# ❌ ANTES (No funcionaba)
- name: 🚀 Checkout del Código
uses: actions/checkout@v4
with:
server-url: ${{ gitea.server_url }}
repository: ${{ gitea.repository }}
token: ${{ gitea.token }}
fetch-depth: 0
# ✅ DESPUÉS (Funciona)
- name: 🚀 Checkout del Código
uses: actions/checkout@v4
with:
fetch-depth: 0
Commit: 609033b - "fix: Corregir checkout en workflow de Gitea Actions"
Problema 2: Node.js No Encontrado
❌ Error
Cannot find: node in PATH
🔍 Causa
El runner de Gitea Actions no tiene Node.js preinstalado, y las acciones de GitHub (como actions/checkout@v4 y actions/setup-node@v4) requieren Node.js para ejecutarse.
✅ Solución
Instalar Node.js manualmente usando comandos del sistema ANTES de cualquier acción de GitHub:
- name: 📦 Instalar Node.js
shell: bash
run: |
echo "Verificando si Node.js está instalado..."
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
# Fallback a nvm
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"
nvm install 20
fi
else
echo "Node.js ya está instalado: $(node --version)"
fi
# Verificar instalación
node --version
npm --version
Commit: 7c9ff53 - "feat: Instalación manual de Node.js en el runner"
Problema 3: Scripts No Encontrados (2.sh, 3.sh, 4.sh)
❌ Error
/root/.cache/act/6d07dd4849690bae/act/workflow/2.sh: line 3: docker: command not found
/root/.cache/act/6d07dd4849690bae/act/workflow/3.sh: line 3: docker: command not found
/root/.cache/act/6d07dd4849690bae/act/workflow/4.sh: line 3: docker: command not found
🔍 Causa
El runner de Gitea Actions (basado en act) estaba creando archivos temporales (2.sh, 3.sh, 4.sh) para ejecutar los bloques run:, pero no especificaba correctamente el shell a usar, causando que los comandos no se ejecutaran en el contexto correcto.
✅ Solución
Especificar explícitamente shell: bash en todos los pasos que usan bloques run::
# ❌ ANTES (No funcionaba)
- name: 🛑 Detener Contenedores Anteriores
run: |
echo "Deteniendo contenedores existentes..."
docker compose -f docker-compose_prod.yml down || true
# ✅ DESPUÉS (Funciona)
- name: 🛑 Detener Contenedores Anteriores
shell: bash
run: |
echo "Deteniendo contenedores existentes..."
docker compose -f docker-compose_prod.yml down || true
Commit: 134460a - "fix: Especificar shell bash explícitamente en todos los pasos"
Orden Correcto de los Pasos
El orden final correcto de los pasos es:
- Instalar Node.js (con
shell: bash) - Checkout del Código (usando
actions/checkout@v4) - Detener Contenedores Anteriores (con
shell: bash) - Limpiar Imágenes Antiguas (con
shell: bash) - Construir Imágenes Docker (con
shell: bash) - Desplegar Aplicación (con
shell: bash) - Verificar Despliegue (con
shell: bash) - Mostrar Logs Recientes (con
shell: basheif: always())
Lecciones Aprendidas
1. Diferencias entre GitHub Actions y Gitea Actions
- Gitea Actions usa
actbajo el capó, que tiene algunas diferencias con GitHub Actions - No todas las variables de contexto funcionan igual
- El runner puede no tener las mismas herramientas preinstaladas
2. Especificar el Shell es Importante
- Siempre especifica
shell: bashcuando uses bloquesrun:con múltiples líneas - Esto evita problemas de interpretación de comandos
3. Node.js es Requerido
- Muchas acciones de GitHub requieren Node.js
- En runners de Gitea, puede que necesites instalarlo manualmente
- Instálalo ANTES de usar cualquier acción de GitHub
4. El Runner Necesita Acceso a Docker
- Asegúrate de que el runner tenga acceso al socket de Docker del host
- En tu configuración:
-v /var/run/docker.sock:/var/run/docker.sock - La etiqueta debe ser
production-ready:hostpara acceso al Docker del host
Configuración del Runner
Tu configuración del runner que funciona:
services:
gitea-runner:
image: gitea/act_runner:latest
container_name: gitea-act_runner
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- GITEA_INSTANCE_URL=http://gitea.local:3000
- GITEA_RUNNER_NAME=runner-01-ci-vm
- GITEA_RUNNER_LABELS=production-ready:host
- GITEA_RUNNER_REGISTRATION_TOKEN=jzLi65hxB1Rt2RgIGFglXB5RjW9ggCbq9UFX3NrS
Puntos clave:
production-ready:host- La etiqueta:hostes crucial para acceso a Docker- Volumen del socket de Docker montado
- URL de Gitea correcta
Verificación Post-Despliegue
Después de un despliegue exitoso, verifica:
# 1. Estado de contenedores
docker compose -f docker-compose_prod.yml ps
# 2. Logs recientes
docker compose -f docker-compose_prod.yml logs --tail=50
# 3. Acceso a la aplicación
curl -I https://franciaocupada.martivich.es
curl -I https://api.franciaocupada.martivich.es
# 4. Estado del runner
docker ps | grep gitea-act_runner
Recursos Útiles
- Gitea Actions Docs: https://docs.gitea.com/usage/actions/overview
- Act Runner: https://gitea.com/gitea/act_runner
- GitHub Actions Syntax: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
Próximas Mejoras Recomendadas
- Caché de Node.js: Cachear la instalación de Node.js para acelerar futuros builds
- Tests Automatizados: Agregar tests antes del deploy
- Rollback Automático: Implementar rollback si el deploy falla
- Notificaciones: Configurar notificaciones de éxito/fallo (email, Discord, etc.)
- Health Checks: Verificar que la app responde correctamente antes de dar por exitoso el deploy
- Backup de DB: Hacer backup de la base de datos antes de cada deploy
- Staging Environment: Crear un ambiente de staging para probar antes de producción