Skip to content

ci: push store metadata to Google Play and App Store on release - #505

Open
rejas wants to merge 1 commit into
mainfrom
play-store-metadata
Open

ci: push store metadata to Google Play and App Store on release#505
rejas wants to merge 1 commit into
mainfrom
play-store-metadata

Conversation

@rejas

@rejas rejas commented Aug 23, 2026

Copy link
Copy Markdown
Member

Problem

The release workflow only submits binaries via EAS auto-submit. fastlane/metadata/ was never pushed to Google Play — EAS Submit doesn't read it, EAS Metadata only supports the App Store, and nothing invoked fastlane supply. Release notes and listing texts therefore never showed up in the Play Console.

There's also a versionCode mismatch: changelog files are named after the package.json versionCode, but the submitted build carries an EAS-managed versionCode (appVersionSource: "remote" + autoIncrement), so even a manual fastlane supply would silently skip them.

Changes

Two new jobs in the release workflow, both gated on the existing tag-only chain:

📝 Push Google Play Metadata

  1. scripts/wait-for-eas-build.mjs polls EAS until the Android build for the tagged commit finishes and captures the EAS-assigned versionCode
  2. scripts/prepare-play-metadata.mjs stages a copy of fastlane/metadata with the current changelog renamed to that versionCode (old changelogs and images are dropped — screenshots stay managed in the Play Console)
  3. The new push_metadata fastlane lane waits for auto-submit to land the build on the beta track, then runs upload_to_play_store with listing texts + release notes only (no binary, no screenshots/images)

📝 Push App Store Metadata

  1. Waits for the iOS build, plus a grace period for auto-submit
  2. scripts/prepare-store-config.mjs generates store.config.json containing only the de-DE/en-US release notes (App Store listing texts stay managed in App Store Connect — the repo texts are the Play/F-Droid ones)
  3. eas metadata:push sends them via EAS Metadata

Supporting files: Gemfile/Gemfile.lock (fastlane, x86_64-linux platform included for CI), fastlane/Appfile + Fastfile, .gitignore entries for generated output.

Required setup

⚠️ Add a PLAY_SERVICE_ACCOUNT_JSON GitHub Actions secret containing a Google Play service-account key (same kind of key EAS uses for auto-submit; EAS stores its copy server-side, so the workflow needs its own). The App Store job needs no new secret — eas metadata:push reuses the ASC API key stored on EAS.

Notes

  • The Play job does push title.txt / short_description.txt / full_description.txt to the Play listing. If the live listing differs from the repo files, update the repo files before the next release tag.
  • The mimikama release workflow is untouched; the same pattern can be applied there in a follow-up.
  • Scripts were dry-run locally; the end-to-end path runs on the next release tag.

🤖 Generated with Claude Code

The release workflow only submitted binaries via EAS auto-submit, so the
fastlane/metadata texts and release notes never reached Google Play (EAS
Metadata only supports the App Store, and nothing invoked fastlane supply).

- scripts/wait-for-eas-build.mjs polls EAS until the build for the tagged
  commit finishes and captures the EAS-assigned versionCode
- scripts/prepare-play-metadata.mjs stages fastlane/metadata with the
  changelog renamed to the EAS versionCode (appVersionSource "remote"
  means package.json's versionCode never matches the submitted build)
- fastlane push_metadata lane waits for auto-submit to land the build on
  the beta track, then uploads listing texts and release notes only
  (no binary, no screenshots/images)
- scripts/prepare-store-config.mjs generates store.config.json with the
  de-DE/en-US release notes for eas metadata:push (App Store)

Requires a new PLAY_SERVICE_ACCOUNT_JSON GitHub Actions secret.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds release-workflow automation to push store listing metadata/release notes alongside existing EAS auto-submit, bridging the gap where Play Console metadata wasn’t being applied and App Store release notes need a dedicated metadata push.

Changes:

  • Add two release workflow jobs to wait for EAS builds and then push metadata to Google Play (Fastlane Supply) and App Store (EAS Metadata).
  • Introduce Node scripts to poll EAS build completion and generate/stage metadata inputs for each store.
  • Add Fastlane + Ruby bundler setup (Gemfile/Gemfile.lock) and ignore generated metadata artifacts in git.

Reviewed changes

Copilot reviewed 7 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
scripts/wait-for-eas-build.mjs Polls EAS build status and exposes build version as a GitHub Actions output.
scripts/prepare-store-config.mjs Generates store.config.json for eas metadata:push using fastlane changelog files.
scripts/prepare-play-metadata.mjs Creates a slimmed metadata copy for Supply and remaps changelog filename to the EAS versionCode.
Gemfile Adds fastlane gem dependency for CI metadata upload.
Gemfile.lock Locks Fastlane and dependencies (including linux platform) for reproducible CI installs.
fastlane/Fastfile Adds an Android lane to wait for the new versionCode on track and upload metadata only.
fastlane/Appfile Configures Supply with service account JSON and app package name.
.gitignore Ignores generated metadata artifacts (build/, store.config.json, bundler cache).
.github/workflows/expo-release.yml Adds store-metadata push jobs gated on the tag-based release build chain.
Suppressed comments (1)

.github/workflows/expo-release.yml:83

  • Same issue here: steps.android-build.outputs.build-version uses dot-notation with hyphenated keys, which can break expression parsing. Use bracket notation (or rename ids/outputs) so the version_code argument is reliably populated.
      - name: 🚀 Push metadata to Google Play
        run: bundle exec fastlane android push_metadata version_code:${{ steps.android-build.outputs.build-version }}
        env:
          PLAY_JSON_KEY_FILE: ${{ runner.temp }}/play-key.json

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +66 to +67
- name: 🛠 Prepare Play metadata
run: node scripts/prepare-play-metadata.mjs --play-version-code ${{ steps.android-build.outputs.build-version }}
const listBuilds = () =>
JSON.parse(
execSync(
`eas build:list --platform ${platform} --limit 10 --json --non-interactive`,
Comment on lines +45 to +58
const changelogDir = resolve(target, locale, "changelogs");
for (const file of readdirSync(changelogDir)) {
if (file === `${versionCode}.txt`) {
renameSync(
resolve(changelogDir, file),
resolve(changelogDir, `${playVersionCode}.txt`),
);
console.log(
`✓ ${locale}: ${file} → ${playVersionCode}.txt (EAS versionCode)`,
);
} else {
rmSync(resolve(changelogDir, file));
}
}
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