go mod download échoue par intermittence derrière une sortie saturée ou des miroirs fragiles. Vous obtenez : un chemin reproductible via openclaw onboard et openclaw doctor, des sondes de santé copiables avec plafonds de retry explicites, un script qui fait pivoter GOPROXY avant de marquer le job en échec, et des motifs pour remonter les journaux vers la CI sans ouvrir une session SSH. Pour concevoir la chaîne elle-même, croisez avec notre matrice GOPROXY / GOSUMDB — pages publiques, sans compte obligatoire.
- Échec silencieux du premier saut : le miroir d’entreprise répond lentement ; Go time-out avant que la chaîne séparée par des virgules n’avance, faute de retry au bon niveau.
- Dérive d’environnement : les ingénieurs exportent
GOPROXYdans~/.zshrc, mais l’agent CI et les jobslaunchdn’héritent pas de ce profil : les tirages de modules visent encore le mauvais endpoint. - Échecs aveugles : l’orchestrateur n’affiche qu’un « exit 1 » sans indiquer quel saut a cassé ; chaque incident devient une chasse au trésor SSH sur le runner.
① Pourquoi go mod download casse en CI sur Mac distant
Les récupérations de modules empilent DNS, TCP, TLS, HTTP et comportement de cache. Sur des runners Apple Silicon qui partagent la montée avec l’automatisation bureau, un pic de tirages concurrents peut affamer le premier saut proxy alors que les miroirs de repli sont sains. Les magasins de certificats divergent souvent entre shells de connexion et comptes de service : on voit alors des erreurs TLS ressemblant à un « mauvais chemin de module ».
Lorsqu’OpenClaw ou des compagnons déclenchent des builds, vous voulez un hôte dans un état connu avant d’exécuter Go. C’est pourquoi nous rangeons openclaw doctor dans la même famille de prévol que go env : les deux exposent PATH, permissions et hypothèses réseau héritées par l’étape modules. Pour la patrouille passerelle et launchd, voir le guide LaunchAgent et contrôle de santé ; pour la philosophie retry plus large, récupération sur erreur et retries OpenClaw.
② Checklist installation, configuration et dépannage
Exécutez de haut en bas sur un Mac de préproduction avant de promouvoir le même plist et le même YAML CI vers la production.
- Socle installé. Node 22 ou plus récent, CLI OpenClaw sur le PATH de l’utilisateur service,
npmou install officiel sans invitesudodans la CI. - Onboard puis doctor. Lancer
openclaw onboardune fois par image machine, puisopenclaw doctor; traiter chaque avertissement permissions, binaires manquants ou chemins de config. - Parité toolchain Go. Épingler
go versionentre images ; affichergo env GOPROXY GOPRIVATE GONOPROXY GOSUMDB GOMODCACHEau début du job. - Sonder avant d’exporter. Toucher chaque base GOPROXY avec
curlet timeouts explicites ; noter le code HTTP et le temps mur dans le journal du job. - Envelopper les téléchargements. Exécuter
go mod downloaddans un script capable de changer de chaîne et de plafonner les tentatives — pas une commande nue dans un wrapper opaque. - Démon optionnel. Si le Mac doit s’auto-réparer entre jobs CI, installer un LaunchAgent qui lance la sonde à intervalle régulier avec
ThrottleIntervalpour éviter les boucles serrées. - Hygiène des journaux. Tee la sortie verbose modules vers
$RUNNER_TEMP/gomod.logou équivalent ; filtrer les jetons bearer avant upload. - Seuils d’escalade. Alerter lorsque deux cycles de sonde consécutifs échouent à cinq minutes d’intervalle, ou lorsque
go mod downloadépuise deux rotations complètes de chaîne dans un même job.
③ Modèles de scripts : sonde, backoff et wrapper de téléchargement
La sonde ci-dessous considère que le chemin TCP/TLS fonctionne lorsque la requête aboutit sans timeout ; adaptez le chemin d’exemple à votre fournisseur de miroir. Le backoff suit 2s, 4s, 8s avec trois essais par URL — environ vingt-cinq secondes pire cas par saut, souvent moins cher qu’un job CI rouge entier.
#!/usr/bin/env bash
set -euo pipefail
# goproxy-probe.sh — renvoie la première base URL saine ou exit 1
CANDIDATES=(
"https://corp-go.example.com"
"https://goproxy.cn"
"https://proxy.golang.org"
)
probe_one() {
local url="$1" attempt=1 delay=2
while [[ $attempt -le 3 ]]; do
if curl -fsS --connect-timeout 8 --max-time 20 -o /dev/null \
"$url/github.com/golang/glog/@v/v1.2.0.info" \
|| curl -fsS --connect-timeout 8 --max-time 20 -o /dev/null "$url/"; then
echo "$url"
return 0
fi
sleep "$delay"
delay=$(( delay * 2 ))
attempt=$(( attempt + 1 ))
done
return 1
}
for c in "${CANDIDATES[@]}"; do
if base=$(probe_one "$c"); then
echo "GOPROXY_PRIMARY=$base"
exit 0
fi
done
echo "all GOPROXY candidates failed" >&2
exit 1
Esquisse de wrapper : résoudre GOPROXY_PRIMARY, exporter GOPROXY="$GOPROXY_PRIMARY,https://proxy.golang.org,direct" (ajustez selon la politique), lancer go mod download ; en cas d’échec afficher go env -json filtré par jq si disponible, puis une seconde chaîne ; arrêter après deux rotations complètes.
#!/usr/bin/env bash
set -euo pipefail
LOG="${RUNNER_TEMP:-/tmp}/gomod-$(date +%s).log"
export GOPROXY="$(./goproxy-probe.sh | sed -n 's/^GOPROXY_PRIMARY=//p'),https://proxy.golang.org,direct"
echo "Using GOPROXY=$GOPROXY" | tee -a "$LOG"
if ! go mod download -x 2>&1 | tee -a "$LOG"; then
export GOPROXY="https://proxy.golang.org,direct"
echo "Fallback GOPROXY=$GOPROXY" | tee -a "$LOG"
go mod download -x 2>&1 | tee -a "$LOG"
fi
Exemple GitHub Actions (synthèse) : ajouter un court bloc à $GITHUB_STEP_SUMMARY lorsque la variable existe, afin que le saut défaillant apparaisse à côté du check rouge — lecture sans tableau de bord ni connexion obligatoire.
if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then
{
echo "### go mod fetch"
echo '```'
tail -n 40 "$LOG"
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
fi
④ Édition manuelle des variables d’environnement contre sélection automatique du proxy
| Approche | Forces | Risques | Quand la choisir |
|---|---|---|---|
export GOPROXY=... dans les profils shell |
Rapide pour une session développeur interactive | La CI et les démons n’héritent pas de la variable ; pivot pauvre en incident | Débogage interactif uniquement |
Bloc env statique dans le YAML CI |
Transparent dans l’historique Git | Pas de repli adaptatif quand un saut se dégrade | Sortie réseau stable avec un miroir de confiance unique |
| Script de sonde + wrapper (cet article) | Journalise le saut gagnant ; retries bornés ; fonctionne sans shell de connexion | Maintenance des URL candidates et des chemins de test | Pools Mac distants partagés et runners transfrontaliers |
L’automatisation ne remplace pas la politique : alignez GOPRIVATE et GONOPROXY sur la conformité avant d’élargir les chaînes publiques. L’article matrice lié en tête détaille ces paires.
⑤ FAQ
go mod download échoue encore — que faire ?
Vérifiez la connectivité vers la base de sommes (GOSUMDB), les racines d’inspection TLS d’entreprise (SSL_CERT_FILE), et les chemins de modules privés qui partent par erreur vers le proxy public. Capturez la sortie de go mod download -x.
Fixez ThrottleInterval à au moins 60 secondes et KeepAlive seulement lorsque le binaire est stable ; redirigez stderr vers ~/Library/Logs et ne pagez qu’après échecs consécutifs.
Oui. Trousseaux, fichiers PAC et profils de bac à sable diffèrent par compte ; un décalage reproduit le classique « ça marche en SSH, pas en CI ».
Synthèse
Traitez GOPROXY comme toute dépendance capricieuse : sondez avec des timeouts, retry avec backoff plafonné, exportez la chaîne gagnante dans le même contexte d’exécution que go mod download, et remontez la preuve vers la CI. Posez le tout sur une baseline OpenClaw propre pour que l’automatisation et les builds partagent un profil d’hôte prévisible.
Poursuivez avec l’index du blog pour d’autres guides. Les pages produit et le centre d’aide ci-dessous sont lisibles sans compte.
Mac distant pour OpenClaw et CI Go
Accueil, achat, centre d’aide ou autres articles techniques — pas de mur de connexion sur ces destinations.