Objectif : relier Azure DevOps à OpenClaw sur un Mac distant pour un pré-tirage déclenché par les service hooks Build completed, avec HTTP Basic comme porteur de secret, PAT minimal, puis synthèse JSON et retry 2 / 4 / 8 s. L’angle diffère des guides Jenkins ou TeamCity déjà publiés. Approfondissez avec durcissement passerelle, matrice GHCR et déploiement passerelle.

Pourquoi ce branchement échoue encore en 2026

  1. Payload partiel : resource.url exige souvent un GET PAT ; ne parsez pas avant d’avoir le commit.
  2. TLS seul insuffisant : imposez Basic ou en-tête secret avant JSON.parse.
  3. Veille : préférez un Mac loué avec launchd et chemins absolus node.

Matrice rapide : signal Azure DevOps côté Mac

SignalCôté Azure DevOpsCôté Mac OpenClaw
SecretService hook Web avec HTTP Basic (mot de passe fort)Décoder Authorization, comparer en temps constant, puis lire le JSON
PATPortée minimale Build (Read) + Code (Read) pour clone et métadonnéesFichier 0600, variable ADO_PREFETCH_PAT, rotation sur mail d’expiration
RéseauDocumentation des plages sortantesListe blanche au proxy ; journaliser seulement les hôtes, jamais le PAT
Port passerelleN/ALire la valeur réelle dans openclaw.json ; 18789 est une valeur fréquente mais non garantie

Socle 2026 : Node, OpenClaw, port et daemon

Node 22 ou 24 LTS, openclaw onboard, option --install-daemon, puis openclaw doctor vert. OpenClaw en 127.0.0.1 derrière TLS ; gardez le corps brut pour toute signature. Sondez /health sur le port lu dans ~/.openclaw/openclaw.json (souvent 18789, à vérifier).

openclaw doctor grep -E 'port|gateway|listen' ~/.openclaw/openclaw.json || true curl -sS -o /dev/null -w "%{http_code}\n" --connect-timeout 2 --max-time 8 http://127.0.0.1:PORT_REMPLACE/health

launchd : fixez NODE_BINARY et le chemin npm/pnpm pour éviter les écarts de PATH.

Champs du déclencheur Azure DevOps et filtrage

Project settings → Service hooks → Web Hooks → Build completed ; filtrez sur une définition. Champs usuels : resource.id, buildNumber, status, sourceBranch, requestedFor, url / _links.web.href, definition.id, ids projet. Sans sourceVersion, GET resource.url avec le PAT lecture.

Séquence minimale côté handler
  • Basic ou secret d’en-tête avant JSON.parse.
  • Whitelist definition.id / project.id.
  • Réponse rapide puis pré-tirage async ; rejouer avec curl --user ado-hook:$SECRET --data-binary @sample.json depuis agent hosted.

Commandes de pré-tirage exécutables

Répertoire jetable par événement, clone --depth 1 avec PAT inline, dry-run paquets, suppression du dossier.

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/projet/_git/depot" 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"

Journalisez codes de sortie et un extrait court ; gros logs vers stockage objet.

Modèle de synthèse, extrait de log et retry 2 / 4 / 8 s

POST JSON compact ; max trois essais, pauses 2 / 4 / 8 s, curl --max-time 25.

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": "dernieres_lignes_filtrées...", "openclawJobId": "ocw_exemple" } 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

Séparez PAT timeline (si écriture) et PAT lecture builds pour le Mac.

Checklist d’acceptation

  • openclaw doctor sans avertissement bloquant.
  • Sonde curl vers /health OK depuis la même identité que le daemon.
  • Historique des service hooks montrant un 200 avec authentification attendue.
  • Pré-tirage rejouable depuis zéro avec clone jetable.
  • Callback réussi deux fois en test ; aucun secret dans les logs.

FAQ Azure DevOps + OpenClaw

Le hook affiche succès mais le Mac ne logue rien

Un équipement frontal peut renvoyer 200 sans atteindre OpenClaw. Vérifiez l’URL exacte, le routage TLS, puis rejouez avec curl depuis un agent hébergé Azure en conservant les mêmes en-têtes.

401 malgré un mot de passe Basic « identique »

Espaces finaux, retours chariot ou proxy qui retire l’en-tête Authorization sont fréquents. Comparez après normalisation Unicode et utilisez une comparaison résistante au timing.

Le commit n’apparaît pas dans le JSON initial

Utilisez resource.sourceVersion lorsqu’il est présent ; sinon suivez resource.url avec le PAT lecture builds pour récupérer la révision complète.

Les POST vers Azure échouent après un pré-tirage vert

Jeton expiré ou portée insuffisante. Recréez un PAT minimal, documentez les scopes, et ne réutilisez pas le secret du webhook comme jeton REST.

Synthèse

En combinant service hooks Build completed, vérification de secret avant JSON, PAT moindre privilège et callbacks bornés, vous obtenez un scénario Azure DevOps clairement distinct des intégrations « webhook générique » déjà décrites pour d’autres CI. Pour poursuivre sans compte : accueil, achat, tarifs, aide, blog technique.

Azure DevOps · OpenClaw · Mac distant

Mac cloud pour passerelle OpenClaw et hooks Azure

Pages ouvertes sans login : accueil, centre d’aide, achat, tarifs, blog technique (série OpenClaw 2026).

Acheter un Mac distant Tarifs Centre d’aide
Apple Silicon
Sortie réseau prévisible
Support 24/7

Mac distant pour OpenClaw et Azure DevOps

Écoute TLS stable, launchd et hooks Microsoft. Sans compte : accueil, achat, aide, blog.