Memangkas tagihan macOS GitHub Actions, langkah demi langkah
Kebanyakan tagihan macOS di GitHub Actions membengkak karena menit yang tidak berguna bagi tim. Membangun ulang cache. Menjalankan matrix yang tidak dibaca siapa pun. Menyelesaikan job untuk commit yang sudah diganti. Ini checklist perubahan yang diurutkan dari penghematan terbesar dengan usaha terkecil, lengkap dengan YAML jika membantu.
1. Batalkan run yang sudah usang
Saat seseorang push dua kali dalam satu menit, run pertama terbuang. Satu blok per workflow menghentikannya:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true2. Pindahkan semua yang bukan build keluar dari macOS
Lint, cek format, catatan rilis, dan notifikasi Slack semuanya berjalan di runner Linux dengan sepersepuluh harga. Begitu juga unit test untuk Swift package bersama yang tidak menyentuh UIKit. Pecah workflow menjadi job Linux dan job macOS yang bergantung padanya. Dengan begitu, lint yang gagal tidak pernah menghabiskan satu menit macOS pun.
3. Cache path yang benar-benar memakan waktu
Di runner hosted, setiap job mulai kosong. Pulihkan direktori yang mahal dengan key yang terikat ke lockfile Anda:
- 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 yang paling besar dan paling rapuh. Jika build inkremental berperilaku aneh, keluarkan DerivedData dari cache dan pertahankan cache package.
4. Jalankan matrix lengkap hanya di main
Pull request jarang butuh lima simulator. Build satu konfigurasi di pull request, lalu jalankan matrix perangkat lengkap saat merge ke main atau pada jadwal malam hari.
5. Filter berdasarkan path
Perubahan pada README tidak perlu memicu build iOS. Pakai paths-ignore pada trigger workflow untuk dokumentasi, script, dan apa pun di luar target aplikasi.
6. Pasang timeout
Simulator yang hang bisa ditagih sampai batas default enam jam penuh. Atur timeout-minutes di setiap job macOS sedikit di atas waktu build normal Anda.
7. Berhenti memasang ulang tool
Memasang CocoaPods, fastlane, atau versi Xcode tertentu di setiap job menghabiskan menit sebelum build dimulai. Pakai versi yang sudah ada di image hosted, atau cache hasil instalasinya.
8. Pangkas masa simpan artifact
Arsip dan bundle test yang disimpan 90 hari menambah biaya penyimpanan yang pelan-pelan naik. Tujuh hari sudah cukup untuk apa pun yang tidak dirilis ke store.
9. Di atas titik balik modal, berhenti bayar per menit
Semua langkah di atas memangkas tagihan. Begitu Anda stabil melewati sekitar 2,242 menit macOS sebulan, tidak ada penghematan yang bisa mengalahkan harga tetap. M6 khusus seharga $139 sebulan menjalankan menit tanpa batas dengan cache hangat. Langkah 3 dan 7 jadi tidak relevan sama sekali. Kalkulator menunjukkan posisi tim Anda.
Pertanyaan yang sering diajukan
Apa penghematan terbesar untuk tagihan macOS di GitHub Actions?
+
Bagi kebanyakan tim, membatalkan run yang sudah usang dengan concurrency group dan memindahkan pekerjaan non-build ke Linux. Bersama-sama, dua perubahan YAML kecil itu sering menghapus sepertiga menit macOS yang ditagih.
Apakah cache DerivedData di GitHub Actions sepadan?
+
Sering kali ya, tapi ini yang paling rapuh. Cache package (SwiftPM, CocoaPods) aman dan menghemat menit di setiap job. DerivedData menghemat lebih banyak, tapi bisa memicu kegagalan build inkremental yang aneh. Buat key-nya seketat mungkin dan siap untuk membuangnya.
Haruskah saya menjalankan matrix perangkat di setiap pull request?
+
Biasanya tidak. Satu konfigurasi di pull request dan matrix lengkap di main atau malam hari menangkap regresi yang sama dengan sebagian kecil menitnya.
Kapan semua ini tidak penting lagi?
+
Di atas sekitar 2,242 menit macOS sebulan, Mac khusus berharga tetap $139 lebih murah daripada tagihan per menit. Itu berlaku seoptimal apa pun setup per menit Anda. Cache yang hangat sudah menghapus sebagian besar pemborosan dengan sendirinya.