CI/CD y DevOps

Pipeline de integración continua, construcción de la imagen Docker y publicación de documentación. Marco de gobernanza (entornos, semver, ciclos): Entornos, versiones y ciclos.

Fuente de verdad técnica: .github/workflows/ci.yml (monorepo) y docs/.github/workflows/deploy.yml (sitio Antora).

Visión general

Push / PR / tag
      ↓
  job test (Node 24, npm test)
      ↓
  job build (solo ramas de línea, tag v* o dispatch)
      ├── build:production:all
      └── docs: npm run build:local
      ↓
  job staging (rama N.M)  →  ghcr.io/.../unosportclub:staging
  job release (tag vX.Y.Z) →  :vX.Y.Z, :latest, :staging

Despliegue en servidores (Caddy, variables UNOSPORT_HOST_*): Despliegue con Docker.

Workflow del monorepo

Archivo: .github/workflows/ci.yml (CI/CD Pipeline).

Disparadores

| Evento | Ramas / refs | Efecto | |--------|----------------|--------| | push | develop | Solo test | | push | N.M (ej. 0.4) | testbuildstaging (imagen :staging) | | push | tag v*.. | testbuildrelease (imagen versionada) | | pull_request | hacia develop | Solo test | | workflow_dispatch | manual | test; build y staging según condiciones del workflow |

concurrency cancela ejecuciones en curso del mismo grupo para evitar colas duplicadas en test y build.

Job test

  • Runner: ubuntu-latest, environment testing

  • Node 24.x (actions/setup-node@v6, cache npm)

  • npm ci --legacy-peer-deps en raíz

  • npm ci en functions/

  • npm run test — equivalente local antes de push:

    npm run test

Desglose de npm test (raíz package.json):

  • build:common

  • test:functions — Jest en functions/tests

  • test:common — Vitest en projects/common

  • test:angular:ci — las cinco SPAs con configuración ci

Job funcional (deshabilitado)

El job test-functional (Jest + Postgres en servicio) está comentado en v0.4. Seguimiento: https://github.com/cortex-ia-com-co/unosportclub/issues/391

Para pruebas con BD local: npm run test:db:setup y tests en functions/ según Testing con OAuth2 local.

Job build

Condiciones: no es PR; y (tag v*, workflow_dispatch, o push a rama distinta de develop).

Pasos:

  1. npm run build:production:all — SPAs en modo producción

  2. cd docs && npm ci && npm run build:local — Antora con playbook monorepo (url: ..)

  3. Artefacto dist-and-docs (dist/, docs/build/site), retención 1 día

El Dockerfile repite esta lógica en la etapa builder antes de copiar estáticos a nginx.

Job staging

Condiciones: workflow_dispatch o push a rama de versión N.M (patrón .[0-9] en el disparador; el if excluye develop y tags).

  • Publica ghcr.io/<owner>/unosportclub:staging

  • Environment GitHub: staging (sin lista blanca de ramas; el workflow acota a N.M)

  • concurrency: grupo deploy-staging (no cancela en progreso)

Job release

Condiciones: push de tag vX.Y.Z.

  • Tags de imagen: :${{ github.ref_name }}, :latest, :staging

  • Environment GitHub: production

  • Paso HA Deployment: placeholder para actualización de cluster

Proceso de versión (commits, gh release create): Publicación de releases.

Imagen Docker

Dockerfile (raíz):

  • builder: Node 24, build:production:all, Antora build:local

  • runtime: nginx + functions/ (solo deps prod), puerto 80, API Node en 5000 interno

  • Estáticos: /srv/static/{unosportclub,panel,trainer,sudo,accounting}/browser y /srv/static/docs/site

Entrypoint: docker/docker-entrypoint.sh + plantilla docker/nginx.conf.template.

Documentación Antora (CI separado)

Repositorio espejo cortex-ia-com-co/unosportclub-docs, workflow docs/.github/workflows/deploy.yml:

| Paso | Detalle | |------|---------| | Disparador | Push a develop o workflow_dispatch | | Node | 24 | | Build | npm run buildantora-playbook-standalone.yml (url: .) | | Deploy | GitHub Pages (deploy-pages@v5) |

En el monorepo, para validar antes de merge:

cd docs && npm run build:local

| Comando | Uso | |---------|-----| | npm run build:local | Desde monorepo (antora-playbook.yml, url: ..) | | npm run build | Repo docs standalone / CI Pages |

Calidad en local (pre-push)

  • Husky .husky/pre-commitlint-staged

  • Scripts útiles: npm run lint, npm run format:check, npm run type-check

  • Regla de equipo: npm test en verde antes de commit/push (ver Metodología — documentación y API)

Entornos GitHub

| Environment | Jobs | Uso | |-------------|------|-----| | testing | test | PR y pushes a develop | | staging | staging | Imagen :staging desde rama N.M; environment sin política de rama (control en ci.yml) | | production | release | Tag vX.Y.Z | | github-pages | docs deploy | Sitio Antora público |

Secrets típicos: GITHUB_TOKEN para GHCR (workflow); no versionar .env ni claves RSA del IdP.

Workflows legados

Los archivos projects/*/.github/workflows/ci.yml y functions/.github/workflows/ci.yml están deprecados; el CI activo es solo el de la raíz del monorepo.