From 88113c625c309877cc14ab5e70689d930a016415 Mon Sep 17 00:00:00 2001 From: Chukwuemeka Date: Thu, 24 Sep 2026 17:46:35 +0200 Subject: [PATCH] ci(qa): serialise runs sharing the integration test project MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every Qa run points at one commercetools project, and the integration suites seed and clear fixtures in it. Overlapping runs therefore corrupt each other: after the teardown fix made cleanup reliable, one run's clear step began reliably wiping fixtures another run was asserting on. Seen on main when the #63 and #64 merges landed 41 seconds apart -- the first run passed every job, the second failed three tests with ● Resource Deleter > should delete resource > carts deleted expect(payload.body.results.length).toBeGreaterThanOrEqual(1) Expected: >= 1 Received: 0 Add a workflow-level concurrency group. It is deliberately constant rather than keyed on github.ref: the contended resource is the shared project, not the branch, so runs must serialise across all branches and PRs. cancel-in-progress stays false because a run killed mid-suite skips teardown and leaks fixtures -- the failure mode this is meant to prevent. The regression matrix already sets max-parallel: 1, so intra-run serialisation was never the gap; cross-run was. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/qa.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 8f9ad74..8cbda70 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -6,7 +6,19 @@ on: - 'main' - '!changeset-release/**' pull_request: - + +# Every run shares a single commercetools project, and the integration +# suites seed and clear fixtures in it. Without this, two overlapping runs +# clobber each other: one run's cleanup wipes the fixtures another is +# asserting on, producing failures like "Expected: >= 1, Received: 0". +# A constant group (no ref) serialises across all branches and PRs, since +# the project -- not the branch -- is the contended resource. +# Queue rather than cancel: a run killed mid-suite skips teardown and +# leaks fixtures into the shared project. +concurrency: + group: qa-integration + cancel-in-progress: false + jobs: immutable-install: if: ${{ !startsWith(github.ref, 'refs/heads/changeset-release/') }}