127.0.0.1 mit Bearer- oder HMAC-Prüfung. Der Handler führt Abhängigkeits-Preflight (npm ci --dry-run, composer validate usw.) und einen Lockfile-Drift-Scan aus und postet eine kurze Build-Zusammenfassung zurück an die TeamCity-REST-API — mit Backoff 2/4/8 s und klaren Logs. Dieses Tutorial folgt docs.openclaw.ai für Node 22+/24 LTS, openclaw onboard, openclaw doctor und openclaw onboard --install-daemon sowie Gateway-Health. Vertiefung: Jenkins Generic Webhook & Preflight, CircleCI-Webhook & Lockfile und LaunchAgent-Healthcheck.
Warum Remote-Mac als CI-Vorknoten? Dedizierter Apple-Silicon entkoppelt git fetch und Registry-Last von geteilten TeamCity-Agenten: reproduzierbare Latenz, NVMe-Workdirs, 24/7 — sinnvoll bei Rechenzentrums-Split und stabilem Egress zu Git/Artefakten.
| Schicht | Aufgabe | Praxis-Hinweis 2026 |
|---|---|---|
| TeamCity | POST mit buildId, Branch, Revision | HTTP-Timeout > p95-Preflight + TLS-Marge |
| TLS-Reverse-Proxy | Terminierung, Rate-Limits, Request-IDs | Authorization nicht strippen |
| OpenClaw | Validierung, Skills, Logs | Schnelles 2xx/202, schwere Arbeit async |
| TeamCity REST | Kommentar / Problem / Status | PAT nur Projektbereich, kein Global-Admin |
- TeamCity-Timeout zu knapp: Der Server bricht den ausgehenden POST ab, obwohl der Mac noch korrekt arbeitet — messen Sie p95 und addieren Sie 30–60 % Puffer oder nutzen Sie
202 Acceptedplus Hintergrundjob. - Lockfile grün, Build rot: falscher Referenz-Commit oder andere Registry-Kette als im Agent —
git fetchund Diff gegen dieselbe VCS-Root wie TeamCity. - launchd ohne Toolchain:
npmin SSH vorhanden, im Daemon nicht — absolute Pfade oderenv-Datei in der LaunchAgent-Plist.
Installation, Node, openclaw onboard --install-daemon
Node 22+ bzw. 24 LTS; npm i -g openclaw@latest; openclaw doctor bis grün. Für Dauerbetrieb: openclaw onboard --install-daemon → typisch LaunchAgent. launchd hat nicht dieselbe PATH-Semantik wie die SSH-Shell — NODE_BINARY, PATH, optional NODE_EXTRA_CA_CERTS in der Plist setzen; mit sudo -u … which node prüfen.
Gateway-Port und Health: Beispielport in der Doku oft 18789; effektiven Wert in openclaw.json lesen. openclaw status, openclaw status --deep, openclaw health laut Doku; ergänzend Loopback-/health mit demselben Bearer wie das Dashboard.
- Dienstbenutzer: eigener macOS-Account für OpenClaw, Schreiben nur für Logverzeichnis und temporäre Workdirs — kein breites
sudo. - TeamCity-Seite: dedizierter Benutzer oder PAT nur mit Rechten für Lesen der Ziel-Builds und REST für Kommentar/Status — keine Server-Administration.
- Geheimnisse: Gateway-Token, Webhook-Shared-Secret und TeamCity-PAT in Dateien
chmod 600oder Secret-Store; nie Klartext in TeamCity-Parameter-UI ohne eingeschränkte Sichtbarkeit.
TeamCity: PAT mit kleinstem Umfang & ausgehender Webhook
PAT/Service-User nur für Ziel-buildType und benötigte REST-Pfade (Kommentar/Problem o. Ä.) — kein globaler Server-Admin. Webhook: Plugin, Build-Feature oder früher Schritt mit curl; klären, ob der POST vom TeamCity-Server (Firewall!) kommt.
JSON-Minimum: buildId, buildTypeId, branchName, revision, optional webUrl. Authorization: Bearer … plus optional HMAC auf Roh-Body (X-Signature).
- Eingehend (Mac): statischer Bearer oder HMAC — rotieren ohne Commit ins Git.
- Ausgehend (Mac → TeamCity): PAT/Basic nur für REST-Pfade, die Sie wirklich beschreiben.
- Dashboard: separates OpenClaw-Dashboard-Token, nicht mit Webhook-Secret mischen.
Gateway, TLS, Bearer-Validierung
Der eigentliche OpenClaw-Prozess sollte nur auf 127.0.0.1 lauschen; TLS endet am Reverse-Proxy. Ihr Handler prüft zuerst den statischen Bearer und optional HMAC über den Roh-Body — konstantzeitiger Vergleich, keine Secrets in stdout. Nach erfolgreicher Prüfung antworten Sie innerhalb weniger Sekunden mit HTTP 200 oder 202 und übergeben Clone, Resolver und Lockfile-Scan an eine Queue, einen Worker oder ein OpenClaw-Skill. Warten Sie im selben Request auf Minuten-Preflights, bricht TeamCity den ausgehenden Aufruf mit Socket timeout ab, obwohl der Mac im Hintergrund noch arbeitet.
Bewahren Sie den Roh-Body (Buffer) vor dem JSON-Parse; so bleibt eine spätere Signatur-Erweiterung möglich. Für Unternehmens-CA: NODE_EXTRA_CA_CERTS setzen und curl -v vom TeamCity-Server aus gegen Ihre öffentliche URL fahren.
Webhook-Validierung: Prüfplan vor Produktion
- 1. Beispiel-JSON wie von TeamCity gesendet speichern; mit
curlund korrektemAuthorizationgegen Staging-URL senden und Parser/Signatur testen. - 2. Einen echten Build mit Testprojekt auslösen;
buildIdin TeamCity-Server-Log, Proxy-Access-Log und Mac-Anwendungslog vergleichen. - 3. Absichtlich falsches Secret: muss 401 liefern, ohne Nebenwirkungen; TeamCity soll den Schritt als fehlgeschlagen markieren oder retry-fähig konfiguriert sein.
- 4. Zeit vom ersten Byte bis Antwortende messen — Ziel: nur Auth + Enqueue, typisch <2 s, bevor schwere Shell startet.
Preflight, Lockfile-Drift und Workdir pro Build
Viele Teams führen einen leichten Preflight bereits in TeamCity aus; der Mac wiederholt ihn als „truth layer“ mit derselben Toolchain-Version wie Ihr OpenClaw-Stack. Nutzen Sie WORKDIR=$(mktemp -d), shallow clone, Checkout exakt auf revision aus dem Webhook. Typische Befehle:
Für Lockfile-Drift z. B. git fetch origin && git diff --exit-code origin/main -- package-lock.json pnpm-lock.yaml composer.lock — Exit-Code 1 bedeutet Drift. Private Registries: COMPOSER_AUTH bzw. npm_config_//… in der LaunchAgent-Umgebung setzen, nicht in der TeamCity-UI loggen. Parallelität: pro buildId ein Workdir oder Repo-weises File-Lock, sonst überschreiben sich Klone und der Scan lügt.
- Health-Intervall: z. B. 60 s Loopback-
/health, Alarm nach drei Fehlschlägen in Folge. - Preflight-Cap: Shell-Timeout 300–600 s für Hintergrundjobs auf dem Mac.
- Summary-Größe: JSON-Feld
summaryunter ~2 KB, Rest im Logfile.
Schritte-Checkliste (minimal reproduzierbar)
- Node 22+ bzw. 24 LTS installieren;
npm i -g openclaw@latest;openclaw doctorgrün. openclaw onboarddurchlaufen;openclaw onboard --install-daemonoder LaunchAgent;PATH/NODE_BINARYin Plist angleichen.- Gateway nur
127.0.0.1; TLS-Proxy;curlauf/healthmit Bearer wie in der Doku. - TeamCity-PAT mit kleinstem Umfang erzeugen; in Mac-Umgebung als Datei
600ablegen. - Webhook/HTTP-Schritt konfigurieren: JSON mit
buildId,revision, Bearer/HMAC, Timeout > p95-Preflight. - OpenClaw-Handler: Auth → optional
202→ Clone → Preflight + Lockfile-Diff → Log nach~/Library/Logs/…mitbuildId-Präfix. - REST-Callback an TeamCity: kompaktes JSON/Kommentar; Backoff 2 / 4 / 8 s, max. drei Versuche bei 5xx/429; kein Retry bei 401/403.
- Smoke-Test mit Dummy-Build; danach Freigabe in Produktion.
Build-Zusammenfassung zurück an TeamCity (REST + Retry)
Nach dem Preflight senden Sie ein kurzes JSON oder einen formatierten Kommentar an einen passenden /app/rest/…-Endpunkt — je nach TeamCity-Version und Plugin. Felder wie preflightMs, lockfileDrift (true/false), status (ok/warn/fail) und ein summaryText mit den letzten Zeilen stderr helfen Entwicklern in der Build-Übersicht. Verwenden Sie für den Rückkanal einen anderen Token als für den eingehenden Webhook.
Scheitert der Callback nach allen Versuchen, schreiben Sie BODY und buildId in eine Fehlerqueue auf dem Mac — der eingehende Webhook wurde bereits mit 2xx/202 bestätigt, wenn Sie async arbeiten. So vermeiden Sie widersprüchliche Zustände zwischen TeamCity-Timeout und langem Resolver.
FAQ: typische Fehler & Log-Ort
TeamCity meldet „Connection timed out“ zum Mac?
Firewall vom TeamCity-Server zur öffentlichen URL, falsches SNI oder Proxy ohne CONNECT. Mit curl -v direkt auf dem TeamCity-Host testen; DNS und MTU prüfen.
401 beim eingehenden Webhook?
Bearer falsch oder doppelt URL-kodiert; Reverse-Proxy entfernt Authorization. Konstantzeitig vergleichen und nie detaillierte Token-Fehler an TeamCity zurückgeben.
401/403 beim REST-Callback Mac → TeamCity?
PAT abgelaufen, falsches httpAuth-Schema oder fehlende Projektberechtigung — Credentials fixen, keine Endlos-Retries.
Preflight ok, aber Lockfile-Scan inkonsistent?
Falscher Referenz-Branch oder veralteter fetch; gleiche Remote-URLs wie der TeamCity-VCS-Root verwenden.
Wo loggen?
Anwendungslogs unter ~/Library/Logs oder vom LaunchAgent mit StandardOutPath; dazu log show --predicate … für launchd. Jede Zeile mit buildId versehen.
Nächste Schritte und CTA
Fazit: Die reproduzierbare Kette lautet: stabiler Remote-Mac mit Node 22+ und LaunchAgent-Daemon, Loopback-Gateway + TLS, TeamCity-Webhook mit Bearer/HMAC, schnelles ACK, Preflight + Lockfile-Drift im isolierten Workdir und REST-Summary mit 2/4/8-s-Backoff. Für Teams, die TeamCity-Queues entlasten und grenzüberschreitende Pulls konsolidieren wollen, ist ein gemieteter Mac-Knoten oft günstiger als dauerhaft überlastete Shared-Agenten. Ohne Login: Startseite, Hilfe, Kaufen, Preise und die OpenClaw-Praxis-Serie im Technik-Blog.
CI-Vorknoten mieten — TeamCity entlasten
Apple-Silicon, stabiler Egress, SSH-fertig: Preflight und OpenClaw-Gateway ohne Heimrechner-Risiko. Hilfe, Kaufen und Blog sind öffentlich.