Zielgruppe: Plattformteams, die Azure DevOps „Build completed“ per Service Hook auf einen Remote-Mac mit OpenClaw routen, Prefetch auslösen und einen JSON-Summary-Rückkanal mit Geheimnisprüfung vor schweren Pipeline-Schritten benötigen. Fokus: Azure-Felder, Basic-Webhook-Geheimnis und Hook-Historie als Audit — nicht generische CI-Signatur-Tutorials. Baseline: docs.openclaw.ai, Node 22+, openclaw onboard, openclaw doctor, Gateway auf 127.0.0.1 hinter TLS. Links: Gateway-Härtung, Healthcheck & LaunchAgent, GHCR-Matrix.
  • Filter: falsche definition.id → stille Nicht-Lieferung trotz grüner Builds.
  • TLS ≠ Auth: HTTP-Basic plus Roh-Body vor JSON.parse; CIDR-Listen allein reichen nicht.
  • Stabilität: Remote-Mac statt schlafendem Laptop für Listener und launchd-Logs.

2026 Gateway-Baseline: Node-Version, OpenClaw-Port, PAT least privilege

Node 22 LTS oder Node 24 wenn openclaw doctor sauber ist; openclaw onboard, optional --install-daemon laut Doku.

~/.openclaw/openclaw.json → echter Gateway-Port (oft nahe 18789, verifizieren). Health-curl und NODE_BINARY in derselben launchd-Umgebung wie OpenClaw.

Signal / Kontrollpunkt Azure DevOps Perspektive Minimal-Muster auf dem Mac
Webhook-Geheimnis Service Hooks unterstützen HTTP-Basic (Benutzername frei wählbar, Passwort = gemeinsames Secret) Authorization dekodieren, Passwort zeitkonstant vergleichen, erst danach JSON parsen
PAT least privilege Prefetch meist Code (Read) + Build (Read); optional separates schmales Token für Timeline-Kommentare ADO_PREFETCH_PAT nur in Dateien/Env mit Modus 600, Rotation bei Azure-Ablauf-Mail
Netzwerk Ausgang ggf. über Shared Infrastructure Edge-Allowlist nur als Ergänzung zu Basic

Review: PAT-Scopes, Secret-Rotation, Hook-URL mit Pfad-Token dokumentieren; definition.id-Whitelist plus Basic = kleinstes stabiles Muster.

Enterprise-Umgebungen verankern PAT-Laufzeiten und Scopes häufig in Azure Policy — planen Sie zwei Tokens, eines strikt read-only für Prefetch-Klon und Build-Metadaten, ein optionales zweites nur für Timeline- oder Kommentar-APIs. Versionieren Sie eine anonymisierte Hook-JSON aus der Historie als Parser-Fixture im Repository, damit Reviews ohne Produktionsgeheimnisse laufen. Für parallele Definitionen je Umgebung eigene Pfad-Tokens und Secrets verwenden, damit Staging nie Produktions-Prefetch auslöst.

Trigger-Felder im Service Hook, Filter und Verifikations-Checkliste

Projekteinstellungen → Service hooks → Web Hooks → Build completed: eine Definition filtern, HTTPS-URL mit Pfad-Token, HTTP-Basic aktivieren.

Parser-Felder: resource.id, buildNumber, status, sourceBranch, requestedFor, url / _links.web.href, definition.id, project.id, repository.id. Schlankes Event → Commit per REST nachziehen.

1
TLS + Pfad-Token; Roh-Body für Secret-Checks unverändert.
2
Basic: User ado-hook, Passwort = ADO_HOOK_SECRET.
3
Fixture aus Hook-Historie nach grünem Build exportieren.
4
Auth zuerst, dann definition.id / project.id whitelisten.
5
Schnell 200/202, Prefetch async.
6
Replay: curl --user ado-hook:$SECRET --data-binary @fixture.json vom gehosteten Agent.
# Nach TLS: Basic prüfen, erst dann JSON.parse (Skizze)
# const [u,p]=decodeBasic(req.headers.authorization);
# if (u!=='ado-hook' || !timingSafeEqual(p, process.env.ADO_HOOK_SECRET)) return 401;

Ausführbare Prefetch-Befehle und Wegwerf-Workdirs

Ein Event = ein mktemp-Workdir unter /var/tmp, PAT nur für git clone, danach rm -rf.

export GIT_TERMINAL_PROMPT=0
WORKDIR=$(mktemp -d /var/tmp/ado-openclaw.XXXXXX)
git -C "$WORKDIR" clone --depth 1 "https://anything:$(printf %s "$ADO_PREFETCH_PAT")@dev.azure.com/org/project/_git/repo" src
cd "$WORKDIR/src" || exit 1
npm ci --dry-run 2>/dev/null || npm install --dry-run --ignore-scripts
pnpm fetch --frozen-lockfile 2>/dev/null || true
composer install --dry-run --no-interaction --no-ansi 2>/dev/null || true
rm -rf "$WORKDIR"
curl -fsS --max-time 8 "http://127.0.0.1:18789/health" || echo "health failed"

Exit-Codes + Log-Tail in die Summary; große Logs extern mit logSha256.

Build-Summary-JSON, Log-Snippet-Vorlage und Retry-Backoff

Kleines application/json an Observability oder Azure-REST mit schmalem zweiten PAT; Felder openclawJobId, prefetchMs, optional logSha256.

read -r -d '' PAYLOAD <<'JSON'
{
  "schema": "macpull.openclaw.prefetch.v1",
  "buildId": 12345,
  "definitionId": 67,
  "status": "prefetch_ok",
  "prefetchMs": 4200,
  "packages": {"npmExit":0,"composerExit":0},
  "logExcerpt": "… letzte 80 Zeilen …",
  "openclawJobId": "ocw_01jq…"
}
JSON

for s in 2 4 8; do
  curl -fsS --max-time 25 -H "Content-Type: application/json" \
    -H "Authorization: Bearer $SUMMARY_TOKEN" \
    --data-binary "$PAYLOAD" "$SUMMARY_URL" && break
  sleep "$s"
done

Drei Versuche, Pausen 2 / 4 / 8 s, curl --max-time 25.

FAQ: Azure DevOps Service Hooks mit OpenClaw auf dem Mac

Hook 200, Mac schweigt

Statischer Edge-200: Basic in der App erzwingen, Access-Log prüfen, Upstream bis OpenClaw verfolgen.

Kein Commit im Payload

resource.sourceVersion oder resource.url per Read-PAT nachlesen.

Summary-POST 401

Zweites PAT mit passendem Scope; Prefetch-PAT strikt read-only halten.

npm fehlt unter launchd

Absolute node-Pfade, NODE_BINARY, openclaw doctor — siehe Healthcheck-Artikel.

Abnahme-Checkliste (vor Produktions-Freigabe)

openclaw doctor sauber; Health-curl aus launchd; Hook-Historie mit Basic-200; Wegwerf-Clone ok; Summary zweimal grün in Staging; keine Secrets in Azure-Logs.

Remote-Mac bei MacPull für dauerhaften Listener: Startseite, Kaufen, Hilfe, Technik-Blog.

MacPull: Apple-Silicon-Macs für stabile OpenClaw-Gateways, Azure-Service-Hooks und begrenzte Summary-Retries.

OpenClaw- plus Azure-DevOps-Gateway dauerhaft online halten

Mieten Sie einen Remote-Mac-Mini für einen stabilen OpenClaw-Listener, TLS für Microsoft-Service-Hooks und überwachte launchd-Jobs — Einstieg über Startseite, Kaufen, Hilfe oder den Technik-Blog ohne Anmeldung.