From cd4da6812ea458f125c2e8748b72c679637d995f Mon Sep 17 00:00:00 2001 From: Patrick Burns Date: Mon, 8 Jun 2026 15:38:10 -0500 Subject: [PATCH 1/2] Serialize Play publishing to prevent edit-expired races Two pushes to dev landed 19s apart (merges of #161 and #163) and both ran the "Publish AAB to Play Internal track" step concurrently. Google Play permits only one active edit per app, so the second run's edit was invalidated mid-upload and the job failed with "This edit has expired, please create a new Edit." Add a workflow-level concurrency group so all release-publishing runs (pushes to main/dev and v* tags) share a single "play-publish" queue and never overlap on the Play API. cancel-in-progress is false so an in-flight upload finishes instead of being killed. PRs and feature-branch pushes get a unique per-run group and are never queued. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/build-release.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 5736cf87..e4d7995f 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -11,6 +11,25 @@ on: permissions: contents: write +# Google Play allows only one active "edit" per app, so two release builds +# publishing at once make the second fail with "This edit has expired, please +# create a new Edit." Serialize the release-publishing runs (pushes to dev/main +# and v* tags) into a single queue so they never overlap on the Play API. +# cancel-in-progress is false so an in-flight publish finishes rather than being +# killed mid-upload. Everything else (PRs, feature-branch pushes) gets a unique +# group keyed to its run id and is never queued. +concurrency: + group: >- + ${{ + (github.event_name == 'push' + && (github.ref == 'refs/heads/main' + || github.ref == 'refs/heads/dev' + || startsWith(github.ref, 'refs/tags/v'))) + && 'play-publish' + || format('build-{0}', github.run_id) + }} + cancel-in-progress: false + jobs: test: name: Unit tests & coverage From e9da5915d8be8f17128aa2dcb7164756149dd56c Mon Sep 17 00:00:00 2001 From: Patrick Burns Date: Mon, 8 Jun 2026 17:07:16 -0500 Subject: [PATCH 2/2] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .github/workflows/build-release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index e4d7995f..5f719f88 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -16,8 +16,8 @@ permissions: # create a new Edit." Serialize the release-publishing runs (pushes to dev/main # and v* tags) into a single queue so they never overlap on the Play API. # cancel-in-progress is false so an in-flight publish finishes rather than being -# killed mid-upload. Everything else (PRs, feature-branch pushes) gets a unique -# group keyed to its run id and is never queued. +# killed mid-upload. Pull request runs get a unique group keyed to run id, so +# they never queue and CI stays fast. concurrency: group: >- ${{