Pourquoi ce branchement échoue encore en 2026
- Payload partiel :
resource.urlexige souvent un GET PAT ; ne parsez pas avant d’avoir le commit. - TLS seul insuffisant : imposez Basic ou en-tête secret avant
JSON.parse. - Veille : préférez un Mac loué avec
launchdet chemins absolusnode.
Matrice rapide : signal Azure DevOps côté Mac
| Signal | Côté Azure DevOps | Côté Mac OpenClaw |
|---|---|---|
| Secret | Service hook Web avec HTTP Basic (mot de passe fort) | Décoder Authorization, comparer en temps constant, puis lire le JSON |
| PAT | Portée minimale Build (Read) + Code (Read) pour clone et métadonnées | Fichier 0600, variable ADO_PREFETCH_PAT, rotation sur mail d’expiration |
| Réseau | Documentation des plages sortantes | Liste blanche au proxy ; journaliser seulement les hôtes, jamais le PAT |
| Port passerelle | N/A | Lire 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).
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.
- 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.jsondepuis 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.
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.
Séparez PAT timeline (si écriture) et PAT lecture builds pour le Mac.
Checklist d’acceptation
openclaw doctorsans avertissement bloquant.- Sonde
curlvers/healthOK depuis la même identité que le daemon. - Historique des service hooks montrant un
200avec 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.
Mac cloud pour passerelle OpenClaw et hooks Azure
Pages ouvertes sans login : accueil, centre d’aide, achat, tarifs, blog technique (série OpenClaw 2026).