Skip to content

ci: analyze/test/build on every change; tag-driven installer releases - #7

Merged
HarperZ9 merged 1 commit into
mainfrom
feat/ci
Jul 29, 2026
Merged

ci: analyze/test/build on every change; tag-driven installer releases#7
HarperZ9 merged 1 commit into
mainfrom
feat/ci

Conversation

@HarperZ9

Copy link
Copy Markdown
Owner

Closes the last non-signing ship item: reproducibility

The installer existed only as a build from one machine. Two workflows fix that:

ci.yml — every push / PR

flutter analyze → full test suite → real flutter build windows --release, with the built app kept as a 7-day artifact. A PR cannot merge green without the exe compiling.

release.yml — push a v* tag

Reproduces the entire installer from source on a clean runner:

  1. Version gate — refuses to ship when the tag and pubspec disagree (no mislabeled artifacts).
  2. Engine repo (HarperZ9/local-model, public) checked out beside the app → PyInstaller freeze via packaging/flywheel-gateway.spec.
  3. CRT staged from the runner's VS Redist tree; Inno from the runner image (choco fallback).
  4. The existing scripts/build_installer.ps1 does the assembly — CI runs the same path a laptop does.
  5. Publishes a GitHub Release: Flywheel-Setup-<version>-x64.exe + SHA256SUMS.txt receipt, --verify-tag.

Toolchain pinned to the locally-verified set: Flutter 3.44.6, Python 3.12, PyInstaller 6.21.0.

This PR's own CI run is the live verificationci.yml executes on this PR.

🤖 Generated with Claude Code

Two workflows close the reproducibility gap (the shipped exe existed only
as a build from one machine):

- ci.yml: every push to main and every PR runs flutter analyze, the full
  test suite, and a real `flutter build windows --release`, keeping the
  built app as a short-lived artifact. A PR cannot merge green without the
  exe compiling.

- release.yml: pushing a v* tag reproduces the entire installer from
  source on a clean runner -- engine repo checked out beside the app,
  PyInstaller freeze, CRT staged from the runner's VS Redist tree, Inno
  compile via the existing scripts/build_installer.ps1 -- and publishes a
  GitHub Release with the setup exe plus a SHA256SUMS.txt receipt. A
  version gate refuses to ship when the tag and pubspec disagree, so an
  artifact can never carry a mislabeled version.

Toolchain pins: Flutter 3.44.6, Python 3.12, PyInstaller 6.21.0 -- the
exact set the local build was verified with. Inno Setup comes from the
runner image, with a choco fallback when absent.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@HarperZ9
HarperZ9 merged commit 36e1258 into main Jul 29, 2026
1 check passed
@HarperZ9
HarperZ9 deleted the feat/ci branch July 29, 2026 00:49
HarperZ9 added a commit that referenced this pull request Jul 29, 2026
Version 0.2.0 -> 0.2.1: the installer now carries the keyless-default and
hidden-Set-key first-run fixes (#6) and ships from the tag-driven release
pipeline (#7) instead of a laptop build.

Co-authored-by: Zain Dana Harper <17142659+HarperZ9@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <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