2026 CI Mac cloud SPM : pacte sur Package.resolved — quand forcer -disableAutomaticPackageResolution (FAQ)

Les regressions fantasmatiques pendant les archives reposent bien souvent sur des resolve automatiques encore actifs alors que Package.resolved n est pas gouverne. Ce guide VPSMAC liste quatre familles de problemes et relie les tables de parametres aux articles sortie firewall, disks des files d attente et nœuds froids ou chauds pour que les reviewers budget comprennent les KPI avant d acheter encore des cœurs inutiles pendant que le veritable goulot demeure reseau ou cache SPM.

Schema Mac cloud CI reliant resolve SwiftPM et verification du fichier Package.resolved

Contenu

1. Risques quand la gouvernance des lockfiles arrive trop tard

Les équipes qui durcissent déjà leurs pipelines Linux autour de fichiers de verrouillage et d’artefacts reproductibles savent qu’un graphe déterministe réduit les mystères. Sur macOS la faille est ailleurs : Swift Package Manager peut encore écrire une nouvelle résolution tant que les indicateurs le permettent, et les incidents se lisent comme des « fantômes du linker ».

Chaque voie CI qui lance xcodebuild sans interdire explicitement la résolution automatique se comporte, sur un Mac M4 mutualisé, comme un gestionnaire de paquets silencieux poussant des transitive mineures sans pull-request.

  1. Lockfiles traités comme artefacts locaux : sans Package.resolved passé en revue, les séries de patches n’ont aucun graphe figé ; deux runners partagent la même révision Xcode mais des modules différents.
  2. Archives nocturnes parallèles aux PR protégées : faute de -disableAutomaticPackageResolution, le trajet de nuit peut rafraîchir des hashes SPM sans que les tableaux budgétaires expliquent l’écart.
  3. Racine SPM ou DerivedData unique : les artefacts se mélangent ; une autre voie lit un demi-module et le journal ne dit que « linker command failed ». Commencez par files d’attente, DerivedData et budget disque et figez des chemins par slot comme des contrats.
  4. Latence de résolution passée pour régression Clang : quand l’inspection TLS casse un miroir CDN mais que git clone reste vert, alignez-vous sur un guide pare-feu / proxy et drill NO_PROXY plutôt que d’acheter des grappes sans preuve.

Des agrégats d’erreurs bien étiquetés apaisent les astreintes : mots-clés de produit manquant, somme de contrôle ou téléchargement relèvent du résolveur ; des linkers instables après résolution réussie pointent vers l’IO concurrente.

2. Matrice espace de travail / xcodebuild / file d’attente

Le verrou peut vivre à côté du projet ou sous .xcworkspace/xcshareddata/swiftpm/. Les garde-fous statiques doivent suivre le chemin réellement lu ; sinon ils bloquent simplement le mauvais dossier.

Le tableau répond en une lecture : faut-il committer le lock, interdire la résolution automatique, et séparer un job de resolve avant les slots de compilation coûteux.

Scénario Commit Package.resolved -disableAutomaticPackageResolution Job dédié au resolve
Dépôt unique, archive standard Oui, avec checklist PR et branche protégée Oui sur lanes archive et tests Recommandé pour isoler les journaux
Schémas concurrents sur un hôte Obligatoire par branche, aucun partage implicite Oui + répertoires -derivedDataPath isolés Oui : pics IO du resolve et de la compilation se frappent sinon
CLI SwiftPM seule Oui + swift package resolve --force-resolved-versions Le drapeau xcodebuild est absent ; discipline CLI Optionnel ; SSH chaud pour Git privé
Branches d’expérimentation montant les mineurs Diff de lock avant merge express Assouplir temporairement sur caches isolés Séparer utilisateurs Unix et racines disque

Lorsque la matrice reflète la politique de release, l’audit prouve quelle voie a le droit de déplacer des arêtes transitives : indispensable lorsque la finance observe une chute soudaine de flakiness sans nouvelle capex hardware.

3. Parallélisme limité aux charges de résolution uniquement

Apple Silicon télécharge vite des métadonnées si l’égress permet. Mais la même NVMem occupée simultanément par des archives transforme tout plafond de fetch en ruée imprévue.

Placez ces réglages dans des jobs résolveur-only ; rabattez proactivement lorsque le disque libre passe sous environ quinze pour cent ou lorsque vos files d’attente ont déjà un rubis allumé.

