--disk_cache vs. --remote_cache, WORKSPACE/MODULE-Timeouts, Job-Parallelität und Git-Shallow neben Bazel. Vertiefung: Startseite, Technik-Blog, Mirror-Optimierung, Build-Pool & Platten-FAQ.
① Bazel-Externals & Registry: Engpassprofil auf Remote-Macs
Beim ersten bazel build //... dominieren drei Kostenblöcke: Netz-Downloads (http_archive, Maven/NPM über Rules, Bzlmod-Registries), IO auf der lokalen SSD (Entpacken, Symlinks, repository_cache) und Analyse/Graph. Auf geteilten Build-Macs verstärken sich diese Effekte, wenn mehrere Jobs gleichzeitig fetch-Phasen ausführen oder dieselbe Platte für Git-Objekte, output_user_root und Docker-Layer teilen.
- Registry-RTT: Bzlmod-JSON und Archive hintereinander laden → lange kritische Pfadketten bei hoher Latenz.
- Random-IO: Tausende kleiner Dateien in externen Repos erschöpfen IOPS schneller als sequenzielle Compiler-Ausgaben.
- Lock-Konflikte: Gemeinsames
output_baseohne Isolation führt zu blockierenden Server-Instanzen oder korrupten Locks.
Praxisregel: Externe Auflösung (bazel fetch / erste Analyse) separat messen; wenn sie >40 % der Kaltlaufzeit ausmacht, priorisieren Sie repository_cache, regionale Runner und WAN-Timeouts – nicht nur --jobs.
② Lokaler disk_cache vs. remote_cache: Schwellen-Tabelle
--disk_cache beschleunigt Aktions-Cache-Treffer auf derselben Maschine. --repository_cache (separate Option) puffert heruntergeladene externe Quellen. --remote_cache teilt Aktions-Artefakte im Team – wirkt erst nach stabilen Build-Keys und konsistenten Toolchains.
| Kriterium | Nur --disk_cache |
--remote_cache (+ optional disk) |
|---|---|---|
| Team-Trefferquote | Nur lokal / Host | Über Runner-Pool teilbar |
| Plattenbedarf | Wächst mit Targets; pro Host planen | Primär Netz + Server-Speicher |
| WAN-Last | Gering nach Warm-up | Abhängig von Cache-Nähe & TLS |
| Ops-Aufwand | Nur Pfad & Quota | Auth, TLS, GC, Zugriffskontrolle |
| Empfehlung | Einzel-Runner, schnelle NVMe | ≥2 geteilte Macs gleiche Flags/Toolchain |
Kopierbare .bazelrc-Fragmente (Pfade anpassen):
Entfernen Sie --noremote_upload_local_results, wenn vertrauenswürdige Runner Ergebnisse in den gemeinsamen Cache schreiben sollen.
③ WORKSPACE / MODULE: Timeouts, Retries & Parameter-Checkliste
Ob klassisches WORKSPACE oder MODULE.bazel mit Registries: der Downloader nutzt gemeinsame HTTP-Stacks. Skalieren Sie Timeouts vor dem Eskalieren der Job-Parallelität.
| Flag / Maßnahme | Zweck | Startwert (WAN / grenzüberschreitend) |
|---|---|---|
common --http_timeout_scaling=… |
Multiplikator für HTTP-Timeouts im Downloader | 2.0–4.0 |
| CI-Wrapper Backoff | Äußere Wiederholung bei transienten Fehlern | max. 3 Läufe, Pause 2s / 4s / 8s |
bazel fetch //… |
Externe Phase von Compile trennen | Eigenes Pipeline-Stadium mit Artefakt-Cache |
--output_base=… |
Isolation & reproduzierbare Locks | Pro Job eindeutiger Pfad auf SSD |
| Registry-Mirror (Bzlmod) | Redundanz & geringere RTT | Firmen-Proxy oder regionales Mirror-JSON |
Bei 401/403 nicht blind wiederholen – Secrets und Registry-ACLs zuerst fixieren. sha256-Pins in http_archive beibehalten, damit gespiegelte Archive nicht stillschweigend driften.
④ Git-Shallow & Bazel: Verzeichnisse, IO-Quoten & FAQ
Die Pipeline-Arbeitskopie darf --depth 1 nutzen, solange alle für Bazel sichtbaren Dateien vorhanden sind. Externe git_repository-Regeln legt Bazel unter dem Ausgabebaum ab – dort greifen andere Quoten als im Projekt-.git.
| Frage | Empfehlung |
|---|---|
| Gleiche SSD für Git und Bazel? | Ja, wenn NVMe; Pfade logisch trennen ($CI_PROJECT_DIR vs. output_user_root / repository_cache). |
| Platten-Warnschwelle | Ab 85 % Belegung Cleanup-Jobs; Bazel-Caches rotieren oder Job-Prefix löschen. |
| Inode-Erschöpfung | Externe Archive erzeugen viele kleine Dateien – df -i in CI loggen. |
| Shallow vs. feste Commits | Immer exakte Commit-IDs oder Tags in Rules; keine schwebenden Branches für reproduzierbare CI. |
Mehr zu parallelen Pulls und Runner-Pools: Git Submodule & LFS CI-Matrix.
⑤ Region des Remote-Mac-Knotens & parallele Builds: Stabilität der Pulls
Ein Runner in der Nähe Ihrer Artefakt-Quellen (Firmen-Registry, object storage, öffentliche CDN-Region) reduziert simultane TCP-Slow-Starts und Packet-Loss-Auswirkungen. Umgekehrt: hohe --jobs-Werte auf einem Host multiplizieren gleichzeitige HTTP-Verbindungen und können Proxy-Rate-Limits auslösen – sichtbar als sporadische timeout- oder reset-Fehler ohne Codeänderung.
| Szenario | --jobs-Start |
Erwarteter Effekt |
|---|---|---|
| Geteilter Mac, schmaler WAN-Uplink | 2–4 |
Weniger konkurrierende Downloads; stabilere Metriken |
| Dedizierter Mac, starker Remote-Cache-Treffer | auto oder ≤ Kernzahl |
CPU wird limitierend; WAN entlastet |
| Viele kleine externe Repos, kein repository_cache | niedrig + fetch-Stufe |
Verhindert Download-Stürme im Link-Step |
Für SSH-/Proxy-Beschleunigung zum Runner: SSH-Relay & Proxy.
Kurz-FAQ (Build-Alltag)
- Remote-Cache-Hits, aber langsame erste Builds?
repository_cacheund Externals prüfen; oft fehlen Archive-Treffer, während Aktions-Cache bereits warm ist.disk_cacheauf NAS?- Nur mit Vorsicht: hohe Latenz und Lock-Probleme; lokale NVMe bevorzugen oder dedizierten Cache-Server per
remote_cache. - Bzlmod-Registry zeitweise 5xx?
- Spiegel-URL in
MODULE.bazeloder Registry-Override nutzen; parallelhttp_timeout_scalinganheben.
Fazit
Fazit (2026): Stabile Bazel-CI auf Remote-Macs verbindet isolierte output_base-/Cache-Pfade, eine klare Strategie für repository_cache, disk_cache und remote_cache, hochskalierte HTTP-Timeouts und gedeckelte --jobs mit separater fetch-Phase. Wenn Ihre Pulls grenzüberschreitend hängen, lohnt sich die Wahl eines passend regionierten Knotens und eines nahen Artefakt-Caches oft mehr als weiteres Hochdrehen der Parallelität. Mieten oder kaufen Sie Apple-Silicon-Runner über die Startseite, vergleichen Sie Pakete auf Kaufen und Preise, und nutzen Sie Hilfe zu SSH & Verbindung ohne Pflicht-Login.
Nächste Schritte – ohne Login
Startseite, Pakete, Preise und Hilfe mit SSH-Anleitungen; Technik-Blog für CI- und Netz-Themen.