You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
CI perf: Gradle patch compatibility — PR runs repeat ci.yml's Gradle e2e tier and run nightly-only extras (~17,000 Linux job-min/day) #1177
Window: 2026-10-01 → 2026-10-08. Runs: 453 Gradle patch compatibility pull_request runs in 7d (431 that weren't skipped, ~62/day; 185 in the last 24h across 50 PRs). Jobs sampled: 67 PR runs (40 successful).
12 windows cells: 204 job-min/run; build ubuntu+windows: the rest.
Mean over all sampled PR runs, cancelled included: 488 job-min/run.
Estimated 7-day average: Gradle compat = 15,400 Linux + 10,400 Windows job-min/day. Its "Run the hosted suites" step is the Remove tsc from npm prepare script #1 step in the repo by total minutes (~20,000 job-min/day).
Linux queue wait last 24h: p50 1.2 min, p90 12.8 min, worst hour (2026-10-07T16) p50 15.7 min. This hits ci.yml's Gradle e2e legs, which were the merge_group critical path in 16 of 21 sampled successful merge_group runs.
Failure rate on PRs: 10 failures in 431 runs (2.3%); 3 of them on feat/gradle-support.
Exact duplication on PRs. ci.yml's e2e job already runs, on every PR and merge_group, the ubuntu PR tier: 4 Gradle lines (6.9.4/jdk11, 7.6.6/jdk17, 8.14.3/jdk21, 9.8.0/jdk21) × {agent suites + all gradle_hosted_ (split across 3 legs since Cut merge-group CI from ~46 to ~20 min: shard Gradle e2e and test legs, skip test-release in queue, cancel orphaned runs #1133), gradle_vendor_ + gradle_multi_project} (ci.yml:1240-1255). The ubuntu cells of gradle-compatibility.yml run the same suites, filters, Gradle versions and JDKs on the same OS.
Grid extras on every PR. The JDK-ceiling / configuration-cache / isolated-projects (record-only) / real-Central rows are the "rows the PR tier never runs" per the workflow header, but they still trigger on every PR touching the broad paths: list (Cargo.toml, Cargo.lock, hosted/**, vex/**, commands/apply.rs, commands/scan/**, tests/common/**, …).
Proposed fix
In .github/workflows/gradle-compatibility.yml:
Exclude ubuntu-latest from cells on pull_request, the same way macOS is already excluded: exclude: - os: ${{ github.event_name == 'pull_request' && 'ubuntu-latest' || '' }} (keep the macOS exclusion as a second entry). The build ubuntu-latest job is then needed on PRs only when extras run.
Gate extras to schedule / workflow_dispatch, plus PRs that touch the Gradle core (crates/socket-patch-core/src/gradle/**, patch/redirect/*gradle*, vendor/jvm/**, this workflow). E.g. a small changes job with dorny/paths-filter (pinned SHA) or a git diff --name-only step, and if: github.event_name != 'pull_request' || needs.changes.outputs.gradle_core == 'true' on extras and build (ubuntu).
Windows cells stay on PRs: they're the only PR coverage of Gradle on Windows besides ci.yml's single e2e_vendor_jvm_build windows leg.
Expected saving
Ubuntu cells + extras = 304 of 536 job-min per successful run (57%). At ~62 PR runs/day × 488 job-min mean × 0.57 ≈ ~17,000 Linux job-min/day (7d average; the last 24h ran ~3× the 7d rate, so the 24h saving is higher). Minus extras on Gradle-core PRs (a minority).
macOS: 0. Windows: 0.
Critical path: none directly; indirectly it lowers Linux runner contention (p90 queue 12.8 min) that delays ci.yml's e2e Gradle legs on PRs and merge_group.
Coverage and risk
Ubuntu cells: the same suites/versions/JDKs still run on every PR and merge_group via ci.yml e2e, and in this workflow nightly (17 4 * * *). One small difference: the cells' probe-report artifact names (gradle-probe-ubuntu-…) won't be produced on PRs; ci.yml uploads gradle-probe-pr-ubuntu-latest-* from the same tests.
Extras: still run nightly, on dispatch, and on PRs that change Gradle core code. A regression that only shows on a JDK ceiling and comes from non-Gradle code would surface in the nightly instead of on the PR (≤24h later).
[agent] Triaged as priority:p3 (CI-only). No open PR references this yet; it is not a duplicate of the other CI-perf reports (#1170–#1178 each target a different workflow cost).
Profiler refresh, 2026-10-09 00:17 UTC (window: last 24h)
The cost has grown since this issue was filed. Gradle patch compatibility on pull_request ran ~213 PR runs/day, sampled at 272 Linux + 178 Windows job-min per run. That is about 58,000 Linux + 38,000 Windows job-min/day, the largest single consumer after CI itself (CI on PRs is ~89,000 Linux job-min/day).
The slowest jobs in the entire 24h sample are all Gradle compat Windows hosted cells. Their p50 run times: 7.6.6 / jdk 17 / windows 41.5 min, 9.8.0 / jdk 21 / windows 35.4 min, 6.9.4 / jdk 11 / windows 35.0 min. Most of it is the Run the hosted suites step: for example 8.14.3/windows spent 41.1 min there.
In the runs list, Gradle compat PR runs in the window finished success=24, cancelled=4, skipped=5, failure=0.
Measurement
Window: 2026-10-01 → 2026-10-08. Runs: 453
Gradle patch compatibilitypull_request runs in 7d (431 that weren't skipped, ~62/day; 185 in the last 24h across 50 PRs). Jobs sampled: 67 PR runs (40 successful).cells(4 Gradle lines × agent/hosted/vendor): 144 job-min/runextras(JDK ceilings, configuration-cache, isolated-projects, real-central): 160 job-min/runcells: 204 job-min/run;buildubuntu+windows: the rest.feat/gradle-support.Where the time goes
Root cause
e2ejob already runs, on every PR and merge_group, the ubuntu PR tier: 4 Gradle lines (6.9.4/jdk11, 7.6.6/jdk17, 8.14.3/jdk21, 9.8.0/jdk21) × {agent suites + allgradle_hosted_(split across 3 legs since Cut merge-group CI from ~46 to ~20 min: shard Gradle e2e and test legs, skip test-release in queue, cancel orphaned runs #1133),gradle_vendor_+gradle_multi_project} (ci.yml:1240-1255). The ubuntucellsof gradle-compatibility.yml run the same suites, filters, Gradle versions and JDKs on the same OS.paths:list (Cargo.toml, Cargo.lock,hosted/**,vex/**,commands/apply.rs,commands/scan/**,tests/common/**, …).Proposed fix
In
.github/workflows/gradle-compatibility.yml:ubuntu-latestfromcellsonpull_request, the same way macOS is already excluded:exclude: - os: ${{ github.event_name == 'pull_request' && 'ubuntu-latest' || '' }}(keep the macOS exclusion as a second entry). Thebuild ubuntu-latestjob is then needed on PRs only whenextrasrun.extrastoschedule/workflow_dispatch, plus PRs that touch the Gradle core (crates/socket-patch-core/src/gradle/**,patch/redirect/*gradle*,vendor/jvm/**, this workflow). E.g. a smallchangesjob withdorny/paths-filter(pinned SHA) or agit diff --name-onlystep, andif: github.event_name != 'pull_request' || needs.changes.outputs.gradle_core == 'true'onextrasandbuild (ubuntu).cellsstay on PRs: they're the only PR coverage of Gradle on Windows besides ci.yml's singlee2e_vendor_jvm_buildwindows leg.Expected saving
e2eGradle legs on PRs and merge_group.Coverage and risk
e2e, and in this workflow nightly (17 4 * * *). One small difference: the cells' probe-report artifact names (gradle-probe-ubuntu-…) won't be produced on PRs; ci.yml uploadsgradle-probe-pr-ubuntu-latest-*from the same tests.ci-ok/clippyunaffected.Effort
S (an exclude entry + a paths gate on one job).
ROI
17,000 Linux job-min/day × 0.5 (Linux weight) × confidence 0.7 / effort 1 ≈ 6000.