Child apps that set ci.image flip to root tier and fail the Railway leg (citynode.app + feedback.nearbuilders.org both failing) — make child ci.image pin the deploy instead
Los mantenedores suelen responder en 1 día
Ya se ha fusionado un pull request relacionado.
- #517 de @elliotBraem — fusionado
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- docker, github-actions, typescript
- Área
- devops, infrastructure
Línea de trabajo
Start with resolveRuntimeTier, resolveImageLegPlan, and resolveRailwayLeg in packages/everything-dev/src/services/deploy/legs.mjs, then read resolveImageRef and deployImageToRailway in packages/everything-dev/src/services/deploy/image.mjs and ADR 0021. Trace how child ci.image affects tier selection and Railway source deployment; done means a child pin deploys the intended image safely without requiring a root-tier digest. The issue does not name tests or a smoke-test entry point.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
Setting ci.image in a child app's bos.app.ts flips the deploy to root tier (resolveRuntimeTier — packages/everything-dev/src/services/deploy/legs.mjs:10-12: ciImage || imageEnv || hasDockerfile ? "root" : "child"). Root tier requires a pinned digest, and the shared consumer-deploy.yml workflow never passes BOS_IMAGE_DIGEST, so every child deploy with ci.image set fails:
Image skipped: no Dockerfile at the config root
Railway deploy failed: Railway deploy requires a runtime image (set ci.image, or pass BOS_IMAGE_DIGEST for a pre-pushed image)
✗ Config published, but the railway leg(s) failed
The config itself publishes fine — only the Railway leg fails.
Two consumers are broken right now by this:
NEARBuilders/feedback.nearbuilders.org— deploy failed 2026-10-19 with exactly this signature.NEARBuilders/citynode.app— its bos.app.ts pinsci.image: ghcr.io/nearbuilders/everything-dev:sha-2fb30b2with the same thin-wrapper consumer-deploy workflow; its Deploy workflow has failed on every run since 2026-10-14.
The child model without ci.image works (child tier: image leg soft-skips, railway redeploy --from-source succeeds with just RAILWAY_TOKEN + ci.railway.service) — but then the child has no protection from :rc float: the Railway service's dashboard-connected source decides the pulled bytes, not the child's config.
The design gap
Under the current design, a child's ci.image can't pin its deploy even in principle: the Railway leg runs railway redeploy --service <service> --from-source (image.mjs:236-242), which re-pulls the service's dashboard-connected source ref — ci.image never repoints it. It only (a) flips the tier to root and (b) names the image for the root-tier build/prebuilt + smoke path. So a child authoring ci.image as a pin ("deploy this image, not whatever :rc floats to") gets a hard failure instead, and removing it silently opts into :rc tracking.
Proposed fix
Make a child's ci.image meaningful and safe:
- Tier: a child that sets
ci.image(and has no Dockerfile) should stay child tier — it cannot build, so demanding a digest is a dead end. Root tier should remain reserved for the actual root runtime (which owns its Dockerfile / image train). - Railway leg: when a child pins
ci.image, the redeploy should deploy the service pinned to that ref — e.g. repoint the service source toci.image(or validate that the service's current source matches it and fail loudly on drift), rather than a blindredeploy --from-source. Per ADR 0021 ("Deployments should pin the digest either way"), a tag ref inci.imagecould be resolved to its digest at deploy time and pinned. - Smoke leg: for a pinned child, optionally smoke-boot the pinned ref (
image@digest) so "pulled bytes are what this train validated" holds for children too.
References
- ADR 0021 (universal runtime image + the 2026-10-13 amendments — image-backed Railway deploys,
:rctrain semantics) resolveRuntimeTier/resolveImageLegPlan/resolveRailwayLeginpackages/everything-dev/src/services/deploy/legs.mjsresolveImageRef/deployImageToRailwayinpackages/everything-dev/src/services/deploy/image.mjs.github/workflows/consumer-deploy.yml(never passesBOS_IMAGE_DIGEST; header describes child-tier soft-skips)- Related: #489 (composition precedence — already landed in rc.12/rc.8)
- Lenguaje dominante
- TypeScript
- Estrellas
- 5
- Forks
- 3
- Merge medio
- 10 h 12 min
- PR fusionados (30 d)
- 102
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de NEARBuilders/everything-dev
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
NEARBuilders/everything-dev#400 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
NEARBuilders/everything-dev#531 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
NEARBuilders/everything-dev#526 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 42/100
NEARBuilders/everything-dev#518 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug needs-triage
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
NEARBuilders/everything-dev#496 ·
Los mantenedores suelen responder en 1 día
Todos los issues de NEARBuilders/everything-dev
Issues similares
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
endora-commerce/endora-commerce#397 ·
Los mantenedores suelen responder en 1 día
-
level/task
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
wazuh/wazuh-dashboard-plugins#9472 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 63/100
Los mantenedores suelen responder en 1 día
-
ready-for-agent
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
xavxyz/bei-shan-lin-shui#57 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
opennextjs/opennextjs-cloudflare#1461 ·
Los mantenedores suelen responder en 1 día