2026-05-08 xcbeautify et journaux xcodebuild structurés pour portes CI sur Mac cloud Apple Silicon loué (HK / JP / KR / SG / US)
Le CI meurt rarement parce que le compilateur a « oublié » de compiler : il meurt parce que personne ne lit le journal. Sur un Mac mini M4 loué à Hong Kong, Tokyo, Séoul, Singapour ou aux États-Unis, la sortie xcodebuild dépasse facilement dizaines de mégaoctets par lane ; stockée brute, elle force des greps à travers bannières Xcode interminables pendant que la file brûle. xcbeautify transforme ce flux en lignes uniques compatibles grep sans masquer les échecs ; avec tee vous conservez transcript brut (rétention juridique) et flux normalisé (automation). Ce guide 2026-05-08 enchaîne épinglage installation, tuyauterie, alignement bundle résultat et taxonomie d’échecs pour des portes déterministes aux côtés des lanes xcodebuild parallèles, de l’isolation DerivedData, du runner auto-hébergé, des portes couverture et de l’hygiène disque.
Pourquoi des logs lisibles bloquent encore les releases en 2026
La chaîne Apple imprime des diagnostics aux retours imprévisibles ; les vendors CI compensent par HTML, mais une machine SSH-only exige encore preuve textuelle pour auditeurs et artefacts diff-friendly. xcbeautify ne remplace pas la vérité .xcresult — il offre regex et humains une chance avant xcresulttool. Considérez jolis logs comme couche 1 ; la couche 2 demeure les bundles structurés du junit exporter.
Bruit vs signal sur builders distants
Trois pathologies MacXCode :
- Ordre stderr perdu quand wrappers fusionnent mal les flux.
- Unicode fragile sur diagnostics clang localisés — UTF-8 de bout en bout.
- Fan-out parallèle où l’avertissement lane B efface l’erreur fatale lane A dans agrégats.
Corrigez corrélation avant cosmétique : préfixez chaque commande avec RUNNER_TRACKING_ID ou coordonnées matrice build pour que Slack retrouve la lane source.
Chemins d’installation : Mint, Homebrew, épingles semver
Privilégiez installs reproductibles selon standards org :
- Mint —
Mintfileversionné près du YAML CI. - Homebrew — ok si
brew list --versionsfigé après golden build. - curl | bash — évitez sur hôtes signature partagés ; reproductibilité > vélocité.
Documentez chemin binaire dans runbook pour que jobs launchd et shells interactifs résolvent le même binaire — la roulette PATH fait « Tokyo ok, Singapour KO ».
Schémas pipe & tee survivant prod
Ne pipez pas uniquement vers xcbeautify sans conserver brut. Squelette résilient :
set -o pipefail
xcodebuild … 2>&1 | tee "${RAW_LOG}" | xcbeautify > "${PRETTY_LOG}"
pipefail propage l’échec xcodebuild même si xcbeautify sort 0. Ajoutez RESULT_BUNDLE_PATH explicite pour que junit lise .xcresult indépendamment du maquillage stdout. Vers vendors logs : brut en amont ; vers résumés GitHub Actions : joli.
ssh -t) en CI — buffering et ordre des lignes diffèrent du mode batch.
Portes grep : coupler regex et vérité xcresult
Échecs automation à attraper tôt :
| Famille motif | grep exemple | Suivi |
|---|---|---|
| Clang fatal | grep -E "error: fatal error:" |
Résumé issues xcresulttool |
| Signature | grep -Ei "codesign|Provisioning profile" |
Croiser docs déverrouillage trousseau vs isolation lane |
| Simulateur | grep -E "SimRuntime|CoreSimulator" |
Politiques rétention simulateur |
Les logs jolis stabilisent greps grâce à préfixes prévisibles — validez quand même .xcresult pour UI tests capricieux où stderr ment.
Lanes parallèles : corréler sortie xcbeautify
Plusieurs xcodebuild sur un hôte : préfixez chaque ligne :
… | sed "s/^/[lane-${MATRIX}] /" | xcbeautify
Sans préfixes, artefacts fusionnés accusent la mauvaise équipe — surtout sous pression mémoire unifiée. Suivez réglage jobs parallèles.
Rétention, NVMe, budgets artefacts
Les logs explosent si chaque PR garde brut + joli :
- Répertoires par job sous TMPDIR isolé selon guide DerivedData.
- Rétention à paliers — brut 14–30 j stockage objet ; jolis résumés 7 j NVMe.
- Compression — tarballs
zstdavant upload inter-région.
Si espace libre plonge, supprimez vieux jolis avant bundles .xcresult liés tickets conformité.
Checklist déploiement neuf étapes
- Épinglez xcbeautify + checksum ou version paquet.
- Ajoutez pipefail + tee aux wrappers CI.
- Exposez chemin xcresult en JSON métadonnées.
- Ajoutez portes grep + routage Slack par sévérité.
- Validez décodage UTF-8 pour viewers Win/Linux.
- Soak parallèle avec préfixes lanes.
- Comparez gzip brut vs pretty pour budget.
- Formez astreinte lecture xcbeautify vs brut.
- Promouvez PR infra avec tarball rollback.
SLO santé journaux builders loués
| Signal | Seuil | Action |
|---|---|---|
| Artefact log brut manquant | Tout build en échec | Bloquez déploiement ; corrigez tee |
| Faux négatifs grep | > 2 par sprint | Ajuster motifs + assertion xcresult |
| Pente occupation disque | > 18 % hebdomadaire | Affiner rétention + SKU bail |
FAQ
| Question | Réponse pratique (2026-05-08) |
|---|---|
| Build xcbeautify spécifique Darwin ? | Bouteilles aarch64 épinglées par OS ; évitez mélanger Rosetta entre lanes. |
| Peut-on sauter logs bruts ? | Non — auditeurs et escalades Apple DTS attendent transcripts intacts. |
Pourquoi Mac mini M4 bare metal aide CI log-intensive
Écritures séquentielles rivalisent métadonnées APFS ; tests parallèles font pic IOPS. Le NVMe Mac mini M4 loué MacXCode garde latence de queue prévisible pour que tee+xcbeautify n’amplifie pas les rouges flakys. Capacité : tarifs régionaux ; charset interactif : guides SSH/VNC.
Ajoutez builders avant que les logs mangent le NVMe
HK / JP / KR / SG / US · SSH · VNC optionnel