Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion .github/workflows/adapters.yml
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,25 @@ jobs:
ADAPTER: ${{ matrix.adapter }}
run: ./scripts/deploy-check.sh "$ADAPTER"

deploy-multi-app:
# The shape every other deploy job leaves untested: deploy runs one
# adapter at a time, so nothing proves a project with two applications
# actually comes up on two images (ADR-0022). Weekly rather than per
# pull request, like compose below — two generations plus two image
# builds.
if: ${{ github.event.schedule == '23 2 * * 1' || github.event_name == 'workflow_dispatch' }}
runs-on: ubuntu-latest
permissions:
contents: read
timeout-minutes: 30
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0
- run: corepack enable
- run: ./scripts/deploy-check.sh nextjs nestjs --db postgres

compose:
# expensive relative to the other checks here, so gated on the weekly
# schedule (not the nightly tier-a-only one) or a manual run
Expand Down Expand Up @@ -250,8 +269,9 @@ jobs:
${{ always() && github.event_name == 'schedule' &&
(needs.smoke.result == 'failure' || needs.smoke-tier-b.result == 'failure' ||
needs.deploy.result == 'failure' || needs.deploy-tier-b.result == 'failure' ||
needs.deploy-multi-app.result == 'failure' ||
needs.compose.result == 'failure' || needs.services.result == 'failure') }}
needs: [smoke, smoke-tier-b, deploy, deploy-tier-b, compose, services]
needs: [smoke, smoke-tier-b, deploy, deploy-tier-b, deploy-multi-app, compose, services]
runs-on: ubuntu-latest
permissions:
issues: write
Expand Down
11 changes: 6 additions & 5 deletions docs/decisions/0021-the-released-stack-must-run.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,11 +209,12 @@ actually ran the image.
worth restating because gate 2 looks like it covers a project when it
covers one image.

*Superseded 2026-09-11 by ADR-0022.* A project now publishes one image per
application and runs one compose service per application. The gate
(`scripts/deploy-check.sh`) still generates a single-adapter project and so
still tests one image — it asserts that, rather than assuming it — so the
caveat about what gate 2 covers survives the change that removed its cause.
*Superseded 2026-09-11 by ADR-0022, and fully retired 2026-09-12.* A project
publishes one image per application and runs one compose service per
application; `scripts/deploy-check.sh` now takes more than one adapter,
builds every target the project publishes, waits for each container, and
curls each application on its own port. Gate 2 covers a project again, not
one image.
- **A readiness route is application code a client may delete.** Nothing
detects that later. The gate tests generated projects, not a client's
repository six months on.
Expand Down
7 changes: 7 additions & 0 deletions docs/decisions/0022-one-image-per-application.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,13 @@ than silently preferring one.
change is additive to the inputs, and the smoke path was run against a real
repository before the tag moved.

**Update, 2026-09-12.** `scripts/deploy-check.sh` takes a list of adapters and
covers the multi-application shape: two images built, both containers waited
on, each curled on its own port. Until then nothing verified the thing this
record exists for — every deploy gate ran one adapter at a time, so a project
with two applications was checked by no gate at all. It runs weekly rather
than per pull request; `.github/workflows/adapters.yml`'s `deploy-multi-app`.

## Alternatives considered

- **One image containing every application.** Rejected: it needs a process
Expand Down
Loading