diff --git a/.github/workflows/release-verify.yml b/.github/workflows/release-verify.yml index 79adee9229..cf6dba8319 100644 --- a/.github/workflows/release-verify.yml +++ b/.github/workflows/release-verify.yml @@ -59,28 +59,48 @@ jobs: matrix: include: # Split the long chat file by collected test locations, and balance - # the remaining server files across five runners. Normal PR/local + # the remaining server files across ten runners. Normal PR/local # invocations retain their complete general-server group. - group: general-server-without-chat - group_label: server (1/5) + group_label: server (1/10) shard_index: 0 - shard_count: 5 + shard_count: 10 - group: general-server-without-chat - group_label: server (2/5) + group_label: server (2/10) shard_index: 1 - shard_count: 5 + shard_count: 10 - group: general-server-without-chat - group_label: server (3/5) + group_label: server (3/10) shard_index: 2 - shard_count: 5 + shard_count: 10 - group: general-server-without-chat - group_label: server (4/5) + group_label: server (4/10) shard_index: 3 - shard_count: 5 + shard_count: 10 - group: general-server-without-chat - group_label: server (5/5) + group_label: server (5/10) shard_index: 4 - shard_count: 5 + shard_count: 10 + - group: general-server-without-chat + group_label: server (6/10) + shard_index: 5 + shard_count: 10 + - group: general-server-without-chat + group_label: server (7/10) + shard_index: 6 + shard_count: 10 + - group: general-server-without-chat + group_label: server (8/10) + shard_index: 7 + shard_count: 10 + - group: general-server-without-chat + group_label: server (9/10) + shard_index: 8 + shard_count: 10 + - group: general-server-without-chat + group_label: server (10/10) + shard_index: 9 + shard_count: 10 - group: general-chat group_label: chat (1/3) shard_index: 0 diff --git a/doc/cloud-build-readiness.md b/doc/cloud-build-readiness.md index e5c45c1586..1e33170162 100644 --- a/doc/cloud-build-readiness.md +++ b/doc/cloud-build-readiness.md @@ -32,6 +32,12 @@ runner capacity to avoid waiting behind an older release. No verification gate i removed from npm publication. Watch organization-wide runner queues when measuring the result. +Release verification spreads the general server suites across ten standard hosted +runners, with the long chat suite split separately across three jobs. Each server +job still runs one test worker. The partition covers every suite exactly once; +normal PR and local test groups keep their existing shape. More jobs increase +concurrent runner demand, so compare queue time as well as test duration. + The artifact wait runs for up to 30 minutes and reports what is missing. Only an HTTP 404 means publication is pending; authorization errors, upstream outages, and identity mismatches fail the job. A failed, cancelled, or skipped prerequisite diff --git a/scripts/__tests__/release-verify-workflow.test.mjs b/scripts/__tests__/release-verify-workflow.test.mjs index 9def9e3800..ff27c430c5 100644 --- a/scripts/__tests__/release-verify-workflow.test.mjs +++ b/scripts/__tests__/release-verify-workflow.test.mjs @@ -230,7 +230,7 @@ test("release verify workflow covers the same split test surface as stable PR ve for (const group of ["general-server-without-chat", "general-chat", "general-workspaces-a", "general-workspaces-b"]) { assert.match(verifyWorkflow, new RegExp(`group: ${group}`)); } - for (const [group, count] of [["general-server-without-chat", 5], ["general-chat", 3]]) { + for (const [group, count] of [["general-server-without-chat", 10], ["general-chat", 3]]) { const rows = [...verifyWorkflow.matchAll(new RegExp(`group: ${group}\\n\\s+group_label: [^\\n]+\\n\\s+shard_index: (\\d+)\\n\\s+shard_count: (\\d+)`, "g"))]; assert.deepEqual(rows.map((row) => [Number(row[1]), Number(row[2])]), Array.from({ length: count }, (_, index) => [index, count])); diff --git a/scripts/__tests__/run-vitest-stable-shard.test.mjs b/scripts/__tests__/run-vitest-stable-shard.test.mjs index 441657d173..3d5a329eb8 100644 --- a/scripts/__tests__/run-vitest-stable-shard.test.mjs +++ b/scripts/__tests__/run-vitest-stable-shard.test.mjs @@ -270,9 +270,9 @@ test("the real shard partition is duration-balanced", () => { test("release server shards plus the dedicated chat file cover the original server group exactly", () => { const full = dryRunJson(["--mode", "general", "--group", "general-server", "--shard-index", "0", "--shard-count", "1"]); - const shards = Array.from({ length: 5 }, (_, index) => dryRunJson([ + const shards = Array.from({ length: 10 }, (_, index) => dryRunJson([ "--mode", "general", "--group", "general-server-without-chat", - "--shard-index", String(index), "--shard-count", "5", + "--shard-index", String(index), "--shard-count", "10", ])); const files = shards.flatMap((shard) => shard.selectedGeneralServerSuites); const chat = "server/src/__tests__/chat-channels.integration.test.ts";