Repository navigation
Faster CI: Windows builds on D:, Defender and Spotlight off, parallel builds - #154
Conversation
3a5a22c to
10b9347
Compare
ABI check (linux-64)lyrical linux-64: 10 can be bumped on their own10 packages can be bumped on their own (compatible: 7, no libraries: 3)
Compared with the newest builds on https://repo.prefix.dev/robostack-lyrical/linux-64. About this checkEach package this pull request built, compared with its newest released build (
Exported symbols are compared (the released packages are stripped, so struct layouts aren't); unchanged installed headers rule out layout and inline changes, changed ones are listed for review. Dependents to rebuild are the released ones linking to a changed library. A changed pin is part of the comparison. |
10b9347 to
ce59dd8
Compare
|
Run B (547edaa Defender off, ca5d5f6 Spotlight off), per-recipe wall time against lyrical's build-branch jobs:
On Windows, installs went from 95 s to 58 s and clean-up from 54 s to 21 s; compiling was unchanged. The Next: run C (e46dea1 parallel builds, 362f46f estimate from timings), then run D (builds on D:) and run E (Dev Drive). 🤖 Claude (AI assistant), on behalf of @Tobias-Fischer |
|
Run C (e46dea1: rattler-build 0.77 with
Windows has no jobserver, so two builds each run a full ninja on 4 cores and the slow C: drive. With 6–10 packages per platform these are rough. 362f46f's estimate ignores the parallelism so far (Linux: "6 min" for 3–5 min). Next: run D (8db49c6, Windows builds on D:). 🤖 Claude (AI assistant), on behalf of @Tobias-Fischer |
|
Run D (8db49c6, Windows: builds, package cache and TEMP on D:). win-64 build step: 1216 s → 305 s (−75%), same 6 packages as run C. D: has 146 GB free (C: 82 GB). Linux and macOS are unchanged from C, so this is a repeat (same 10 packages):
So Linux and osx-arm64 repeat to within ~10%, while osx-64's Intel runners vary by a third: its −28% (B) and −7% (C) are within that noise. Next: run E (322d960, a Dev Drive instead of D:). 🤖 Claude (AI assistant), on behalf of @Tobias-Fischer |
bfb3479 to
af8d30d
Compare
|
Run E: no Dev Drives on Linux and macOS build step over the four identical runs C, D, E, E': linux-64 284/256/252/292 s, linux-aarch64 185/181/188/226 s, osx-arm64 352/344/360/333 s, osx-64 654/864 s. Next: run F (af8d30d), the setup before this PR with the same test packages, as a same-day baseline. 🤖 Claude (AI assistant), on behalf of @Tobias-Fischer |
Installing the build and host environments and deleting a package's work directory afterwards took 3-4x as long as compiling in lyrical's win-64 jobs (e.g. 377 s of installs and 186 s of clean-up against 127 s of builds, the clean-up ending in "Access is denied" retries): Defender scanning every file. The runners are thrown away after each job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Spotlight's indexer works through every file the environments and builds write; other projects saw it take one or two of a GitHub macOS runner's three or four cores (PennyLaneAI/catalyst: "xcode builds very slow if we don't turn off spotlight"). The runners are thrown away after each job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rattler-build 0.77's --parallel-builds builds outputs whose dependencies are ready side by side; on Linux and macOS they share a make/ninja jobserver with the runner's cores, so they don't oversubscribe it. Windows has no jobserver: two builds at a time. A PR's builds run in one rattler-build call per platform, so most of their per-recipe time (environment installs, configure, packaging) can overlap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ci_estimate.py counted every package to build at one flat per-platform average from jazzy's October rebuild (19 s on linux-64, 69 s on win-64), so rebuilding rtabmap was estimated like a message package. It now adds up each recipe's measured time (build_timings.timings(), the same times vinca packs the build jobs by); the flat averages stay for platforms without times and for the packages restored from the cache. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GitHub's Windows runners have a faster second drive (D:, about 14k IOPS against C:'s 4.5k, chadgolden1/gh-runner-benchmarks); uv uses it for the same reason. The package cache moves with the builds so that rattler keeps hardlinking packages into the environments. Prints both drives' free space. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
build_unix.sh / build_win.bat call build-ci once with all of the job's recipes instead of once per recipe. build-ci then adds --parallel-builds (3 builds sharing a jobserver with the runner's cores on Linux and macOS, 2 on Windows) and --log-style json: parallel builds interleave their output, so it prints each line as "HH:MM:SS [recipe] message", and records each recipe's time from its first to its last line in its build span for packing the jobs. Locally (osx-arm64), the 20 test recipes of #154 build in 169 s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A recipe's time measured while others build alongside is longer than its share of the job. Scaling all of them by wall time / their sum gives each recipe its share, which is what packing the jobs needs (and what the serial times were). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
They only repackage but, building alongside, mostly wait for the others: their measured times inflated the sum that the packages' times are scaled by. The timing files never keep them (ALIAS_SECONDS), so leave them out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
af8d30d to
c953590
Compare
|
Run F (af8d30d: the setup before this PR, same test packages). Build step against this PR's setup (mean of runs C, D, E, E′; Windows: run D):
Next: run G+H (c953590): Windows one build at a time on D:, macOS with Spotlight on. 🤖 Claude (AI assistant), on behalf of @Tobias-Fischer |
Two parallel builds were no faster on Windows (#154: 305 s against 282 s for one at a time, with the builds on D:), and there is no jobserver to keep them from oversubscribing the cores. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
c953590 to
3dfe5c8
Compare
|
Run G+H (c953590):
osx-64's job failed only while saving the cache artifact ( Next: run I, Defender on, on the final setup. 🤖 Claude (AI assistant), on behalf of @Tobias-Fischer |
|
Run I (3dfe5c8, the final setup with Defender on):
Next: the final branch replaces the test commits. 🤖 Claude (AI assistant), on behalf of @Tobias-Fischer |
3dfe5c8 to
aca5a18
Compare
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
c13d78d to
94cd474
Compare
rolling: snapshot of rosdistro master from 2026-10-16 (full rebuild), on the shared conda-forge pinning and the shared Qt6 mapping. - distro.yaml: robostack-rolling on prefix.dev and anaconda.org, the shared pinning; - build_number 32, the mutex without its own build number: 0.23.0 rolling_32; - package fixes for the new versions (patches, dependencies, pkg_additional_info), rviz 16 / tf2_ros 0.46, ur_robot_driver on ros2_control 6.12; - shared tests: std_msgs uses the environment's Python, longer smoke-test timeouts; - ci.yaml: evict_cache reset. [skip ci]: the build branches are regenerated by the merge of #154 right after, which changes shared files and so regenerates every distribution, this one included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Faster CI jobs on all platforms, from measurements on this PR (comments below).
Changes
build_win.batbuild_win.batmdutil -a -i off)build_unix.sh--parallel-builds 3:<cores>(jobserver); Windows one at a timers buildrunbuild-cirun per job, see belowci_estimate.py)On the build branches, each job's recipes now build in one rattler-build run with
--log-style json:build-ciprints each line asHH:MM:SS [recipe] message, since parallel output interleaves.ros-<distro>-*) keep the constantALIAS_SECONDS.Measurements
Each run rebuilt the same lyrical packages (temporary commits, dropped before merging). The times are the "Build recipes" step.
Windows, win-64, 6 packages:
| G | D:, Defender off, 1 build at a time (final) | 282 s |
| I | D:, Defender on, 1 build at a time | 441 s |
Access is deniedretries remain (MSVC'smspdbsrv.exe, Windows: test cleanup fails withAccess is denied (os error 5)when a test spawns a lingering child process (MSVC mspdbsrv.exe) prefix-dev/rattler-build#2657) but take ~1 s.windows-2022has no Dev Drives, and a plain ReFS volume broke rattler-build's reindex (run E).Parallel builds (run C against serial run B, normalised by the recipes' measured times):
Before and after, pre-PR setup (run F) against this PR's setup (mean of runs C, D, E, E′):
Repeatability: identical runs vary by ±8% on linux-64 and ±2% on linux-aarch64 (one outlier at +16%). osx-arm64 took 333–360 s in four runs but 485 s in a fifth, and osx-64's Intel runners vary by about a third. So the macOS numbers are rough.
Spotlight: osx-arm64 took 414 s with Spotlight on (run H), against 333–485 s with it off: unproven. It stays off as a one-line change that other projects report helping (PennyLaneAI/catalyst, CapSoftware/Cap).
Before merging
.scripts/build_*.sh/.bat, so their changes are first exercised by the build-branch runs after the merge. Watch the first Windows jobs..github/,.scripts/andtools/: merging regenerates every distribution's build branches.🤖 Generated with Claude Code