Guida

Ridurre la spesa macOS di GitHub Actions, passo per passo

Quasi tutte le spese macOS su GitHub Actions sono gonfiate da minuti che non servono al team. Ricostruire cache. Eseguire matrici che nessuno legge. Completare job per commit già sostituiti. Questa è una checklist di modifiche, ordinate per quanto fanno risparmiare con poco lavoro, con lo YAML dove serve.

1. Annulla le esecuzioni già superate

Quando qualcuno fa due push in un minuto, la prima esecuzione è sprecata. Un blocco per workflow la ferma:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

2. Togli da macOS tutto ciò che non è una build

Lint, controlli di formattazione, note di rilascio e notifiche Slack girano tutti su un runner Linux a un decimo del prezzo. Lo stesso vale per gli unit test dei pacchetti Swift condivisi che non toccano UIKit. Dividi il workflow in un job Linux e in un job macOS che dipende da lui. Così un errore di lint non spende mai un minuto macOS.

3. Metti in cache i percorsi che costano davvero tempo

Sui runner ospitati ogni job parte vuoto. Ripristina le cartelle costose con una chiave legata ai tuoi lockfile:

- 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 è la più grande e la più fragile. Se le build incrementali si comportano in modo strano, toglila dalla cache e tieni le cache dei pacchetti.

4. Esegui la matrice completa solo su main

Una pull request raramente ha bisogno di cinque simulatori. Sulle pull request compila una sola configurazione. La matrice completa dei dispositivi va sui merge in main o su una pianificazione notturna.

5. Filtra per percorso

Una modifica al README non dovrebbe avviare una build iOS. Usa paths-ignore nel trigger del workflow per documentazione, script e tutto ciò che è fuori dal target dell’app.

6. Imposta i timeout

Un simulatore bloccato può farti pagare tutte le sei ore del valore predefinito. Imposta timeout-minutes su ogni job macOS a poco più della durata normale della build.

7. Smetti di reinstallare gli strumenti

Installare CocoaPods, fastlane o una certa versione di Xcode a ogni job brucia minuti prima che parta la build. Usa le versioni che l’immagine ospitata ha già, o metti in cache l’installazione.

8. Riduci la conservazione degli artifact

Archivi e bundle di test tenuti per 90 giorni aggiungono costi di archiviazione che crescono piano piano. Sette giorni bastano per tutto ciò che non va sullo store.

9. Oltre il pareggio, smetti di pagare al minuto

Tutto ciò che c’è sopra lima la spesa. Quando superi stabilmente circa 2,242 minuti macOS al mese, nessuna limatura batte un prezzo fisso. Un M6 dedicato a $139 al mese esegue minuti illimitati con cache calde. I punti 3 e 7 smettono del tutto di contare. Il calcolatore mostra dove si trova il tuo team.

Domande frequenti

Qual è il risparmio più grande su una spesa macOS di GitHub Actions?

+

Per quasi tutti i team: annullare le esecuzioni superate con un gruppo di concurrency e spostare su Linux il lavoro che non è build. Insieme spesso tolgono un terzo dei minuti macOS fatturati, con due piccole modifiche allo YAML.

Conviene mettere in cache DerivedData su GitHub Actions?

+

Spesso sì, ma è la cache fragile. Le cache dei pacchetti (SwiftPM, CocoaPods) sono sicure e fanno risparmiare minuti a ogni job. DerivedData fa risparmiare di più, ma può causare strani errori nelle build incrementali. Usa una chiave precisa e sii pronto a toglierla.

Devo eseguire la matrice dei dispositivi su ogni pull request?

+

Di solito no. Una configurazione sulle pull request e la matrice completa su main o di notte trovano le stesse regressioni con una frazione dei minuti.

Quando tutto questo non conta?

+

Sopra circa 2,242 minuti macOS al mese, un Mac dedicato a prezzo fisso di $139 costa meno della fatturazione a consumo. Vale per quanto bene tu ottimizzi il consumo. Le cache calde eliminano da sole gran parte dello spreco.

Guide correlate