@@ -250,6 +250,11 @@ jobs:
250250 fail-fast : false
251251 matrix :
252252 os : [macos-latest, windows-latest]
253+ # Two legs per OS (scripts/ci-test-shard.py): one leg linked ~240
254+ # test binaries and ran them serially for ~26 min, the merge queue's
255+ # critical path. Shard 1 = unit tests + doctests + a third of the
256+ # integration targets; shard 2 = the rest.
257+ shard : [1, 2]
253258 exclude :
254259 # macOS legs run on main, the merge queue and nightly, not per PR push.
255260 - os : ${{ github.event_name == 'pull_request' && 'macos-latest' || '' }}
@@ -400,11 +405,19 @@ jobs:
400405 # `zip`, and assert the pinned release.
401406 SOCKET_PATCH_GO_E2E_REQUIRED : ' 1'
402407 SOCKET_PATCH_GO_E2E_VERSION : ' 1.24'
408+ TEST_SHARD : ${{ matrix.shard }}
409+ # This leg's share of `cargo test --workspace --no-fail-fast`; the
410+ # shards together run exactly that selection (test_ci_test_shard.py).
403411 run : |
404- cargo test --workspace --no-fail-fast
412+ python3 scripts/ci- test-shard.py "$TEST_SHARD" 2
405413
406414 test-release :
407- if : github.event.pull_request.draft != true
415+ # Not in the merge queue: each PR's head already ran this, and so did
416+ # every PR ahead of it, so a merge group would re-spend ~30 min (23 of it
417+ # compiling) on the same release-mode suite while the queue waits. It
418+ # still runs on every PR and on main after each merge; `ci-ok` counts a
419+ # skipped job as passing.
420+ if : github.event.pull_request.draft != true && github.event_name != 'merge_group'
408421 runs-on : ubuntu-latest
409422 # Every tests/ target is its own optimized link (~240 test binaries).
410423 # The manifest-less VEX suites share two multi-module binaries
@@ -1218,13 +1231,27 @@ jobs:
12181231 # way): a missing suite fails the leg, and every suite must run at
12191232 # least one test on its own. Maven is installed only where a
12201233 # selected test needs it (gradle_vendor_395's mixed root).
1221- - {os: ubuntu-latest, suite: 'e2e_gradle_discovery_build e2e_gradle_agent_build e2e_redirect_gradle_build', jvm_tool: gradle, gradle: '6.9.4', java: '11', test_filter: '--ignored gradle_agent_ gradle_hosted_'}
1234+ # The hosted suite (~43 real-Gradle builds, ~31 min serially) is
1235+ # split into three legs per line so it stops being the merge-queue
1236+ # critical path: the agent suites plus `gradle_hosted_[345]`, the
1237+ # `gradle_hosted_[b-p]` names, and a catch-all that `--skip`s
1238+ # exactly those words, so a new test always lands in some leg
1239+ # (test_ci_gradle_prefixes.py keeps the skip list in sync).
1240+ - {os: ubuntu-latest, suite: 'e2e_gradle_discovery_build e2e_gradle_agent_build e2e_redirect_gradle_build', jvm_tool: gradle, gradle: '6.9.4', java: '11', test_filter: '--ignored gradle_agent_ gradle_hosted_3 gradle_hosted_4 gradle_hosted_5'}
1241+ - {os: ubuntu-latest, suite: e2e_redirect_gradle_build, jvm_tool: gradle, gradle: '6.9.4', java: '11', test_filter: '--ignored gradle_hosted_b gradle_hosted_c gradle_hosted_d gradle_hosted_e gradle_hosted_f gradle_hosted_l gradle_hosted_m gradle_hosted_n gradle_hosted_o gradle_hosted_p'}
1242+ - {os: ubuntu-latest, suite: e2e_redirect_gradle_build, jvm_tool: gradle, gradle: '6.9.4', java: '11', test_filter: '--ignored gradle_hosted_ --skip gradle_hosted_3 --skip gradle_hosted_4 --skip gradle_hosted_5 --skip gradle_hosted_b --skip gradle_hosted_c --skip gradle_hosted_d --skip gradle_hosted_e --skip gradle_hosted_f --skip gradle_hosted_l --skip gradle_hosted_m --skip gradle_hosted_n --skip gradle_hosted_o --skip gradle_hosted_p'}
12221243 - {os: ubuntu-latest, suite: 'e2e_vendor_gradle_build e2e_vendor_jvm_build', jvm_tool: gradle, gradle: '6.9.4', java: '11', test_filter: '--ignored gradle_vendor_ gradle_multi_project'}
1223- - {os: ubuntu-latest, suite: 'e2e_gradle_discovery_build e2e_gradle_agent_build e2e_redirect_gradle_build', jvm_tool: gradle, gradle: '7.6.6', java: '17', test_filter: '--ignored gradle_agent_ gradle_hosted_'}
1244+ - {os: ubuntu-latest, suite: 'e2e_gradle_discovery_build e2e_gradle_agent_build e2e_redirect_gradle_build', jvm_tool: gradle, gradle: '7.6.6', java: '17', test_filter: '--ignored gradle_agent_ gradle_hosted_3 gradle_hosted_4 gradle_hosted_5'}
1245+ - {os: ubuntu-latest, suite: e2e_redirect_gradle_build, jvm_tool: gradle, gradle: '7.6.6', java: '17', test_filter: '--ignored gradle_hosted_b gradle_hosted_c gradle_hosted_d gradle_hosted_e gradle_hosted_f gradle_hosted_l gradle_hosted_m gradle_hosted_n gradle_hosted_o gradle_hosted_p'}
1246+ - {os: ubuntu-latest, suite: e2e_redirect_gradle_build, jvm_tool: gradle, gradle: '7.6.6', java: '17', test_filter: '--ignored gradle_hosted_ --skip gradle_hosted_3 --skip gradle_hosted_4 --skip gradle_hosted_5 --skip gradle_hosted_b --skip gradle_hosted_c --skip gradle_hosted_d --skip gradle_hosted_e --skip gradle_hosted_f --skip gradle_hosted_l --skip gradle_hosted_m --skip gradle_hosted_n --skip gradle_hosted_o --skip gradle_hosted_p'}
12241247 - {os: ubuntu-latest, suite: 'e2e_vendor_gradle_build e2e_vendor_jvm_build', jvm_tool: gradle, gradle: '7.6.6', java: '17', test_filter: '--ignored gradle_vendor_ gradle_multi_project'}
1225- - {os: ubuntu-latest, suite: 'e2e_gradle_discovery_build e2e_gradle_agent_build e2e_redirect_gradle_build', jvm_tool: gradle, gradle: '8.14.3', java: '21', test_filter: '--ignored gradle_agent_ gradle_hosted_'}
1248+ - {os: ubuntu-latest, suite: 'e2e_gradle_discovery_build e2e_gradle_agent_build e2e_redirect_gradle_build', jvm_tool: gradle, gradle: '8.14.3', java: '21', test_filter: '--ignored gradle_agent_ gradle_hosted_3 gradle_hosted_4 gradle_hosted_5'}
1249+ - {os: ubuntu-latest, suite: e2e_redirect_gradle_build, jvm_tool: gradle, gradle: '8.14.3', java: '21', test_filter: '--ignored gradle_hosted_b gradle_hosted_c gradle_hosted_d gradle_hosted_e gradle_hosted_f gradle_hosted_l gradle_hosted_m gradle_hosted_n gradle_hosted_o gradle_hosted_p'}
1250+ - {os: ubuntu-latest, suite: e2e_redirect_gradle_build, jvm_tool: gradle, gradle: '8.14.3', java: '21', test_filter: '--ignored gradle_hosted_ --skip gradle_hosted_3 --skip gradle_hosted_4 --skip gradle_hosted_5 --skip gradle_hosted_b --skip gradle_hosted_c --skip gradle_hosted_d --skip gradle_hosted_e --skip gradle_hosted_f --skip gradle_hosted_l --skip gradle_hosted_m --skip gradle_hosted_n --skip gradle_hosted_o --skip gradle_hosted_p'}
12261251 - {os: ubuntu-latest, suite: 'e2e_vendor_gradle_build e2e_vendor_jvm_build', jvm_tool: gradle, gradle: '8.14.3', java: '21', test_filter: '--ignored gradle_vendor_ gradle_multi_project'}
1227- - {os: ubuntu-latest, suite: 'e2e_gradle_discovery_build e2e_gradle_agent_build e2e_redirect_gradle_build', jvm_tool: gradle, gradle: '9.8.0', java: '21', test_filter: '--ignored gradle_agent_ gradle_hosted_'}
1252+ - {os: ubuntu-latest, suite: 'e2e_gradle_discovery_build e2e_gradle_agent_build e2e_redirect_gradle_build', jvm_tool: gradle, gradle: '9.8.0', java: '21', test_filter: '--ignored gradle_agent_ gradle_hosted_3 gradle_hosted_4 gradle_hosted_5'}
1253+ - {os: ubuntu-latest, suite: e2e_redirect_gradle_build, jvm_tool: gradle, gradle: '9.8.0', java: '21', test_filter: '--ignored gradle_hosted_b gradle_hosted_c gradle_hosted_d gradle_hosted_e gradle_hosted_f gradle_hosted_l gradle_hosted_m gradle_hosted_n gradle_hosted_o gradle_hosted_p'}
1254+ - {os: ubuntu-latest, suite: e2e_redirect_gradle_build, jvm_tool: gradle, gradle: '9.8.0', java: '21', test_filter: '--ignored gradle_hosted_ --skip gradle_hosted_3 --skip gradle_hosted_4 --skip gradle_hosted_5 --skip gradle_hosted_b --skip gradle_hosted_c --skip gradle_hosted_d --skip gradle_hosted_e --skip gradle_hosted_f --skip gradle_hosted_l --skip gradle_hosted_m --skip gradle_hosted_n --skip gradle_hosted_o --skip gradle_hosted_p'}
12281255 - {os: ubuntu-latest, suite: 'e2e_vendor_gradle_build e2e_vendor_jvm_build', jvm_tool: gradle, gradle: '9.8.0', java: '21', test_filter: '--ignored gradle_vendor_ gradle_multi_project'}
12291256 - {os: windows-latest, suite: e2e_vendor_jvm_build, jvm_tool: gradle, gradle: '8.14.3', java: '17', test_filter: '--ignored gradle_multi_project'}
12301257 # Real-sbt hosted (socket-patch.sbt) + vendored
@@ -1470,17 +1497,23 @@ jobs:
14701497
14711498 - name : Install Maven ${{ matrix.maven || '3.9.16' }}
14721499 if : steps.jvm.outputs.maven == 'true'
1473- # Straight from the Apache archive (sha512-verified), so a leg gets
1474- # exactly the release it names rather than the runner's Maven.
1475- # --ssl-revoke-best-effort: see the `test` job's vexctl step.
1500+ # The exact release a leg names rather than the runner's Maven. The
1501+ # tarball comes from Maven Central's CDN (well under a second);
1502+ # archive.apache.org throttles bulk downloads to 1.5-5.5 minutes per
1503+ # leg. Its sha512 still comes from the Apache archive (Central has
1504+ # none for 3.6.3/3.8.9), so the bytes are checked against a digest
1505+ # from a second origin. --ssl-revoke-best-effort: see the `test`
1506+ # job's vexctl step.
14761507 shell : bash
14771508 env :
14781509 MAVEN_VERSION : ${{ matrix.maven || '3.9.16' }}
14791510 run : |
14801511 major="${MAVEN_VERSION%%.*}"
1481- url="https://archive.apache.org/dist/maven/maven-${major}/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz"
1512+ file="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
1513+ url="https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/${MAVEN_VERSION}/${file}"
1514+ sha_url="https://archive.apache.org/dist/maven/maven-${major}/${MAVEN_VERSION}/binaries/${file}.sha512"
14821515 curl -fsSL --retry 5 --retry-all-errors --ssl-revoke-best-effort "$url" -o "$RUNNER_TEMP/maven.tgz"
1483- curl -fsSL --retry 5 --retry-all-errors --ssl-revoke-best-effort "$url.sha512 " -o "$RUNNER_TEMP/maven.sha512"
1516+ curl -fsSL --retry 5 --retry-all-errors --ssl-revoke-best-effort "$sha_url " -o "$RUNNER_TEMP/maven.sha512"
14841517 python -c 'import hashlib, pathlib, os; p=pathlib.Path(os.environ["RUNNER_TEMP"]); assert hashlib.sha512((p/"maven.tgz").read_bytes()).hexdigest() == (p/"maven.sha512").read_text().split()[0]'
14851518 # Python accepts native Windows paths for both archive and destination.
14861519 python -m tarfile -e "$RUNNER_TEMP/maven.tgz" "$RUNNER_TEMP"
@@ -1904,7 +1937,12 @@ jobs:
19041937 # ----------------------------------------------------------------------
19051938 yarn-classic-matrix :
19061939 name : yarn-classic ${{ matrix.release }}
1907- needs : [test, coverage]
1940+ # No `needs: [test, coverage]`: nothing here consumes their outputs,
1941+ # and waiting on the ~30 min windows `test` leg made this the merge
1942+ # queue's critical path.
1943+ # Dropping that `needs` also dropped the draft skip it inherited, so
1944+ # gate on draft here directly (push/merge_group/schedule still run).
1945+ if : github.event.pull_request.draft != true
19081946 runs-on : ubuntu-latest
19091947 timeout-minutes : 40
19101948 strategy :
@@ -1940,7 +1978,12 @@ jobs:
19401978
19411979 yarn-berry-e2e :
19421980 name : yarn-berry ${{ matrix.yarn }} (${{ matrix.os }})
1943- needs : [test, coverage]
1981+ # No `needs: [test, coverage]`: nothing here consumes their outputs,
1982+ # and waiting on the ~30 min windows `test` leg made this the merge
1983+ # queue's critical path.
1984+ # Dropping that `needs` also dropped the draft skip it inherited, so
1985+ # gate on draft here directly (push/merge_group/schedule still run).
1986+ if : github.event.pull_request.draft != true
19441987 strategy :
19451988 fail-fast : false
19461989 matrix :
@@ -2022,7 +2065,8 @@ jobs:
20222065 # e2e_safety_cargo_build (its headline test honours the knobs).
20232066 cargo-vex-matrix :
20242067 name : cargo ${{ matrix.toolchain }} lock-v${{ matrix.lock || 'own' }} (${{ matrix.os }})
2025- needs : [test, coverage, e2e-build]
2068+ # e2e-build only (its binaries); see yarn-classic-matrix on test/coverage.
2069+ needs : [e2e-build]
20262070 runs-on : ${{ matrix.os }}
20272071 timeout-minutes : 40
20282072 # What .cargo/config.toml's [env] gives processes cargo launches; these
@@ -2149,7 +2193,12 @@ jobs:
21492193 # available; this leg pulls both images and requires them.
21502194 cargo-old-toolchains :
21512195 name : cargo old toolchains (manifest [patch])
2152- needs : [test, coverage]
2196+ # No `needs: [test, coverage]`: nothing here consumes their outputs,
2197+ # and waiting on the ~30 min windows `test` leg made this the merge
2198+ # queue's critical path.
2199+ # Dropping that `needs` also dropped the draft skip it inherited, so
2200+ # gate on draft here directly (push/merge_group/schedule still run).
2201+ if : github.event.pull_request.draft != true
21532202 runs-on : ubuntu-latest
21542203 timeout-minutes : 30
21552204 steps :
0 commit comments