Skip to content

Commit 4931ddd

Browse files
committed
Merge main into agent/fix-npm-open-issues
Conflicts resolved onto main's #1043 structure: re-applied the nested-apply warnings (apply_warning_lines, #1004) in agent_download.rs where main moved get's download engine; dropped rollback's capitalize_first for main's ui::sentence_case while keeping hosted_state_not_preservable_warning; yarn berry error keeps this branch's Result shape with main's REVERT_ALL_AND_REVENDOR remedy; Discovery keeps both shadowed (#828) and install_trees (#1086); CLI_CONTRACT merges both sides' text. Co-Authored-By: Claude <noreply@anthropic.com>
2 parents 9deb4c8 + a845bf9 commit 4931ddd

160 files changed

Lines changed: 5415 additions & 3380 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/ci.yml‎

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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:

‎.github/workflows/gradle-compatibility.yml‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,13 @@ jobs:
256256
# TLS handshake with CRYPT_E_REVOCATION_OFFLINE whenever the CA's
257257
# revocation server is unreachable. A revoked certificate still fails;
258258
# the body is checked against a digest right after. A no-op elsewhere.
259-
url="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz"
259+
# Tarball from Maven Central's CDN, digest from the Apache archive,
260+
# which throttles the tarball itself to minutes (ci.yml's copy).
261+
file="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
262+
url="https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/${MAVEN_VERSION}/${file}"
263+
sha_url="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${file}.sha512"
260264
curl -fsSL --retry 5 --retry-all-errors --ssl-revoke-best-effort "$url" -o "$RUNNER_TEMP/maven.tgz"
261-
curl -fsSL --retry 5 --retry-all-errors --ssl-revoke-best-effort "$url.sha512" -o "$RUNNER_TEMP/maven.sha512"
265+
curl -fsSL --retry 5 --retry-all-errors --ssl-revoke-best-effort "$sha_url" -o "$RUNNER_TEMP/maven.sha512"
262266
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]'
263267
python -m tarfile -e "$RUNNER_TEMP/maven.tgz" "$RUNNER_TEMP"
264268
launcher="$RUNNER_TEMP/apache-maven-${MAVEN_VERSION}/bin/mvn"
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
name: Merge queue janitor
2+
3+
# Cancels merge-group runs the queue has orphaned. Each queue entry runs CI on
4+
# its own `gh-readonly-queue/main/pr-<n>-<base sha>` ref, so ci.yml's
5+
# concurrency group never lets a newer run cancel an older one. When an entry
6+
# ahead fails or is removed, the queue deletes the refs of every entry behind
7+
# it and rebuilds them on new refs, but the runs on the deleted refs keep going
8+
# (each one is a full ~200-job CI run, macOS legs included). A run whose ref no
9+
# longer exists can never merge, so it is cancelled here. Every rebuild creates
10+
# a new merge group, which triggers this sweep.
11+
#
12+
# Not a required check, and it never fails the merge group: a sweep error is
13+
# only a warning.
14+
15+
on:
16+
merge_group:
17+
types: [checks_requested]
18+
workflow_dispatch:
19+
20+
permissions: {}
21+
22+
concurrency:
23+
group: merge-queue-janitor
24+
cancel-in-progress: false
25+
26+
jobs:
27+
cancel-orphaned-runs:
28+
runs-on: ubuntu-latest
29+
timeout-minutes: 5
30+
permissions:
31+
actions: write
32+
contents: read
33+
steps:
34+
- name: Cancel merge-group runs whose queue ref is gone
35+
env:
36+
GH_TOKEN: ${{ github.token }}
37+
REPO: ${{ github.repository }}
38+
run: |
39+
set -uo pipefail
40+
for status in queued in_progress; do
41+
gh api --paginate "repos/$REPO/actions/runs?event=merge_group&status=$status&per_page=100" \
42+
-q '.workflow_runs[] | "\(.id) \(.head_branch)"' || echo "::warning::could not list $status runs"
43+
done | sort -u | while read -r id branch; do
44+
case "$branch" in gh-readonly-queue/*) ;; *) continue ;; esac
45+
# Only a definite 404 means the entry is gone; any other lookup
46+
# error (rate limit, 5xx) leaves the run alone.
47+
if err=$(gh api "repos/$REPO/git/ref/heads/$branch" --silent 2>&1); then
48+
continue
49+
fi
50+
case "$err" in *"HTTP 404"*) ;; *) echo "::warning::ref lookup for $branch failed: $err"; continue ;; esac
51+
echo "Cancelling run $id: $branch is no longer in the queue"
52+
gh api -X POST "repos/$REPO/actions/runs/$id/cancel" --silent \
53+
|| echo "::warning::could not cancel run $id"
54+
done
55+
exit 0

0 commit comments

Comments
 (0)