bundle check/outdated → Retry/Logs → POST), FAQ. Mehr OpenClaw: Jenkins, GitHub Checks, CircleCI, Healthcheck.
Typische Engpässe ohne Gateway-Kette
- launchd vs. SSH: andere Ruby/
bundle-Pfade → scheinbar grüne Preflights. - Gemeinsames Workdir: parallele Webhooks korrumpieren
Gemfile.lock/Diffs. - Kein POST-Rückkanal: Logs nur lokal, kein einheitlicher Alarm.
Entscheidungsmatrix: synchrone vs. asynchrone Phase
Schneller Handler vs. Hintergrund — Bundler-fokussiert, vergleichbar mit anderen OpenClaw-Webhooks.
So bleibt der eingehende Webhook unter typischen Plattform-Timeouts, während bundle install oder lange Scanner in einer Worker-Warteschlange oder einem zweiten Schritt laufen können.
| Kriterium | Synchrone Phase (HTTP 2xx schnell) | Asynchrone Phase (Queue / zweiter POST) |
|---|---|---|
| Authentifizierung | Shared Secret, Bearer oder HMAC auf Roh-Body | Gleiches Modell für Ziel-Webhook; keine zweiten Secrets im Repo |
| Bundler | bundle check, ggf. kurzes bundle outdated --parseable |
Volle bundle install-Pfade, große Logs, optionale Security-Scanner |
| Zeitbudget | Typisch 5–15 s bis Antwort (Plattform abhängig) | Retries 2 / 4 / 8 s, harte Obergrenze pro Ziel |
| Output | Kurz-JSON mit Statusflags und gekürztem logExcerpt |
Archivierte .log.gz, optional zweites Ticket-System |
Schritt 1 — Installation: Node, OpenClaw-CLI, Ruby und Bundler
Node 22.16+/24 LTS, OpenClaw per docs.openclaw.ai, openclaw onboard + openclaw doctor. Ruby/bundle für den Dienstuser mit absoluten Pfaden in der LaunchAgent-Plist (nicht nur Shell-PATH).
openclaw doctorals Dienstuser grün.- Plist-Pfade versioniert; Git read-only getestet.
ALERT_WEBHOOK_URL+ Secret nur im Store.
Schritt 2 — Gateway-Daemon, Dashboard-Token und Healthchecks
Automation an 127.0.0.1, TLS davor; Dashboard nach Onboarding als Status-UI. LaunchAgent mit minütlichem curl auf die Health-Route (Details: Healthcheck).
Hinweis: Gleiche Summary an mehrere Ziele nur mit gemeinsamem deliveryId/Idempotenz-Key.
Schritt 3 — Wegwerf-Arbeitsverzeichnis (Sandbox) pro Lieferung
Pro Lieferung neues Verzeichnis (NVMe-Scratch oder /var/tmp), shallow clone des Payload-SHAs, BUNDLE_PATH wie in CI.
Kein gemeinsames WORKDIR bei Parallelität.
Schritt 4 — Skriptvorlage: bundle check, bundle outdated und Diff-Kurzsummary
bundle check (Lock vs. installierte Gems), dann bundle outdated --parseable mit head-Limit. Optional git diff origin/$DEFAULT_BRANCH -- Gemfile.lock. JSON-Felder: ok, buildId, repo, branch, bundlerVersion, outdatedCount, logExcerpt.
Minimal-bash-Gerüst (Pfade anpassen):
Als OpenClaw-Skill parametrisieren mit BUNDLE_BIN, DEFAULT_BRANCH, ALERT_WEBHOOK_URL; logExcerpt kürzen, Volllog → Archiv.
Schritt 5 — Fehler-Retry, Log-Rotation und Archiv
Bis zu 3 Versuche, Pausen 2 / 4 / 8 s. Logs nach ~/Library/Logs/openclaw-bundler/$(date +%F)/, gzip, Retention z. B. 14 Tage.
| Versuch | Pause bis Retry | Typische Ursache |
|---|---|---|
| 1 | — | Erster bundle-Lauf |
| 2 | 2 s | Kurzer Timeout gegen rubygems.org / Spiegel |
| 3 | 4 s, dann 8 s | Rate-Limits, DNS-Jitter |
Schritt 6 — Generischer HTTP-Webhook: Zusammenfassung zurück an Ops
POST kompaktes JSON an beliebiges HTTPS-Ziel; Authorization: Bearer oder statisches Secret; curl --max-time 25.
deliveryId aus Original-Payload mitgeben → dedupe am Empfänger.
FAQ: launchd, Bundler, Webhook-401
bundle check per SSH grün, unter launchd rot?
Shims fehlen im Dienst → absolute Pfade in der Plist; Test sudo -u ….
Preflight grün, Pipeline bricht bei nativen Extensions?
bundle check ≠ Compiler/Tests — Grenze dokumentieren.
Webhook 401 trotz funktionierendem curl?
Header/Body exakt, kein Pretty-JSON vor HMAC, Allowlists/Proxy prüfen.
Scratch voll?
TTL, Nacht-Job, zentraler Bundle-Cache nach Lock-Checksum.
Fazit
Remote-Mac für Gateway & CI-Preflight mieten
Statt Laptop oder wechselnder VM hosten Sie Listener und Bundler-Sandboxes auf Apple Silicon bei MacPull — Kaufen und Preise sind öffentlich lesbar; Hilfe erklärt SSH und typische Relay-Szenarien ohne Kontopflicht zum Lesen.