ci: push store metadata to Google Play and App Store on release - #505
Open
rejas wants to merge 1 commit into
Open
ci: push store metadata to Google Play and App Store on release#505rejas wants to merge 1 commit into
rejas wants to merge 1 commit into
Conversation
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>
Contributor
There was a problem hiding this comment.
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-versionuses 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)); | ||
| } | ||
| } |
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.
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 invokedfastlane 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.jsonversionCode, but the submitted build carries an EAS-managed versionCode (appVersionSource: "remote"+autoIncrement), so even a manualfastlane supplywould silently skip them.Changes
Two new jobs in the release workflow, both gated on the existing tag-only chain:
📝 Push Google Play Metadata
scripts/wait-for-eas-build.mjspolls EAS until the Android build for the tagged commit finishes and captures the EAS-assigned versionCodescripts/prepare-play-metadata.mjsstages a copy offastlane/metadatawith the current changelog renamed to that versionCode (old changelogs and images are dropped — screenshots stay managed in the Play Console)push_metadatafastlane lane waits for auto-submit to land the build on thebetatrack, then runsupload_to_play_storewith listing texts + release notes only (no binary, no screenshots/images)📝 Push App Store Metadata
scripts/prepare-store-config.mjsgeneratesstore.config.jsoncontaining 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)eas metadata:pushsends them via EAS MetadataSupporting files:
Gemfile/Gemfile.lock(fastlane, x86_64-linux platform included for CI),fastlane/Appfile+Fastfile,.gitignoreentries for generated output.Required setup
PLAY_SERVICE_ACCOUNT_JSONGitHub 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:pushreuses the ASC API key stored on EAS.Notes
title.txt/short_description.txt/full_description.txtto the Play listing. If the live listing differs from the repo files, update the repo files before the next release tag.🤖 Generated with Claude Code