Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/node-github-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ permissions:

concurrency:
group: node-github-release
queue: max
cancel-in-progress: false

jobs:
release:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/node-release-cut.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ permissions:

concurrency:
group: node-release-cut
queue: max
cancel-in-progress: false

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve every pending release run

When one run is active and two more releases enter the same concurrency group, cancel-in-progress: false protects only the active run: GitHub documents that there can be “at most one running and one pending job” and that a new queued run replaces the existing pending run. Consequently, the analogous changes in node-release-cut.yml, node-release.yml, and node-github-release.yml can discard an intermediate version/tag or backfill during overlapping releases, despite the tests claiming every release is serialized; these workflows need a durable dispatch/queue mechanism rather than treating cancel-in-progress: false as equivalent to queue: max.

Useful? React with 👍 / 👎.


jobs:
cut:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/node-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:

concurrency:
group: ${{ github.workflow }}
queue: max
cancel-in-progress: false

jobs:
verify:
Expand Down
11 changes: 7 additions & 4 deletions sdk/typescript/tests-ts/release-automation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2046,13 +2046,15 @@ describe("GitHub release workflow safeguards", () => {
);
});

test("durably queues every release-cut and protected publishing run", () => {
test("serializes release-cut and protected publishing without canceling active runs", () => {
expect(releaseCutWorkflow).toMatch(
/concurrency:\s*\n\s+group: node-release-cut\s*\n\s+queue: max/u,
/concurrency:\s*\n\s+group: node-release-cut\s*\n\s+cancel-in-progress: false/u,
);
expect(protectedReleaseWorkflow).toMatch(
/concurrency:\s*\n\s+group: \$\{\{ github\.workflow \}\}\s*\n\s+queue: max/u,
/concurrency:\s*\n\s+group: \$\{\{ github\.workflow \}\}\s*\n\s+cancel-in-progress: false/u,
);
expect(releaseCutWorkflow).not.toMatch(/^\s+queue:/mu);
expect(protectedReleaseWorkflow).not.toMatch(/^\s+queue:/mu);
});

test("dispatches GitHub releases after publishing with isolated permissions", () => {
Expand Down Expand Up @@ -2111,8 +2113,9 @@ describe("GitHub release workflow safeguards", () => {

test("serializes every GitHub release and historical backfill", () => {
expect(githubReleaseWorkflow).toMatch(
/concurrency:\s*\n\s+group: node-github-release\s*\n\s+queue: max/u,
/concurrency:\s*\n\s+group: node-github-release\s*\n\s+cancel-in-progress: false/u,
);
expect(githubReleaseWorkflow).not.toMatch(/^\s+queue:/mu);
expect(githubReleaseWorkflow).not.toContain(
"group: node-github-release-${{",
);
Expand Down
Loading