DevOps / CI·CD 20 mai 2026

2026-05-20 Chemins des profils de provisioning Xcode 16 et archives concurrentes multi-voies sur un Mac cloud Apple Silicon loué sans tête (HK / JP / KR / SG / US)

MacXCode Engineering Team 20 mai 2026 ~18 min de lecture

Les équipes qui louent des builders Mac mini M4 à Hong Kong, Tokyo, Séoul, Singapour ou aux États-Unis et exécutent Xcode 16 sans interface subissent un changement discret : les profils de provisioning ne « vivent » plus uniquement sous l’arborescence héritée MobileDevice. Xcode 16 lit et écrit le dépôt canonique dans UserData, tandis que d’anciens scripts, helpers Fastlane et CLI tiers copient encore les fichiers .mobileprovision vers le chemin d’avant Xcode. Lorsque vous ajoutez des voies concurrentes de xcodebuild archive sur un hôte loué unique, cette dérive de chemins devient des courses de signature, des erreurs fantômes « profil introuvable » et des échecs intermittents errSecInternalComponent qui ne se reproduisent jamais sur le portable d’un développeur. Ce runbook 2026-05-20 fixe la politique dès l’abord : miroiter les profils vers UserData et l’emplacement hérité tant que chaque outil de la machine est conscient d’Xcode 16, isoler des trousseaux CI par voie et des racines DerivedData, et plafonner à deux voies d’Archive concurrentes sur un Mac mini M4 standard sauf marge NVMe et mémoire unifiée mesurée. Vous obtiendrez un tableau comparatif des chemins, une matrice multi-voies, un triage de signature sans tête, un déploiement en huit étapes et des réponses FAQ alignées avec notre base CI trousseau + provisioning, le guide signature automatique vs manuelle et l’article sur la discipline des jobs xcodebuild parallèles.

Qui rencontre la dérive des chemins de provisioning sur un Mac loué sans tête

L’échec s’annonce rarement comme « mauvais répertoire ». La voie B réussit l’Archive tandis que la voie A affiche No profile for team 'XXXXXXXXXX' matching alors que les deux jobs ont importé le même UUID. Sur un hôte loué le rayon d’explosion est plus grand : les images dorées embarquent des scripts d’aide de 2024, les plugins Jenkins appellent encore ~/Library/MobileDevice/Provisioning Profiles, et la voie Fastlane d’un nouvel arrivant télécharge vers UserData tandis qu’un cron nocturne ne rafraîchit que le dossier hérité. Une CI multi-branches partageant un compte utilisateur macOS amplifie la dérive car chaque voie lit le même répertoire personnel sauf partitionnement volontaire des chemins.

  • Ingénieurs release qui lancent deux Archives ou plus en parallèle pour des bundle ID différents sur un seul Mac mini M4 ont besoin d’une résolution de profil déterministe par voie.
  • Équipes plateforme qui maintiennent des images dorées doivent documenter quel chemin Xcode 16, xcodebuild et les outils auxiliaires lisent pendant archive et exportArchive.
  • Revue sécurité : preuve que la voie A ne peut pas lire le certificat de distribution de la voie B — des trousseaux par voie sont obligatoires lorsque les profils sont permutés à chaud.

Partez de la promesse page d’accueil MacXCode : Apple Silicon proche des API Apple, puis cartographiez quels artefacts de signature doivent cohabiter avec le checkout sur l’hôte loué. Si vous ne copiez les profils que vers MobileDevice, traitez cela comme une dette technique qui bloque un débit multi-voies fiable — notre guide d’Archive à distance précède le basculement UserData et doit être lu avec cette mise à jour.

MobileDevice hérité vs chemins UserData des profils Xcode 16

Xcode 16 traite ~/Library/Developer/Xcode/UserData/Provisioning Profiles comme le magasin disque principal lorsque vous téléchargez depuis le volet Comptes d’Xcode ou lorsque xcodebuild -allowProvisioningUpdates rafraîchit les habilitations. L’emplacement hérité ~/Library/MobileDevice/Provisioning Profiles reste pertinent car de nombreuses recettes CI, d’anciennes actions Fastlane et des installeurs shell internes ne le ciblent qu’exclusivement. Tant que chaque point d’entrée n’est pas audité, la valeur sûre opérationnelle est des copies octet à octet dans les deux arbres après chaque rotation de profil, en utilisant le nom de fichier UUID qu’Apple intègre dans le plist (security cms -D -i fichier.mobileprovision → clé UUID).

