Commit Graph

5 Commits

Author SHA1 Message Date
Jordan Ritter 5cac38c74e ci(showcase): pin actions and disable credential persistence in lint-prod
Fixes zizmor findings on .github/workflows/showcase_lint_prod.yml:
- unpinned-uses: pin actions/checkout to the repo-canonical SHA (v4)
- unpinned-uses: pin ruby/setup-ruby to v1.310.0 SHA
- artipacked: set persist-credentials: false on the checkout step

Matches the rest of the repo, which SHA-pins every uses: with a trailing
# vX.Y.Z comment for Dependabot to keep current.
2026-05-28 11:13:04 -07:00
Jordan Ritter 0d8277c1e4 fix(showcase): make lint-prod workflow resilient to snapshot/GraphQL errors
The lint-prod step crashes today on a pre-existing snapshot bug (GraphQL
schema query for a "domains" field that no longer exists on Project).
The `--exit-zero` flag only suppresses exit-on-findings — it doesn't
catch fatal Ruby errors during snapshot building, so an error short-
circuits the whole job and the visibility surfaces never render.

Make the workflow truly advisory:
- Capture lint-prod stderr + exit code instead of failing the step.
- If lint-prod errors (or produces no JSON), synthesize a minimal
  payload with an "error" field so the renderer has something to chew on.
- Renderer detects the error field and emits an "audit unavailable" block
  with the captured error inside a <details> fold instead of leaving the
  step summary / sticky comment blank.

Snapshot bug itself is out of scope for this change; tracked separately.
2026-05-28 10:53:35 -07:00
Jordan Ritter d4edc96908 feat(showcase): add lint-prod visibility surfaces (step summary + sticky PR comment)
Make the lint-prod audit result legible without having to click into the
workflow logs. Two surfaces, both rendered from the same JSON payload:

1. `$GITHUB_STEP_SUMMARY` — structured markdown block at the top of every
   workflow run page. Shows on every event (push, pull_request,
   workflow_dispatch).
2. Sticky PR comment — one comment per PR, keyed by the HTML marker
   `<!-- lint-prod-sticky-comment -->`. Re-runs update the same comment via
   `gh api -X PATCH` instead of creating duplicates. Plain `gh` CLI only,
   no third-party action.

Both surfaces show: one-line status, a table of the unpinned services only
(not all 27), and a Pacific-time run timestamp with the finding count.

To support the renderer, add `--format json` to `lint-prod`:
{services:[{name,source,status}], findings:N, timestamp:"ISO8601"}
The workflow consumes this shape and also writes `findings` to
`$GITHUB_OUTPUT` so downstream jobs (future Slack alert) can compare runs.

Idempotent: re-running the workflow finds the existing comment by marker
and PATCHes it — never duplicates.
2026-05-28 10:51:16 -07:00
Jordan Ritter 15303cd406 chore(showcase): make lint-prod CI step advisory during initial soak
Add --exit-zero flag to bin/railway lint-prod that makes the command exit 0
even when digest-pinning findings exist. Findings still print to stdout so
they remain visible in the CI step log.

Wire the showcase_lint_prod.yml workflow to pass --exit-zero so the job
cannot block PRs while we soak the check against real production state.
Once we have confidence the findings are clean, remove --exit-zero from
the workflow step to flip lint-prod to enforcing.

Updates README to document the advisory-mode behavior and the path to
flipping the check to enforcing.
2026-05-28 10:46:39 -07:00
Jordan Ritter 56e85dfd80 feat(showcase): add bin/railway Ruby tooling for Railway ops
Single-file Ruby (stdlib only) with 9 subcommands for Showcase
Railway operations: snapshot, restore, rollback, rollback-commit,
promote, pin, env-diff, resolve-digest, lint-prod.

- Production protection: --yes + typed 'production' confirmation
  (--non-interactive skips the prompt but still requires --yes).
- Uniform exit codes: 0 clean, 1 drift/findings, 2 error.
- GraphQL via backboard.railway.app with serviceInstanceDeployV2.
- GHCR digest resolution via Docker-Content-Digest header.
- Promote prechecks: service-set parity, critical env-key parity,
  custom-domain audit; REFUSE on parity miss, WARN on domain drift.
- Minitest suite (stdlib) covers CLI parsing, snapshot YAML
  roundtrip, GHCR digest decision tree, and production prompt.
- CI workflow showcase_lint_prod.yml runs lint-prod + tests on every
  PR that touches showcase/.
2026-05-28 10:23:24 -07:00