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) | test → build → staging (imagen :staging) |
| push | tag v*.. | test → build → release (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, environmenttesting -
Node 24.x (
actions/setup-node@v6, cache npm) -
npm ci --legacy-peer-depsen raíz -
npm cienfunctions/ -
npm run test— equivalente local antes de push:npm run test
Desglose de npm test (raíz package.json):
-
build:common -
test:functions— Jest enfunctions/tests -
test:common— Vitest enprojects/common -
test:angular:ci— las cinco SPAs con configuraciónci
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:
-
npm run build:production:all— SPAs en modo producción -
cd docs && npm ci && npm run build:local— Antora con playbook monorepo (url: ..) -
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 aN.M) -
concurrency: grupodeploy-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, Antorabuild:local -
runtime: nginx +
functions/(solo deps prod), puerto 80, API Node en 5000 interno -
Estáticos:
/srv/static/{unosportclub,panel,trainer,sudo,accounting}/browsery/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 build → antora-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-commit→lint-staged -
Scripts útiles:
npm run lint,npm run format:check,npm run type-check -
Regla de equipo:
npm testen 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.