From 44491a9d5b26737ef91f7849d344f098e9ffbebd Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 24 Jul 2026 11:34:29 +0200 Subject: [PATCH] chore(ci): serialize package releases to prevent skipped publishes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Concurrent merges to main trigger overlapping release jobs. When two run in parallel, multi-semantic-release sees the branch as "behind the remote one" and silently skips publishing — a merged feat/fix never reaches npm (e.g. @forestadmin/workflow-executor stuck at 1.21.1 despite a merged feat). Add a per-branch concurrency group to the release job so runs serialize. cancel-in-progress stays false: a release must never be interrupted mid-publish. The tip run then drains the whole pending backlog. Deliberately not changing the checkout to the branch tip: the dist cache is keyed by github.sha, so releasing from a different ref would publish stale build artifacts. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/build.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cfa2173d95..61c5044ff2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -198,6 +198,14 @@ jobs: release: name: Release packages runs-on: ubuntu-latest + # Serialize releases per branch so concurrent merges can't run multi-semantic-release + # in parallel: an overlapping run sees the branch as "behind remote" and silently skips + # publishing. cancel-in-progress must stay false — a release must never be interrupted + # mid-publish. The tip run (github.sha == branch head, matching the sha-keyed dist cache) + # then drains the whole pending backlog. + concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false needs: [build-api-reference, send-coverage, lint] if: | github.event_name == 'push'