Variable / drapeau Fenêtre de départ (8 – 12 slots) Resserrez ou désactivez
SWIFT_PACKAGE_MANAGER_PARALLEL_FETCH_LIMIT 8 à 12 suivant CPU et peering réseau Si capacité < 15 % ou alertes de file
XCODE_PACKAGE_RESOLVE_PARALLELISM=YES Sondes resolve dédiées Quand les archives saturent la même SSD
-scmProvider system Utile avec git système et agent SSH Sans automatisation known_hosts : flakiness d’auth
-disableAutomaticPackageResolution Lanes compile / archive / analyse post-merge du lock Seulement pour jobs bac à sable qui régénèrent volontairement

Coupez ces boutons avec des métriques lisibles : capacité disponible, part du résolveur, retries par lane racontent la même histoire qu’un guide affinity chaud contre froid où les résolves partent vers des quartiers plus silencieux.

4. Cinq pas et squelette shell

Ancrez la politique SCM ; la séquence technique suit : le resolve échoue vite sans brûler de slots compile, puis vient validation nocturne du réseau et enfin trois répétitions identiques pour confirmer la stabilité des quantiles.

  1. Règle PR : toute évolution manifeste exige différence de lock et commentaire ; bots et humains co-signent.
  2. Sonde resolve : xcodebuild -resolvePackageDependencies même schémas et destinations que l’archive, journaux bruts comme artefacts.
  3. Chemins et flags : DERIVED_DATA_PATH par slot, -disableAutomaticPackageResolution avant archive longue ; -scmProvider system pour registres fermés si besoin.
  4. Drill Egress nocturne : passez vos manifestes lourds une fois pour détecter TLS avant la semaine release.
  5. Triple build : même commit, comparez percentiles resolve, histogrammes linker et événements checksum ; spikes link sans anomalie resolve pointent disque puis file.
#!/bin/zsh
set -euo pipefail
export DERIVED_DATA_PATH="/Volumes/ci/slot${JOB_SLOT:-0}/DerivedData"
mkdir -p "$DERIVED_DATA_PATH"
xcodebuild -resolvePackageDependencies -scheme App -derivedDataPath "$DERIVED_DATA_PATH" -destination 'generic/platform=iOS'
xcodebuild -scheme App -configuration Release -derivedDataPath "$DERIVED_DATA_PATH" \
  -disableAutomaticPackageResolution -scmProvider system \
  -destination 'generic/platform=iOS' archive

Faites exécuter ces wrappers par les mêmes utilisateurs UNIX que les signatures afin que des shells interactifs pollueurs ne glissent pas d’environnement fantôme.

5. Trois KPI acceptables finance et plateforme

Les parties prenantes financent mieux lorsque les métriques nomment les seaux racine plutôt que d’acheter des cœurs par réflexe. Part du résolveur, locks fantômes et libellés de logs remplissent ce rôle sur plusieurs trains.

Ces chiffres relient directement rétros incidents et travaux d’infrastructure au lieu d’incriminer la prochaine version Xcode.

Quand les téléchargements restent stables mais le linker tremble, un embouteillage NVMe coexiste souvent avec des archives agressives. Croisez toujours les exercices DerivedData avec le runbook affinité chaud-froid pour décaler résolveurs et archives dans le temps.

Les entreprises qui miroitent git mais oublient les hôtes SPM imposent des téléchargements partiels répétés. Harmonisez HTTP(S)_PROXY avant de forcer des mises à jour de graphe.

Combiner cette checklist avec les guides pare-feu et files d’attente donne des revues plateforme alimentées par KPI solides plutôt que par hypothèses Xcode floues.

7. FAQ opérationnelle

Package.resolved disparaît ? Traitez l’absence comme échec pipeline et exigez des scripts documentés plutôt que des boucles d’archive.

Un seul utilisateur pour plusieurs dépôts ? Risque élevé : caches SPM et identités se croisent.

Miroir Linux en amont ? Peut cacher des métadonnées mais ne remplace pas la vérité Xcode pour produits App Store ; la signature reste sur macOS.

8. Synthèse et pont VPSMAC

La seule élasticité sans gouvernance de lock amplifie la dérive car chaque runner peut tirer des versions différentes en silence. Les racines de cache partagées sans contrat disque répètent les courses NFS coûteuses des années 2010.

Les runners hébergés aux politiques d’éviction opaques compliquent aussi la validation de listes blanches pare-feu. Nos observations sur fermes Apple Silicon montrent que séparer charge resolve et compilation et versionner rigoureusement les locks réduit de trente à quarante pour cent les timeouts linker « inexplicables » sans extension immédiate de cluster.

Des emplacements Mac cloud VPSMAC à faible parallélisme et chemins déterministes aident à matérialiser ce runbook lorsque vous traitez résolveur, lock et disque comme un seul programme et placez -disableAutomaticPackageResolution comme disjoncteur sur chaque lane proche production.