Skip to content

ci(release): device gate, diff summary, and staged production rollout - #265

Merged
ErikBjare merged 3 commits into
ActivityWatch:masterfrom
TimeToBuildBob:ci/release-discipline
Sep 14, 2026
Merged

ErikBjare merged 3 commits into
ActivityWatch:masterfrom
TimeToBuildBob:ci/release-discipline

Conversation

@TimeToBuildBob

Copy link
Copy Markdown
Contributor

The release-discipline half of the #261 follow-up (the CI half is #264).

What changes for you when releasing

  1. Release workflow gets two inputs. installed_on_device (checkbox) must be ticked for a stable version or the job fails with a message saying what to install and check. rollout (default 0.1) is the initial production fraction.
  2. The job summary lists every commit and the aw-server-rust submodule range since the previous tag. "Small bump" gets decided by that list, not by feel. (v0.14.0's would have shown 12 PRs and 25 server commits.)
  3. Build workflow publishes stable tags to production as a staged rollout: the fraction comes from the tag annotation (rollout=…, written by Release), defaults to 10% for a hand-pushed tag, and refuses unknown values instead of silently going to 100%. Internal track is untouched. Resolver lives in scripts/assert-play-track.sh rollout with self-tests, run by the existing self-test step on every PR.
  4. New Rollout workflow (Actions → Rollout → 0.25 / 0.5 / 1.0) widens or completes the current production release via a new fastlane rollout lane (upload_to_play_store with skip_upload_*, version_code defaults to the highest on the production track). Check Play vitals for the new versionCode first; the Blank white screen and app not working #261 ANR clusters were visible within hours.

Pre-releases (0.14.1b1, dev…) are unaffected: internal track, no gate.

Validated: assert-play-track.sh --self-test (7 new cases), workflow YAML parses, ruby -c Fastfile. The upload_to_play_store rollout-update call is fastlane's documented way to change an in-progress staged rollout; first real use will be the v0.14.1 rollout, so worth watching that run.

After ActivityWatch#261: v0.14.0 went from beta to 100% of production with 12 PRs and
a 25-commit aw-server-rust bump that no device with real history had run.

- release.yml: stable releases must confirm installed_on_device (this
  build, or a beta containing every commit since the last release, was
  installed on a real device with history and the Activity view opened);
  the job summary lists every commit and the aw-server-rust submodule
  range since the previous tag; the chosen initial rollout fraction is
  recorded in the tag annotation.
- build.yml: production publishes start as a staged rollout, read from the
  tag annotation via scripts/assert-play-track.sh rollout (default 10%,
  only listed fractions accepted, nothing for internal). Self-tested.
- rollout.yml + fastlane lane rollout: widen or complete the staged
  rollout after checking Play vitals for the new versionCode.
@greptile-apps

greptile-apps Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

The PR appears safe to merge; no actionable new defect or outstanding previous finding remains.

Findings

  1. P1 Prerelease tag hides changes ▶
  2. P2 Tag lookup remains untested ▶

Summary

  • Requires real-device confirmation before stable releases.
  • Summarizes the complete production release range, including bundled server changes.
  • Resolves rollout fractions from annotated tags with fail-closed validation.
  • Adds a workflow and Fastlane lane for widening an active production rollout.
  • Avoids repeatedly submitting unchanged Play listing media.
  • The changes since the previous review fully address both earlier findings by selecting the prior stable tag and exercising the real annotated-tag lookup path.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    Request[Manual release request] --> Gate{Stable release?}
    Gate -->|Yes| Device[Require device validation]
    Gate -->|No| Prepare[Prepare prerelease]
    Device --> Summary[Summarize changes since previous stable tag]
    Prepare --> Summary
    Summary --> Tag[Create annotated release tag]
    Tag --> Build[Build and validate artifacts]
    Build --> Track{Play track}
    Track -->|Internal| Internal[Publish prerelease]
    Track -->|Production| Staged[Start annotated staged rollout]
    Staged --> Vitals[Check Play vitals]
    Vitals --> Rollout[Widen or complete rollout workflow]
Loading

Reviews (2) · Last reviewed commit: "fix(ci): baseline stable summaries on pr..."

Comment thread .github/workflows/release.yml Outdated
Comment thread scripts/assert-play-track.sh
supply resent fastlane/metadata/**/images/icon.png with each release, and
Play records that as an app-icon change that needs listing review every
time (the 'Change app icon' entry under Changes in review). Skip images
and screenshots on the tag publish; listing changes are deliberate.
`git describe` selected the nearest prerelease, so a v0.14.1 after
v0.14.1b1 omitted the beta range from the release summary and changelog.
scripts/previous-release-tag.sh picks the previous stable ancestor for
X.Y.Z (self-tested). Also cover the annotated-tag rollout lookup the
publication path actually uses.

Git-Session-Id: 029bd8d2-bb94-5e4a-9483-c684e4bcbfc1
@TimeToBuildBob

Copy link
Copy Markdown
Contributor Author

@greptileai review

@TimeToBuildBob

Copy link
Copy Markdown
Contributor Author

CI-green and mergeable (Greptile 5/5) — waiting only on a maintainer click.

This PR is ready to merge, but the bot has pull-only access to this repo and can't self-merge — surfacing it here so it isn't lost. The monitoring loop will stop re-flagging it now that this note is posted.

@ErikBjare
ErikBjare merged commit bb83230 into ActivityWatch:master Sep 14, 2026
8 checks passed
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.

2 participants