Skip to content

ci: harden release pipeline - #273

Merged
0x2E merged 1 commit into
mainfrom
ci/release-pipeline-hardening
Oct 7, 2026
Merged

0x2E merged 1 commit into
mainfrom
ci/release-pipeline-hardening

Conversation

@0x2E

@0x2E 0x2E commented Oct 7, 2026

Copy link
Copy Markdown
Owner

What

Hardens the tag-push release pipeline after an adversarial review of the flow. No structural change: still tag push → draft release → manual publish → docker reuses release binaries.

Changes

  • Test gate on release: run ./scripts.sh test (backend + frontend) before building artifacts. PR checks are path-filtered, so this is the only gate guaranteed to run on every tagged commit.
  • Idempotent release creation: gh release view || create --draft --generate-notes + gh release upload --clobber. Workflow re-runs and re-pushed tags no longer die on "release already exists".
  • Integrity check in docker workflow: download checksums.txt and sha256sum --strict -c the two linux binaries (fail-closed; requires both entries).
  • No mid-flight cancellation: cancel-in-progress: false on the release workflow; on docker, cancel-in-progress: ${{ github.event_name == 'push' }} keeps superseding stale main builds but never kills a release image mid-push. A killed run leaves partial draft assets or a half-pushed multi-arch manifest.
  • Remove dead version plumbing in scripts.sh (resolve_version, unread VITE_FUSION_VERSION env, misleading "Using fusion version string" log). The displayed version comes solely from vite.config.ts (git describe --tags --always → __APP_VERSION__); each build path keeps its current correct output.
  • Fix docker tags comment: {{version}} emits 1.2.3 (no leading v); latest comes from metadata-action's default flavor on non-prerelease semver.

Operational notes

  • Any incomplete draft releases left by the old workflow (e.g. cancelled mid-create) will fail the new checksum check on publish; discard them and re-push the tag — --clobber re-uploads complete assets.
  • Do not add a tag push trigger to docker.yml later without revisiting its concurrency group: it would share a group with the release-event run and could cancel it mid-push.

Verified locally: sh -n scripts.sh, YAML parse of both workflows, and a simulation of the checksum verification (valid passes, tampered and single-entry rejected).

- Run backend and frontend tests before building release artifacts; PR
  checks are path-filtered, so this is the only gate guaranteed to run
  on every tagged commit.
- Make draft release creation idempotent: "gh release view || create"
  plus "gh release upload --clobber", so workflow re-runs and re-pushed
  tags no longer die on an existing release.
- Verify checksums of the downloaded linux binaries in the docker
  workflow (fail-closed, requires both entries).
- Set cancel-in-progress to false for tag/release jobs so a run is
  never killed mid "gh release create"/upload or mid image push; main
  branch builds keep superseding each other.
- Remove dead version plumbing in scripts.sh (resolve_version and the
  unread VITE_FUSION_VERSION env); the displayed version comes solely
  from vite.config.ts's git describe.
- Fix the docker tags comment: {{version}} emits "1.2.3" without the
  "v", and "latest" comes from metadata-action's default flavor on
  non-prerelease semver.
@0x2E
0x2E merged commit e90198a into main Oct 7, 2026
1 check passed
@0x2E
0x2E deleted the ci/release-pipeline-hardening branch October 7, 2026 09:47
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