Skip to content

chore: automate example app publishing to app stores - #5118

Draft
KisaneNeko wants to merge 2 commits into
callstack:mainfrom
KisaneNeko:feat/automate-example-app-release
Draft

KisaneNeko wants to merge 2 commits into
callstack:mainfrom
KisaneNeko:feat/automate-example-app-release

Conversation

@KisaneNeko

@KisaneNeko KisaneNeko commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

Motivation

The example app in the stores is 20 months out of date. It's only ever been updated by hand (18 times in nine years, against 83 library releases), so it drifts. This ships it with each library release instead.

Related issue

Resolves #4993

Screenshots / Videos

No UI changes.

Test plan

Needs EXPO_TOKEN and the store credentials in EAS first, setup steps are in CONTRIBUTING.md.

On the next release: if no native code changed it should publish an OTA update and stop there. If it did, it should build, land on the Play internal track and TestFlight, and open a version bump PR. Stable releases go to Play production instead.

This also replaces updates.yml, which did the OTA half on labelled PR merges. It never ran once (wrong trigger, so the label check never matched), and both halves belong on the same event.

To check the failure path, cancel a run from the Actions tab and confirm the run page says the library release is unaffected.

@KisaneNeko
KisaneNeko marked this pull request as draft September 14, 2026 06:46
@KisaneNeko
KisaneNeko force-pushed the feat/automate-example-app-release branch from 8da1cee to d1f8f7a Compare September 14, 2026 19:36
@KisaneNeko
KisaneNeko force-pushed the feat/automate-example-app-release branch from d1f8f7a to 4bd1cee Compare September 22, 2026 10:26
@github-actions

Copy link
Copy Markdown

Found potential problems with the pull request:

  • Screenshot or video evidence is missing. Make sure to include one if it affects the UI.

The example app in the stores drifts away from the library: it was released
eighteen times in nine years against eighty-three library releases, all by
hand, and the last one was twenty months ago. Ship it from the release that
prompts it instead.

What it ships depends on whether native code changed. `runtimeVersion` uses
the fingerprint policy, so the workflow can compare the project against the
builds already out there: unchanged means the new JavaScript runs on what
people already have, and goes out as an update; changed means a build and a
trip through the stores. Only a build carries a version to a store, so only a
build bumps one, and that bump comes back as a pull request.

This replaces the updates workflow, which published updates when a labelled
pull request merged. It never ran once: it triggers on push, where the
pull_request it tests does not exist, so all sixty-nine runs skipped. Tying
both outcomes to the release removes the label nobody remembered to add.

Prereleases and stable releases build against separate channels so an update
published for an alpha cannot reach the stable app. Where a build lands is
decided by the tag rather than by the release's prerelease flag, because
.release-it.json pins every release to `preRelease: true` for the 6.0 alpha
cycle, and reading that flag would route a stable 6.0.0 to the internal track.

Publishing runs after a release already exists, so it cannot fail, revoke or
roll back one. A run that does not succeed says so on its own run page, where
the mail GitHub already sends the publisher leads, and says the release is
unaffected.

Store credentials live in EAS rather than here, so EXPO_TOKEN is the only
secret this needs. Setup and the known limitations are in CONTRIBUTING.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@KisaneNeko
KisaneNeko force-pushed the feat/automate-example-app-release branch from 4bd1cee to fb463b2 Compare September 23, 2026 05:58
Whether EXPO_TOKEN still works could otherwise only be found out by a real
run, which builds and submits. A dry run authenticates, works out whether the
release would build or update, reports that, and stops.

Also check authentication in its own step, so a missing or expired token fails
in seconds with a message that says so rather than several minutes later
inside a build.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@KisaneNeko
KisaneNeko marked this pull request as draft September 24, 2026 10:09

This branch has not been deployed

No deployments
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.

feat: automate publishing of the Example App

1 participant