Les équipes iOS à cycle court louent des runners Mac cloud à la journée pour absorber les pics TestFlight sans acheter de machines. La signature est l’endroit où ce modèle heurte la réalité : disques éphémères, jobs parallèles et coffre de secrets qui doit rester hors du dépôt applicatif. Fastlane Match reste le défaut pragmatique : certificats et profils de provisioning sont stockés sous forme de blobs chiffrés dans Git, puis injectés dans le trousseau sur chaque runner. Les modes de défaillance sont prévisibles — profils obsolètes, dérive de passphrase, deux jobs qui mutent la même branche — mais les correctifs relèvent d’une ingénierie routinière dès que l’on sépare lecture et écriture et que l’on borne la concurrence.
Match et dépôt Git chiffré : ce qui atterrit réellement sur le runner
Match attend un dépôt dédié (souvent privé) contenant des fichiers .p12 et des profils mobileprovision chiffrés, plus des métadonnées. La passphrase n’est pas dans Git : injectez-la depuis votre gestionnaire de secrets CI en variable d’environnement. Sur un Mac cloud à la journée, traitez le répertoire de checkout comme jetable : clone propre, exécution de match en lecture seule pour les lanes d’archive, et readonly: false uniquement sur un job d’administration protégé qui renouvelle les certificats. Cette règle unique supprime la plupart des incidents du type « la CI a retourné mon dépôt ».
Branches et contrôle d’accès
Utilisez une branche par défaut par environnement (par exemple master ou main pour la prod) et restreignez les droits de fusion. Les jetons CI en lecture doivent être limités au dépôt Match avec droit contents en lecture seule. Les administrateurs humains disposent d’un chemin d’identifiants distinct pour la régénération. Si vous mélangez profils ad hoc et App Store dans un même dépôt, isolez clairement les répertoires pour que les types Match ne s’écrasent pas pendant des exécutions parallèles.
Clones HTTPS en lecture seule sur runners Mac cloud
HTTPS avec un jeton d’accès personnel finement limité ou une clé de déploiement mappée au HTTPS est plus simple à auditer que des clés SSH longues durée copiées sur des machines louées. Définissez GIT_TERMINAL_PROMPT=0 pour qu’un blocage d’authentification échoue vite, et privilégiez les clones peu profonds du dépôt Match pour réduire les minutes facturées sur des sessions courtes. Si votre fournisseur recycle des adresses IP, surveillez les quotas côté Git ; le backoff appartient au wrapper de pipeline, pas à Match lui-même.
export GIT_TERMINAL_PROMPT=0 export MATCH_READONLY=true # lanes archive / test # Optionnel : relever le timeout bas débit pour de gros blobs LFS export GIT_HTTP_LOW_SPEED_LIMIT=1000 export GIT_HTTP_LOW_SPEED_TIME=120
Matrice de décision : conflits de certificats multi-jobs
Deux jobs concurrents qui appellent Match en écriture, ou qui ciblent le même app_identifier avec des réglages type contradictoires, peuvent se battre sur des pushes Git ou des installations dans le trousseau. Utilisez la matrice ci-dessous avant d’augmenter le parallélisme. Pour le dimensionnement des pools et le choix d’un second pipeline macOS plutôt que des jobs Linux, voir 2026 — sprint à court cycle : second pipeline macOS CI ou jobs sur agents Linux ? File d’attente, secrets, matrice et FAQ ; pour la capacité Mac élastique versus nœuds permanents, voir 2026, pics CI à court cycle : runners GitHub Actions macOS auto-hébergés — pool élastique de Mac cloud ou nœuds permanents ?.
| Situation parallèle | Risque | Décision |
|---|---|---|
Tous les jobs utilisent MATCH_READONLY=true, même branche |
Faible : contention en lecture seule | Autoriser le parallélisme entre runners |
| Lecture mixte + un job de régénération | Moyen : courses sur push, clones partiels | Sérialiser les écritures (mutex / label) ; lectures sur les autres runners |
| Deux jobs de régénération, mêmes identifiants | Élevé : double émission de certificat, conflit Git | Verrou dur : job unique ; désactiver l’auto sur les branches |
| Apps différentes, dépôt partagé, même passphrase | Moyen : erreur humaine sur app_identifier |
Séparer les dépôts ou imposer un git_branch par produit au niveau de la lane |
Checklist exécutable et FAQ
Exécutez cette liste sur chaque nouvelle image Mac cloud ou label de runner avant d’activer la signature de production.
- Contrôle préalable — Version majeure d’Xcode alignée avec
DEVELOPMENT_TEAM; certificats intermédiaires Apple présents. - Secrets —
MATCH_PASSWORD, clé API App Store Connect et jeton Git HTTPS limité au seul dépôt Match. - Réseau — Sortie 443 vers Apple et votre Git autorisée ; mode non interactif (
CI=1pour que Fastlane saute les invites lorsque c’est pris en charge). - Concurrence — Le pipeline par défaut fixe
MATCH_READONLY; seul le workflow de renouvellement le désactive. - Post-job — Réinitialisation du trousseau ou script de déconnexion sur les pools partagés ; artefacts publiés, répertoires temporaires supprimés.
Extraits de FAQ
« Codesign souhaite accéder au trousseau » — déverrouillez avec un fichier de trousseau jetable dans $TMPDIR pour la CI, pas le trousseau de session. Profil expiré en plein sprint — une seule lane de renouvellement, mise à jour des profils, commit dans le dépôt Match, puis propagation des jobs en lecture seule. Deux apps, une faute de frappe sur le bundle ID — échec à l’upload, pas à la compilation ; ajoutez une vérification des métadonnées avant archive.
Sur Mac mini cloud, les lanes de signature restent prévisibles
Fastlane et Xcode attendent un vrai trousseau macOS et la chaîne de signature Apple — un duo toujours maladroit sur des agents Linux. Un Mac mini cloud dédié offre une base Sonoma ou Sequoia stable, l’outil Unix natif pour vos scripts et assez de mémoire unifiée pour que les étapes d’archive ne disputent pas la RAM aux pics de compilation Swift.
Les nœuds Apple Silicon consomment très peu au repos en attendant les API Apple, et la pile de signature est la même que celle de vos relecteurs locaux, ce qui réduit les surprises « propres à la CI ». Gatekeeper et SIP restent alignés avec les exigences de distribution, sans la taxe de support d’une chaîne émulée ou entièrement distante.
Si vous voulez des runners à la journée sans acheter de matériel, le Mac mini M4 cloud VPSSpark est un socle pragmatique pour Match en lecture seule et les pipelines d’archive — découvrez les offres maintenant et gardez vos releases à court cycle sur les rails.