Chemin Consommateur typique Comportement Xcode 16 Note CI sur hôtes loués
~/Library/Developer/Xcode/UserData/Provisioning Profiles IDE Xcode, xcodebuild moderne Lecture/écriture canonique pour téléchargements GUI Épingler xcode-select avant copie ; vérifier via export Comptes
~/Library/MobileDevice/Provisioning Profiles Scripts hérités, certaines versions Fastlane Toujours honoré par de nombreux flux CLI Miroiter ici jusqu’à retrait des scripts
Zone de transit par voie (ex. /var/ci/lane-a/profiles) Installeurs personnalisés avant copie Non lu directement ; réduit les courses sur le home Copier vers les deux chemins canoniques par job de voie
API ASC + -allowProvisioningUpdates Pipelines de signature automatique Peut ne remplir que UserData Sceller les clés API ; voir Fastlane vs ASC natif
Garde-fou chiffré : conservez 7 à 14 jours de validité de profil qui se chevauchent lors de la rotation des profils de distribution ; une voie démarrée en milieu de rotation ne doit jamais supprimer l’UUID précédent tant que toutes les Archives en cours ne sont pas terminées. Journalisez les trois dates de modification les plus récentes des profils à côté de security find-identity -v -p codesigning comme dans la base trousseau.

Matrice d’archives concurrentes multi-voies sur un Mac mini M4

Les Archives concurrentes ne sont pas une « parallélisation gratuite » sur un Mac mini M4 loué : mémoire unifiée, profondeur de file NVMe et état de session de signature restent en partie sérialisés sous charge. La matrice ci-dessous suppose une voie avec -derivedDataPath dédié, un trousseau CI dédié et des profils miroités — schémas issus de notre guide des jobs parallèles et de l’article schémas + xcconfig multi-branches.

Nombre de voies Marge NVMe typique Mémoire unifiée Verdict opérateur
1 Archive série 120 Go+ libres sur le volume système 16 Go minimum ; 24 Go confortable Défaut pour trains release partagés ; journaux les plus simples
2 Archives concurrentes 120–180 Go libres par voie sous /var/ci 24 Go+ recommandé Plafond pratique sur M4 standard ; isoler DerivedData + trousseaux
3+ Archives concurrentes Classe NVMe 2 To ; nettoyage agressif 32 Go+ ou attendez-vous à des blocages de compression Uniquement après métriques mesurées ; planifiez la hygiène disque
Archive + shard de tests lourd Racines séparées ; ne jamais partager ModuleCache Laisser 4 Go de marge pour XCTest Préférer Archive en série après les tests ou des hôtes distincts

Exemple d’invocation d’archive par voie (signature manuelle avec spécificateur explicite) :

KEYCHAIN_PATH=/var/ci/lane-a/ci.keychain-db DERIVED=/var/ci/lane-a/dd xcodebuild -workspace App.xcworkspace -scheme Release -configuration Release -archivePath /var/ci/lane-a/out/App.xcarchive -derivedDataPath "$DERIVED" CODE_SIGN_STYLE=Manual PROVISIONING_PROFILE_SPECIFIER='MyApp AppStore' archive

Triage de signature sans tête quand les profils semblent « installés »

Les sessions SSH semblent interactives ; launchd et les exécuteurs CI ne le sont pas. Les échecs sans tête les plus fréquents après une montée vers Xcode 16 sont : profils copiés uniquement vers MobileDevice, identités de distribution importées dans le trousseau de session alors que xcodebuild pointe vers un trousseau CI vide, et la voie B qui déverrouille un trousseau dont la voie A a encore besoin en exclusivité. Traitez chaque Archive comme une empreinte en trois parties : security list-keychains, security find-identity -v -p codesigning, et un ls -lt des deux répertoires de profils limité aux trois UUID les plus récents.

Lorsque codesign affiche errSecInternalComponent, déverrouillez le trousseau CI de façon non interactive avant l’archive, définissez les listes de partition pour l’accès codesign, et vérifiez que les habilitations du profil correspondent aux capacités de la cible — notamment Push, App Groups et Associated Domains après des modifications sur le portail. La signature automatique avec l’API ASC peut masquer la dérive de chemins jusqu’à l’export ; les voies manuelles l’exposent immédiatement. Lisez automatique vs manuelle avant de mélanger les styles sur un même hôte.

Ne jamais exécuter deux voies contre le même trousseau de session sur une location partagée. Créez ci-lane-a.keychain-db et ci-lane-b.keychain-db sous /var/ci, importez les .p12 de distribution avec security import -k "$KEYCHAIN_PATH" -P "$P12_PASS" -T /usr/bin/codesign, et limitez security list-keychains -s à la durée du job.
Symptôme Cause probable Commande ou correctif suivant
Profil absent du rapport Xcode UserData vide ; installation héritée seule Miroiter le fichier UUID vers UserData ; relancer l’archive
errSecInternalComponent Trousseau verrouillé ou liste de partition incorrecte security unlock-keychain -p "$PASS" "$KEYCHAIN_PATH" ; set-key-partition-list
La voie A réussit, la voie B échoue sur le même commit DerivedData partagé ou course sur les profils Séparer -derivedDataPath ; sérialiser la copie des profils
Export OK, rejet à l’upload Mauvais type de profil ou habilitations expirées Valider avec la checklist export + upload ASC

