Skip to content

[Chore] Validate deployment artifacts in CI - #106

Merged
mrubens merged 2 commits into
developfrom
codex/deployment-artifacts-ci
Jul 10, 2026
Merged

[Chore] Validate deployment artifacts in CI#106
mrubens merged 2 commits into
developfrom
codex/deployment-artifacts-ci

Conversation

@mrubens

@mrubens mrubens commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

What changed

  • build both app and worker images in pull-request CI
  • validate every maintained Compose shape plus Railway, Render, Coolify, and Fly against a shared deployment catalog
  • add production controller and BullMQ health checks
  • gate image publishing on a production deployment lifecycle: generated secrets, migrations, setup/health probes, Docker-backed task launch, prior-channel upgrade, rollback, backup, and fresh-volume restore
  • retain native amd64 and arm64 release builds
  • pin critical infrastructure images and external GitHub Actions to immutable digests/commit SHAs

Why

Deployment artifacts were not first-class CI inputs, so docker compose up --wait could succeed while the execution plane was unhealthy and release-only deployment paths could drift unnoticed.

Validation

  • pnpm deployment:validate
  • pnpm --filter @roomote/cloud-agents check-types
  • pnpm --filter @roomote/cloud-agents lint
  • pnpm knip
  • pre-push pnpm lint:fast, pnpm check-types:fast, and pnpm knip
  • production app and worker image builds on linux/arm64
  • prior develop image → candidate migration → rollback → candidate
  • Docker-backed task launch through the production controller
  • backup restored onto fresh Compose volumes with all services healthy

Compatibility note

v0.0.1 predates the current rewritten Drizzle migration baseline and cannot be used as a direct migration predecessor. For the first gated tagged release, CI tests the prior published main candidate. Subsequent tagged releases use the immediately preceding immutable release tag.

@roomote-roomote

roomote-roomote Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Re-checked after the latest push. The only new PR-scoped change since the last review is the Fly deployment validation simplification: it collapses the redundant if/else in the fly.toml process loop down to a single assert, which resolves the earlier review nit. deploy/fly/fly.toml still declares all four runtime processes (web, api, controller, bullmq) matching the catalog commands, so the check is behavior-preserving. Everything else in range is base-branch code pulled in by the rebase. No new code issues found. See task

  • deploy/ci/validate-deployment-artifacts.mjs:196-208 — the fly.toml process loop has an if (name === 'api' || name === 'web') { ... } else { ... } where both branches assert the identical condition (fly.processes?.[name] === contract.command), differing only in the error string. The special-casing is dead logic; collapse it to a single assert for every runtime service.

@mrubens

mrubens commented Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the review nit in 30a9a95: the Fly process validation now uses one shared assertion for every runtime service. Re-ran pnpm deployment:validate; pre-push lint, fast type checks, and Knip also pass.

@mrubens
mrubens force-pushed the codex/deployment-artifacts-ci branch 2 times, most recently from 089fb42 to 3715679 Compare July 10, 2026 17:44
@mrubens
mrubens force-pushed the codex/deployment-artifacts-ci branch from 3715679 to e1ad599 Compare July 10, 2026 17:52
@mrubens
mrubens merged commit 1edf93e into develop Jul 10, 2026
1 check passed
@mrubens
mrubens deleted the codex/deployment-artifacts-ci branch July 10, 2026 18:18
mrubens pushed a commit that referenced this pull request Jul 10, 2026
…worker

Publish two images again instead of eight. Every control-plane service
runs from the shared runtime-app target; the container command and
ROOMOTE_SERVICE select the service and its env contract. The Compose
hardening from #105 (read-only filesystems, dropped capabilities,
per-service env contracts, controller-only Docker socket proxy) and the
deployment validation from #106 stay in place, adapted to the two-image
world.

Also authenticate to GHCR in the deployment-acceptance job so baseline
pulls cannot fail on package visibility, which is what has blocked every
publish since #106 landed: the six new per-service packages defaulted to
private and the smoke test pulled them anonymously.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants