Réduire une facture macOS sur GitHub Actions, étape par étape
La plupart des factures macOS sur GitHub Actions sont gonflées par des minutes qui ne servent à rien à l’équipe. Reconstruire des caches. Lancer des matrices que personne ne lit. Terminer des jobs pour des commits déjà remplacés. Voici une checklist de changements, classés selon ce qu’ils font économiser pour peu d’effort, avec le YAML quand il aide.
1. Annulez les runs déjà périmés
Quand quelqu’un pousse deux fois en une minute, le premier run est perdu. Un bloc par workflow l’arrête :
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true2. Sortez de macOS tout ce qui n’est pas un build
Le lint, les vérifications de formatage, les notes de version et les notifications Slack tournent tous sur un runner Linux, pour un dixième du prix. Tout comme les tests unitaires des paquets Swift partagés qui ne touchent pas à UIKit. Découpez le workflow en un job Linux et un job macOS qui en dépend. Un échec du lint ne coûte alors jamais une minute macOS.
3. Mettez en cache les chemins qui coûtent vraiment du temps
Sur les runners hébergés, chaque job démarre à vide. Restaurez les dossiers coûteux avec une clé liée à vos lockfiles :
- uses: actions/cache@v4
with:
path: |
~/Library/Developer/Xcode/DerivedData
~/Library/Caches/org.swift.swiftpm
~/.cocoapods
Pods
key: ${{ runner.os }}-${{ hashFiles('**/Package.resolved', '**/Podfile.lock') }}DerivedData est le plus gros et le plus fragile. Si les builds incrémentaux se comportent bizarrement, retirez-le du cache et gardez les caches de paquets.
4. Ne lancez la matrice complète que sur main
Une pull request a rarement besoin de cinq simulateurs. Compilez une configuration sur les pull requests, et la matrice complète d’appareils lors des merges sur main ou dans un build de nuit.
5. Filtrez par chemin
Une modification du README ne devrait pas déclencher un build iOS. Utilisez paths-ignore dans le déclencheur du workflow pour la documentation, les scripts et tout ce qui est hors de la cible de l’app.
6. Fixez des timeouts
Un simulateur figé peut facturer les six heures du délai par défaut. Réglez timeout-minutes sur chaque job macOS, un peu au-dessus de votre durée de build habituelle.
7. Arrêtez de réinstaller les outils
Installer CocoaPods, fastlane ou une version précise de Xcode à chaque job brûle des minutes avant même le build. Tenez-vous-en à ce que l’image hébergée contient déjà, ou mettez l’installation en cache.
8. Réduisez la rétention des artefacts
Les archives et bundles de test gardés 90 jours ajoutent des frais de stockage qui grimpent peu à peu. Sept jours suffisent pour tout ce qui n’est pas envoyé sur le store.
9. Au-delà du seuil, arrêtez de payer à la minute
Tout ce qui précède rabote la facture. Une fois que vous dépassez durablement environ 2,242 minutes macOS par mois, aucun rabot ne bat un prix fixe. Un M6 dédié à $139 par mois exécute des minutes illimitées avec des caches chauds. Les points 3 et 7 ne comptent alors plus du tout. Le calculateur montre où se situe votre équipe.
Questions fréquentes
Quelle est la plus grosse économie sur une facture macOS GitHub Actions ?
+
Pour la plupart des équipes, c’est d’annuler les runs dépassés avec un groupe de concurrency et de passer sur Linux le travail qui n’est pas du build. Ensemble, ces deux petits changements de YAML retirent souvent un tiers des minutes macOS facturées.
Mettre DerivedData en cache sur GitHub Actions en vaut-il la peine ?
+
Souvent, mais c’est le cache fragile. Les caches de paquets (SwiftPM, CocoaPods) sont sûrs et font gagner des minutes à chaque job. DerivedData fait gagner plus, mais peut causer d’étranges échecs de build incrémental. Choisissez une clé précise et soyez prêt à le retirer.
Dois-je lancer ma matrice d’appareils sur chaque pull request ?
+
En général, non. Une configuration sur les pull requests et la matrice complète sur main ou la nuit détectent les mêmes régressions, pour une fraction des minutes.
Quand rien de tout cela ne compte-t-il ?
+
Au-delà d’environ 2,242 minutes macOS par mois, un Mac dédié à prix fixe de $139 coûte moins cher que la facturation à la minute. C’est vrai même si la configuration à la minute est très bien optimisée. Les caches chauds suppriment à eux seuls l’essentiel du gaspillage.