CI/CD Caching — Referencia para equipo de Infra
Audiencia: Este documento es referencia técnica para el equipo de Infraestructura que gestiona el repo central de CI/CD (
<<REPO_CI_INFRA>>).Los desarrolladores no escriben ni modifican configuraciones de CI/CD en sus repos. Ver ci-arquitectura para entender el modelo completo.
Contexto de la arquitectura
En Wiedii, los pipelines CI/CD se definen en el repo central de infra (<<REPO_CI_INFRA>>), no en los repos de desarrollo. La configuración se aplica a cada proyecto desde GitLab → Settings → CI/CD → General pipelines.
Los jobs se ejecutan en servidores remotos especializados via conectores — el servidor de GitLab solo orquesta.
Stack de herramientas en pipelines
| Herramienta | Rol en CI |
|---|---|
mise | Activar versiones exactas de runtimes (bun, node, python…) |
bun | Runtime JS, instalación de dependencias, ejecutar scripts |
bun install --frozen-lockfile | Instalación reproducible — obligatorio en CI |
Patrones de caching recomendados
Variables de cache (definir a nivel de pipeline)
variables:
MISE_DATA_DIR: "$CI_PROJECT_DIR/.cache/mise"
BUN_INSTALL_CACHE_DIR: "$CI_PROJECT_DIR/.cache/bun"
Cache compartido entre jobs
cache:
key:
files:
- mise.toml
- bun.lock
paths:
- .cache/mise/
- .cache/bun/
- node_modules/
La clave del cache combina el hash de mise.toml y bun.lock:
- Si cambia
mise.toml→ se invalida el cache de mise - Si cambia
bun.lock→ se invalida el cache de bun y node_modules - Sin cambios → se reutiliza el cache completo
Cache por job específico (ESLint, TypeScript)
lint:eslint:
cache:
- key:
files: [bun.lock]
paths: [.cache/bun/, node_modules/]
- key: eslint-$CI_COMMIT_REF_SLUG
paths: [.eslintcache]
script:
- bun eslint . --cache --cache-location .eslintcache
lint:typescript:
script:
- bun tsc --noEmit --incremental
Nx monorepos — affected commands
variables:
GIT_DEPTH: "0" # obligatorio para que nx affected calcule correctamente el diff
lint:affected:
script:
- bun nx affected -t lint --base=origin/develop
test:affected:
script:
- bun nx affected -t test --base=origin/develop
build:affected:
script:
- bun nx affected -t build --base=origin/develop
GIT_DEPTH: "0"es necesario para que Nx tenga el historial git completo y pueda calcular correctamente qué proyectos cambiaron.
Reglas de caching
- Siempre cachear
.cache/mise/con clave derivada demise.toml - Siempre cachear
.cache/bun/ynode_modules/con clave derivada debun.lock - Siempre usar
bun install --frozen-lockfile— nuncabun installsin flag en CI - Usar
--cacheen ESLint e--incrementalen TypeScript para cache incremental - En Nx: configurar
GIT_DEPTH: "0"a nivel de pipeline, no de job
Artifacts
build:
stage: build
script:
- bun run build
artifacts:
paths:
- dist/
- build/
expire_in: 1 week # no acumular artifacts indefinidamente
Los artifacts de producción (imágenes Docker, binarios) siguen el proceso de build en los servidores especializados — su configuración específica vive en el repo de infra.
Conexión con protección de ramas
Los pipelines deben pasar antes de que GitLab permita el merge. Configurar en GitLab → Settings → Repository → Protected branches:
- Rama
main: require passing pipeline + aprobación - Rama
develop: require passing pipeline
Ver branch-protection para la configuración completa.
Referencias
- ci-arquitectura — modelo completo: repo de infra, runners remotos, qué hace cada equipo
- branch-protection — protección de ramas y requisito de pipeline verde
- nx-monorepo — política de workspace Nx y uso de affected