fix(release): cap Play Store changelog at 500 characters - #219
Conversation
Google Play rejects release notes longer than 500 characters per language.
The auto-generated changelog is an unbounded git log since the previous tag,
so it grows past the limit whenever a release spans more than a handful of
commits. Build run 31387869696 failed at the upload step with:
Google Api Error: Invalid request - The release created has notes in
language en-US with length 1004, which is too long (max: 500).
By then release.yml had already committed the changelog and pushed the tag,
so the failure surfaced after the release was effectively cut.
Trim in release.yml on whole-line boundaries, and when entries are dropped
append a pointer to the GitHub release for the full list. Play Store 'What's
new' is plain text, so the URL is readable but not clickable — still better
than silently omitting the rest.
The bound is measured in bytes, which for UTF-8 is >= the character count
Google measures, so the check can only be conservative. It runs after both
branches so a hand-written changelog is covered too, and falls back to the
generic note if not even the first entry fits.
Also trims the already-committed 38.txt (1008 bytes), which would otherwise
keep failing on any re-run of the v0.14.0dev20260810 build.
Greptile SummaryThe PR prevents Google Play uploads from failing on release notes over 500 characters by trimming changelogs at whole-line boundaries and linking to the full GitHub release.
Confidence Score: 5/5The PR appears safe to merge, with no concrete changed-code defect identified. The new workflow logic bounds long release notes before tagging and uploading while preserving whole entries and leaving already compliant changelogs unchanged. Important Files Changed
Sequence DiagramsequenceDiagram
participant Maintainer
participant Release as release.yml
participant Metadata as Fastlane metadata
participant Build as build.yml
participant Play as Google Play
Maintainer->>Release: Dispatch with version
Release->>Metadata: Generate or load changelog
Release->>Release: Check byte length
alt Changelog exceeds limit
Release->>Metadata: Keep whole entries and append release URL
else Changelog fits
Release->>Metadata: Leave unchanged
end
Release->>Release: Commit and push tag
Release->>Build: Trigger tagged build
Build->>Play: Upload bundle and bounded release notes
Reviews (1): Last reviewed commit: "fix(release): cap Play Store changelog a..." | Re-trigger Greptile |
|
CI is fully green and Greptile reviewed the current head at 5/5 with no findings. This is ready to merge. I cannot merge it myself: this account has pull-only repository access, and the self-merge gate also correctly classifies the workflow change as sensitive. After merge, the existing tagged build still needs to be retriggered (or a stable |
Problem
Build run 31387869696 failed at the Play Store upload step:
Google Play caps release notes at 500 characters per language. The changelog auto-generation added in #194 emits an unbounded
git logsince the previous tag, so it exceeds the cap whenever a release spans more than a handful of commits.v0.14.0dev20260810spanned 13 → 1004 characters.The failure mode is worse than a plain build break:
release.ymlcommits the changelog and pushes the tag beforebuild.ymluploads, so the error surfaces after the release has effectively been cut.Fix
Trim in
release.yml, on whole-line boundaries, so a half-written entry never ships. When entries are dropped, append a pointer to the GitHub release:453 bytes. Note that Play Store "What's new" is plain text — the URL is readable but not clickable. Still better than dropping the remainder silently.
Details:
- Bug fixes and stability improvementsrather than emitting an empty file.Also in this PR
fastlane/metadata/android/en-US/changelogs/38.txtis committed on master at 1008 bytes. Trimmed to 453 — without this, any re-run of thev0.14.0dev20260810build fails the same way.Verification
Ran the capping logic against the real 1008-byte changelog and the edge cases:
! -sguard fills it first)shellcheck -s bashclean on the extracted step;release.ymlparses as valid YAML.Context
This is the last thing between master and a stable v0.14.0 — the foreground-service declaration cleared review, and this run got all the way to the upload step. Tracked in #189.