feat(dist): tag-based asset names; pre-release builds that don't notify - #27
Merged
Merged
Conversation
Release-asset naming: per-OS installers are now named
ExLabWizard_v<release-tag>.<ext> (e.g. ExLabWizard_v0.2.0.exe/.dmg/.AppImage).
The name is driven by the release tag with a leading v/V normalised, so both
v0.2.0 and 0.2.0 produce ExLabWizard_v0.2.0 (never _vv0.2.0). Non-release
builds (dispatch/PR) fall back to the package __version__. Raw onedir archives
keep an OS suffix (ExLabWizard_v<tag>-<suffix>.{zip,tar.gz}) because macOS and
Linux both emit .tar.gz and would otherwise collide as release assets. The
Inno .iss takes a /DOutputBaseName define; upload + release globs updated to
ExLabWizard_v*.
Pre-releases: the `published` activity type already fires for pre-releases, so
publishing a pre-release builds + attaches the full installer set (test an RC
before shipping). No trigger change; documented in the workflow header.
Pre-releases do NOT notify: the startup checker polls releases/latest, which
GitHub defines as the most recent non-prerelease, non-draft release -- so a
pre-release never prompts an upgrade. Added a defensive guard in
fetch_latest_tag (skip payloads flagged prerelease/draft) + two unit tests so
the requirement is encoded in our code, not just implied by the endpoint.
README updated for the new asset names and the pre-release behaviour.
Tag-name input is routed through env (not interpolated into the run body) to
avoid shell injection.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The two happy-path tests waited for the queue ROW to reach a terminal state (wait_for_job_state) and then immediately read creation.json's sync_status. That field is stamped by a separate async step (_mark_synced / _mark_cleaned) that lags the queue-row transition, so a loaded CI runner observed the pre-stamp 'pending' value and the assert failed (a residual instance of the #25 timing-flake class -- these two were the spots #25 did not fully convert). Poll the file itself with wait_until until sync_status reaches the asserted value, instead of reading it the instant the row goes terminal. No production code change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Three requested distribution refinements. Two were already satisfied by GitHub's semantics — this PR makes them explicit/robust and documents them — while the asset renaming is a behavioural change.
1. Tag-based asset names (changed)
Per-OS installers are renamed to
ExLabWizard_v<release-tag>.<ext>—ExLabWizard_v0.2.0.exe/.dmg/.AppImage. The name comes from the release tag with a leadingv/Vnormalised (bothv0.2.0and0.2.0→ExLabWizard_v0.2.0, never_vv0.2.0); pre-release tags pass through (ExLabWizard_v1.0.0-rc1.exe). Non-release builds (dispatch/PR) fall back to the package__version__.Raw onedir archives keep an OS suffix (
ExLabWizard_v<tag>-<suffix>.zip|tar.gz) — macOS and Linux both emit.tar.gzand would otherwise collide as release assets. The Inno.isstakes a new/DOutputBaseNamedefine; upload + release globs updated toExLabWizard_v*.2. Pre-releases also build binaries (already worked; documented)
release: types: [published]already fires for pre-releases (per GitHub docs), so a published pre-release builds + attaches the full installer set — letting you test a release candidate. No trigger change (addingprereleasedwould double-run); documented in the workflow header.3. Pre-releases do NOT trigger the update notification (already worked; now guarded + tested)
The startup checker polls
releases/latest, which GitHub defines as the most recent non-prerelease, non-draft release — so a pre-release can never be returned and never prompts an upgrade.fetch_latest_tagnow also defensively skips any payload flaggedprerelease/draft, encoding the requirement in our code rather than relying on the endpoint.Files
.github/workflows/build.yml— tag-derivedrelease_name; renamed exe/dmg/AppImage/archive outputs;/DOutputBaseNameto Inno; updated globs; header docs; release tag routed throughenv:(no shell injection).packaging/windows/exlab-wizard.iss—OutputBaseNamedefine →OutputBaseFilename.src/exlab_wizard/update_check/checker.py— skipprerelease/draftpayloads.tests/unit/update_check/test_checker.py— +2 tests (prerelease, draft →None).README.md— new asset-name wording + pre-release behaviour.Verification run locally
pytest tests/unit/update_check→ 19 passed (incl. the 2 new pre-release/draft tests)ruff check+ruff format --checkclean on the touched files;mypy src/exlab_wizard/update_checkcleanv0.2.0/0.2.0/v1.0.0-rc1/V2.3.4buildmatrix on this PR is the authoritative check that the installers build with the new names; av0.0.0-rc1dry-run tag would additionally exercise the release-attach + pre-release path.🤖 Generated with Claude Code