Skip to content

Promote a tested build to Play production and App Store review - #12

Merged
antiv merged 1 commit into
mainfrom
promote-to-production
Sep 28, 2026
Merged

antiv merged 1 commit into
mainfrom
promote-to-production

Conversation

@antiv

@antiv antiv commented Sep 28, 2026

Copy link
Copy Markdown
Owner

One command per app puts the build that was tested on the Play internal track / TestFlight into production — nothing is rebuilt or re-uploaded.

tool/promote.sh <app> --dry-run --notes-en "..." --notes-sr "..."   # read + validate only
tool/promote.sh <app> --notes-en "..." --notes-sr "..."

What it does

  • Google Play (tool/play_promote.py): moves the versionCode from internal to production in one edit. Full rollout by default, --rollout 0.x for a staged one. Release notes per language (en-US, sr), or the internal release's notes carried over.

  • App Store (tool/asc_submit.py, App Store Connect API with the key from ios/deploy.env):

    • checks that Apple finished processing the build;
    • creates the App Store version, or reuses one that is still editable;
    • attaches the build, sets What's New and submits for review;
    • goes live on approval (--manual-release holds it).

    A new version without What's New fails before anything changes. The App Store has no Serbian, so --notes-sr goes to the Croatian listing and every other listing gets the English text.

  • tool/promote.sh <app> reads the version from the app's pubspec.yaml and the package/bundle ids and keys from the app's files. --android / --ios restrict it to one store.

The release skill, CLAUDE.md and the deploy.env.example files are updated. The Play service account now also needs "Release apps to production".

Testing

  • Dry runs for Bird and Herp on both stores. Rejected input (--rollout 1.5, a new iOS version without notes) fails before any change.
  • Used for real: Bird Tracker 1.0.24 (34) and Herp Tracker 1.0.8 (9) are on the Play production track and in App Store review.
  • The Croatian mapping was added after that run, so Herp's hr listing got the English text this time. It is untested live: 1.0.8 is in review, so a dry run stops before the listings.

🤖 Generated with Claude Code

…view

Once the internal / TestFlight build is tested, one command per app puts
that same build into production, with nothing rebuilt or re-uploaded:

- tool/play_promote.py moves the versionCode from the internal track to
  production (full rollout, or staged with --rollout), with release notes per
  language, or the internal release's notes carried over.
- tool/asc_submit.py (App Store Connect API, the ios/deploy.env key) checks
  the build is processed, creates or reuses the App Store version, attaches
  the build, sets What's New and submits for review; live on approval, or
  held with --manual-release. A new version without What's New fails before
  anything in App Store Connect changes.
- tool/promote.sh <app> reads the version from the app's pubspec.yaml and the
  keys from its deploy.env files; --dry-run reads and validates only. The
  App Store has no Serbian, so --notes-sr goes to the Croatian listing.

The release skill, CLAUDE.md and the deploy.env examples (the Play service
account now needs "Release apps to production") describe it. First used for
Bird Tracker 1.0.24 and Herp Tracker 1.0.8.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@antiv
antiv merged commit e62f84b into main Sep 28, 2026
1 check passed
@antiv
antiv deleted the promote-to-production branch September 28, 2026 08:40
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