Saltar al contenido principal

CI/CD con GitHub Actions

El repositorio incluye un pipeline en .github/workflows/ci-cd.yml que verifica el código en cada PR y despliega automáticamente al servidor cuando se mergea a main.

Flujo

push / PR → main


┌──────────────────────────────┐
│ Job: ci │
│ 1. Tests Maven (backend) │
│ 2. Build Vite (frontend) │
└────────────┬─────────────────┘
│ solo si push a main

┌──────────────────────────────┐
│ Job: deploy │
│ SSH → git pull │
│ → docker compose up │
└──────────────────────────────┘
  • Los PRs solo ejecutan ci. El merge no despliega si ci falla.
  • El job deploy corre únicamente en push directo a main (no en PRs).

Job ci

PasoQué hace
actions/setup-java@v4Instala Java 21 (Temurin) con caché de Maven
./mvnw testEjecuta los tests del backend desde ./backend
actions/setup-node@v4Instala Node 20 con caché de npm
npm ci && npm run buildInstala dependencias y construye el frontend desde ./frontend

Job deploy

Usa appleboy/ssh-action para conectarse al servidor y ejecutar:

cd $SSH_PATH
git pull
docker compose up --build -d

Docker reconstruye solo los contenedores cuya imagen cambió. Los volúmenes de base de datos y PDFs no se tocan.

Secrets requeridos

Configúralos en GitHub → Settings → Secrets and variables → Actions:

SecretDescripción
SSH_HOSTIP o dominio del servidor
SSH_USERUsuario SSH (ej. ubuntu)
SSH_KEYLlave privada SSH (contenido completo del .pem o id_rsa)
SSH_PATHRuta absoluta del proyecto en el servidor (ej. /home/ubuntu/sgi-emch)
tip

Genera un par de llaves dedicado para el pipeline:

ssh-keygen -t ed25519 -C "github-actions" -f ~/.ssh/github_deploy
# Agrega ~/.ssh/github_deploy.pub al servidor en ~/.ssh/authorized_keys
# El contenido de ~/.ssh/github_deploy va en el secret SSH_KEY

Diagnóstico rápido

El job ci falla en los tests del backend:

# Reproduce localmente
cd backend && ./mvnw test

El job ci falla en el build del frontend:

cd frontend && npm ci && npm run build

El job deploy falla por SSH:

  • Verifica que SSH_KEY tenga la llave privada completa (incluye -----BEGIN... y -----END...).
  • Verifica que la llave pública esté en ~/.ssh/authorized_keys del servidor.
  • Confirma que SSH_USER tenga permisos sobre SSH_PATH.

El deploy exitoso pero la app no actualizó:

# En el servidor
docker compose ps # revisa que todos los servicios estén healthy
docker compose logs -f # busca errores en el arranque