Skip to content

feat: add mix openapi.export task#1917

Draft
mandarini wants to merge 6 commits into
mainfrom
ci/openapi-drift-check
Draft

feat: add mix openapi.export task#1917
mandarini wants to merge 6 commits into
mainfrom
ci/openapi-drift-check

Conversation

@mandarini

@mandarini mandarini commented May 27, 2026

Copy link
Copy Markdown
Contributor

What this is

  • A mix openapi.export task that materializes the OpenApiSpex-generated REST spec to priv/openapi.json, plus a PR-time drift gate.

What maintainers need to do

  • Bootstrap once: mix openapi.export, commit priv/openapi.json.
  • On future PRs touching lib/realtime_web/: re-run the task and commit the updated snapshot.

What it's used for

  • Today the REST management spec only exists at runtime via /api/openapi. Committing a snapshot makes it a static, versioned artifact SDKs and type generators can pin to.
  • Scope is REST only. The channel protocol (broadcast, presence, postgres_changes) is intentionally out of scope — would need AsyncAPI separately.

What was added and why

  • lib/mix/tasks/openapi.export.ex — task that writes RealtimeWeb.ApiSpec.spec() JSON to priv/openapi.json (or --output PATH).
  • .github/workflows/openapi.yml — re-runs the task on PRs touching lib/realtime_web/ and fails on git diff if the committed snapshot is stale. Uploads the regenerated spec as an artifact.

@mandarini mandarini force-pushed the ci/openapi-drift-check branch from edfa3b0 to 5d097f6 Compare June 17, 2026 15:55
mandarini and others added 4 commits June 17, 2026 19:28
Reorder so the spec is regenerated and uploaded as an artifact before
the 'snapshot committed' / 'out of date' gates run. This makes the
documented one-time bootstrap actually work: on the first run (no
committed priv/openapi.json yet) CI still emits the artifact, which can
be downloaded and committed. The gates still enforce a committed,
in-sync snapshot.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
version-type: strict against .tool-versions couldn't resolve the coarse
'erlang 27' pin (no exact match in the builds list). Match the repo's
other workflows (tests.yml, lint.yml) which use otp-version: 27.x /
elixir-version: 1.18.x.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mix openapi.export ran 'app.start', which boots the full supervision
tree and therefore evaluates config/runtime.exs (requiring secrets like
METRICS_JWT_SECRET) and opens a DB connection — neither is available in
the bare OpenAPI CI job, so the export failed. The spec is derived
purely from the router and compiled modules, so compile + load the app
metadata instead of starting it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Commit the OpenAPI snapshot (generated by 'mix openapi.export' in CI) so
the drift gate has a baseline to diff against.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

1 participant