chore(cd): deploy pipeline per ADR-0110 round 29 (expand, deploy 100 %, smoke, auto-rollback)

Offen
#49 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Anfängerfreundlichkeit
25/100
Issue-Typ
Feature
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
github-actions, rust
Bereich
ci-cd, devops

Rechercherichtung

Start with docs/src/architecture/cicd.md, ADR-0110, and the existing .github/workflows/ci.yml; inspect scripts/stage2-contract.sh for the deployed Worker checks and docs/src/architecture/infra.md for the migration access path. Then implement and document the ordered deploy, smoke, rollback, and asset-retention steps, including the staging failure controls and approval gate for Durable Object migrations.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

area:infra prio:p0 review:fable-2026-10-19

Context

Nothing deploys today. docs/src/architecture/cicd.md:80 reads "Any deploy. There is no workflow for it.", and :96-97 says nothing implements ADR-0110. The repository's workflows are ci.yml, contract-cell.yml and flake-hunt.yml. ADR-0110 (accepted in round 24) prescribes this sequence:

  • expand migration;
  • upload at 0 %;
  • smoke and an oracle subset through the version-override header;
  • 10 % for 10 minutes;
  • 100 %, with absolute-count gates and an automatic wrangler rollback (adrs/cd/0110-deploy-pipeline.md:38, :79; Q-0110.1, QUESTIONS.md:234).

The only script that tests a deployed Worker is scripts/stage2-contract.sh, which needs the test routes and the admin token (:36-39). Migrations are the migrate binary (docs/src/architecture/infra.md:128-129). Today the only way into the CNPG clusters is kubectl exec on the primary (research/0010 §2, lines 107-112).

Problem

  • FR-12: traffic is about 5 M requests a month (research/0004 §9, line 317), so 10 % for 10 minutes is roughly 100 requests, most of them the owner's. The ADR itself says percentage slices are meaningless at ≤50 users (0110-deploy-pipeline.md:79). The 10 % stage observes nothing the smoke suite does not, and the version-override plumbing costs build and maintenance.
  • Two constraints remain. A rollback does not revert connected resources, so migrations stay expand/contract (:15-17, :25). A deploy cannot be rolled back across a Durable Object lifecycle change (:18-19).
  • A third comes from ADR-0011 (round 26). The SPA fallback answers a missing hashed asset with 200 text/html, so deploys must keep old hashes until clients age out (adrs/ui/0011-static-asset-hosting.md:76). A 100 % deploy drops the previous version's assets.

Proposal

Add .github/workflows/deploy.yml, triggered on push to main and by hand for each environment (dev, staging and prod, per Q-0092.2), with credentials per ADR-0101.

  1. Expand migration. Q-0110.2 says CI runs it, but nothing gives CI a route to thrust-pg today, so this issue chooses one: a runner with cluster access, or a tunnel route with an Access service token. If #37 picks the Durable Object cell, this step becomes the object's own migration.
  2. Deploy. Record the current version id, then wrangler deploy at 100 %.
  3. Smoke. Run a new pass against the live hostname that needs no test routes: /healthz first; then, once #44 exists, sign in with a dedicated smoke account and read a seeded project. Vacuity guard: /healthz reports the deployed version id (from the version metadata binding, or a var set at deploy), and the smoke checks it equals the new one.
  4. Roll back. If the smoke fails, run wrangler rollback <previous id> and fail the job. If the release adds a [[migrations]] tag, skip the automatic rollback and require manual approval (the DO-lifecycle rule).
  5. Assets. Once #44 adds static assets, include the previous release's hashed files in each upload, or answer 404 for a missing /assets/* file.

Acceptance criteria

  • deploy.yml exists and runs the steps in order on push to main.
  • Control: on staging, a release with a smoke check that fails on purpose ends with the previous version active again (wrangler deployments list) and the job red.
  • Control: the smoke pass fails when pointed at a Worker that still serves the previous version id.
  • A release that adds a DO migration stops for approval and does not roll back automatically.
  • After a deploy, an asset URL from the previous release still returns its JavaScript, not HTML.
  • docs/src/architecture/cicd.md describes the pipeline, and ADR-0110 (round-29 note) and Q-0110.1 match it.

References

  • Review: .agents/plans/contrail/reviews/2026-10-19-fable-architecture-review.md (FR-12)
  • ADR-0110 (:13-20, :25, :38, :79; round-29 note), ADR-0101, ADR-0011 (:76), ADR-0090, ADR-0093, ADR-0130
  • Q-0110.1, Q-0110.2, Q-0092.2
  • docs/src/architecture/cicd.md:73-80, :94-97; docs/src/architecture/infra.md:128-129; scripts/stage2-contract.sh:36-39
  • research/0004-rust-on-workers-binding-matrix.md §9 (traffic model); research/0010-thrust-postgres-infra-plan.md §2 (database access path)

Blocked by: #43

Finding: FR-12

Vorherrschende Sprache
Rust
Sterne
0
Forks
0
Ø Merge
1 Std. 35 Min.
Gemergte PRs (30 T.)
67

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus aRustyDev/thrust

Alle Issues in aRustyDev/thrust

Ähnliche Issues

Weitere Issues zu Rust

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.