Après l’Archive, téléversez les dSYMs avant de supprimer les dossiers de voie — notre guide de symbolisation dSYM suppose que les archives restent adressables par voie sous /var/ci/…/out.

Déploiement en huit étapes : chemins Xcode 16 + archives multi-voies

  1. Épingler xcode-select -p sur Xcode 16.app ; consigner xcodebuild -version dans le manifeste de l’image dorée.
  2. Auditer chaque script qui copie des .mobileprovision ; mettre à jour les installeurs pour écrire dans les deux chemins UserData et MobileDevice avec des noms UUID.
  3. Créer des trousseaux CI par voie et importer les certificats de distribution ; interdire à une voie d’accéder aux fichiers trousseau d’une autre.
  4. Exporter KEYCHAIN_PATH, PROVISIONING_PROFILE_SPECIFIER (ou UUID de profil) et DERIVED_DATA_ROOT par voie dans les blocs d’environnement CI.
  5. Lancer un sec xcodebuild -showBuildSettings par voie ; confirmer que CODE_SIGN_STYLE respecte la politique du guide des modes de signature.
  6. Activer -allowProvisioningUpdates uniquement lorsque les identifiants API ASC sont scellés et surveillés — voir ASC natif vs Fastlane.
  7. Commencer avec une voie d’Archive tant que le miroir des profils n’est pas stable ; ajouter la voie deux avec des racines NVMe et des journaux séparés.
  8. Planifier une purge disque hebdomadaire et faire pivoter les profils avec recouvrement ; garder des copies chaudes dans les répertoires de transit par voie.

Modèle d’installation de profil non interactive (remplacez les chemins par votre répertoire de transit de voie) :

UUID=$(security cms -D -i "$PROFILE" | plutil -extract UUID raw -) && cp "$PROFILE" "$HOME/Library/Developer/Xcode/UserData/Provisioning Profiles/$UUID.mobileprovision" && cp "$PROFILE" "$HOME/Library/MobileDevice/Provisioning Profiles/$UUID.mobileprovision"

FAQ

Où Xcode 16 stocke-t-il les profils de provisioning ? L’emplacement principal est ~/Library/Developer/Xcode/UserData/Provisioning Profiles. Les outils hérités peuvent encore lire ~/Library/MobileDevice/Provisioning Profiles — miroitez les deux sur les hôtes CI jusqu’à la mise à jour de tous les installeurs.

Combien de voies d’archive concurrentes sur un Mac mini M4 ? Deux voies avec 120 à 180 Go de marge NVMe chacune est une valeur par défaut réaliste ; une troisième voie exige 2 To de stockage, un nettoyage agressif et un budget mémoire prudent selon la matrice ci-dessus.

Pourquoi codesign échoue avec errSecInternalComponent sur SSH ? Généralement trousseau verrouillé, liste de partition manquante pour le trousseau CI, ou profils installés uniquement sous le chemin hérité alors qu’Xcode 16 résout UserData en premier.

Les voies doivent-elles partager DerivedData pour accélérer les builds ? Non pour les Archives release — ModuleCache et les magasins d’index font la course sous Archives parallèles. Utilisez un -derivedDataPath par voie et des caches de dépendances partagés lecture seule seulement après qu’un seul writer ait résolu les paquets.

Pour la navigation, marquez l’index du blog et le centre d’aide afin que l’astreinte retrouve ce runbook sans fouiller l’historique de chat.

Pourquoi les locations Mac mini M4 conviennent aux Archives Xcode 16 multi-voies

Apple Silicon M4 offre assez de bande passante mémoire unifiée pour compiler deux graphes iOS moyens en parallèle lorsque vous isolez DerivedData et plafonnez honnêtement les voies. La signature native macOS évite les bizarreries de trousseau hyperviseur qui affectent les environnements Mac émulés, ce qui compte lorsque trois branches nocturnes exigent chacune un rafraîchissement de profil de distribution. La location supprime le CapEx des semaines de release en rafale : montez un builder à Tokyo pour la proximité App Store Connect, Singapour pour la sortie ASEAN, ou aux États-Unis pour les points de terminaison API US-Ouest, puis réduisez quand le train est livré. Comparez les régions sur la page tarifs, répétez le SSH dans le centre d’aide, et associez cet article aux flux d’Archive à distance lors de l’onboarding d’un nouveau dépôt sur une location sans tête.

Louez l’Apple Silicon où la signature Xcode 16 reste prévisible

HK / JP / KR / SG / US · SSH sans tête · prêt pour Archive multi-voies