Despliegue
Guia para construir imagenes Docker y entender la pipeline de CI/CD en GitHub Actions.
Cada template incluye un Dockerfile multi-stage que se construye desde la raiz del
repositorio (el .dockerignore de la raiz limita el contexto al workspace):
- Build:
oven/bun, en la version de.bun-version, correbun install --frozen-lockfilesobre todo el workspace (el lockfile cubre todos los workspaces, asi que copiar solo algunos falla) y compila un binario standalone conbun build --compile. - Runtime:
ubi9/ubi-minimalde Red Hat. El binario solo necesita glibc, asi que esta etapa no instala nada (se construye sin red o detras de un proxy que inspecciona TLS) y corre con un UID no root en el grupo 0.
Construir una Imagen
Sección titulada «Construir una Imagen»Desde la raiz del monorepo:
# Ecommerce APIdocker build -f templates/ecommerce-api/Dockerfile -t iskra-ecommerce:latest .
# Job Workerdocker build -f templates/job-worker/Dockerfile -t iskra-worker:latest .
# Realtime Feeddocker build -f templates/realtime-feed/Dockerfile -t iskra-realtime:latest .Correr un Contenedor
Sección titulada «Correr un Contenedor»docker run -p 3000:3000 \ -e PORT=3000 \ -e DATABASE_URL=app.db \ iskra-ecommerce:latestDockerfile.base
Sección titulada «Dockerfile.base»Si necesitas crear un Dockerfile para un template nuevo, podes usar Dockerfile.base como referencia. Acepta ARG TEMPLATE_NAME y ARG ENTRY_POINT.
CI/CD con GitHub Actions
Sección titulada «CI/CD con GitHub Actions»La pipeline vive en .github/workflows/ y se compone de tres workflows
independientes: ci.yml, release.yml y mirror.yml.
ci.yml — Integracion Continua
Sección titulada «ci.yml — Integracion Continua»Se ejecuta en cada pull request y en cada push a main. Pasos:
checkout → setup-bun → bun install --frozen-lockfile → lint → typecheck → test --coverage → upload coveragePara que los tests de integracion (Redis, Postgres y MySQL) dejen de saltearse, el job levanta service containers y expone las variables de entorno que esos tests leen para detectar servicios disponibles:
| Servicio | Imagen | Variable de entorno |
|---|---|---|
| Redis | redis:7 |
TEST_REDIS_URL=redis://127.0.0.1:6379 |
| Postgres | postgres:16 |
TEST_PG_URL=postgres://postgres:postgres@127.0.0.1:5432/postgres |
| MySQL | mysql:8 |
TEST_MYSQL_URL=mysql://root:mysql@127.0.0.1:3306/test |
Las credenciales coinciden exactamente con los valores por defecto de los
archivos de test, por lo que los bloques describe() gateados se activan en CI.
La cobertura se sube a Codecov con
codecov/codecov-action. Es informativa por ahora (objetivo inicial ~70%,
configurado en codecov.yml con informational: true), asi que no bloquea el
merge. Requiere el secret CODECOV_TOKEN.
release.yml — Publicacion (con Changesets)
Sección titulada «release.yml — Publicacion (con Changesets)»Se ejecuta en cada push a main y usa Changesets.
Hace una de dos cosas:
- Si hay changesets pendientes, abre/actualiza un PR “Version Packages”
que los consume: bumpea la version de cada paquete
@iskra-bun/*afectado, actualiza suCHANGELOG.mdy borra los changesets. Mergear ese PR es la compuerta humana de “publicar release”. - Si no hay changesets pendientes (es decir, recien se mergeo el version PR),
ejecuta el script
release: compila cada paquete adist/y luegochangeset publishpublica a npm con procedencia (provenance) los paquetes publicos, y crea los GitHub Releases correspondientes.
Las versiones y changelogs nunca se editan a mano: salen de los archivos de
changeset que agregan los contribuyentes (ver CONTRIBUTING.md / VERSIONING.md).
Cada paquete publica un dist/ compilado (JS ESM + .d.ts, generado con tsup);
el exports resuelve a dist/ para consumidores npm/Node y a src/ (condicion
source/bun) para desarrollo con Bun sin necesidad de build.
Requiere el secret NPM_TOKEN (publish) y usa el GITHUB_TOKEN automatico para
el version PR y los Releases. El permiso id-token: write habilita la procedencia
(provenance) de npm.
mirror.yml — Espejo en Codeberg
Sección titulada «mirror.yml — Espejo en Codeberg»En cada push a main y en cada tag, hace un git push --mirror --force hacia
codeberg.org/fearful/iskra. Requiere el secret CODEBERG_DEPLOY_KEY (clave SSH
privada cuya parte publica se carga como Deploy Key con escritura en el repo de
Codeberg).
Flujo de Trabajo
Sección titulada «Flujo de Trabajo»- Abris un PR (con un changeset) → corre
ci.yml(lint, typecheck, tests con servicios, cobertura). - Merge a
main→ correci.yml,mirror.yml(actualiza el espejo en Codeberg) yrelease.yml(abre el PR “Version Packages” si hay changesets pendientes). - Mergeas el PR “Version Packages” →
release.ymlcompila y publica a npm + crea los GitHub Releases;mirror.ymlespeja los cambios.