GitHub ActionsのmacOS費用を段階的に減らす
GitHub ActionsのmacOSの請求額の多くは、チームの役に立たない分数で膨らんでいます。キャッシュの再構築。誰も見ないマトリックスの実行。すでに置き換えられたコミットのジョブの完了。これは、少ない手間で大きく節約できる順に並べた変更のチェックリストです。役立つところにはYAMLも載せています。
1. 古くなった実行をキャンセルする
1分の間に2回プッシュすると、1回目の実行は無駄になります。ワークフローごとに次のブロックを1つ追加すれば止められます。
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true2. ビルド以外の作業はすべてmacOSから外す
Lint、フォーマットのチェック、リリースノート、Slack通知は、どれもLinuxのrunnerで10分の1の料金で動きます。UIKitに触れない共有Swiftパッケージのユニットテストも同じです。ワークフローを、Linuxのジョブと、それに依存するmacOSのジョブに分けてください。そうすればLintの失敗でmacOSの1分を使うことはありません。
3. 本当に時間がかかるパスをキャッシュする
ホスト型runnerでは、どのジョブも空の状態から始まります。ロックファイルに結びついたキーで、高くつくディレクトリを復元します。
- 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ですが、最も壊れやすくもあります。差分ビルドの挙動がおかしいときは、DerivedDataをキャッシュから外し、パッケージのキャッシュだけ残してください。
4. マトリックス全体はmainでだけ実行する
プルリクエストに5つのシミュレータが必要になることはまずありません。プルリクエストでは1つの構成だけをビルドします。デバイスのマトリックス全体は、mainへのマージ時か夜間のスケジュールで実行します。
5. パスで絞り込む
READMEの変更でiOSのビルドを走らせるべきではありません。ワークフローのトリガーにpaths-ignoreを使い、ドキュメント、スクリプト、アプリのターゲット外のものを除外します。
6. タイムアウトを設定する
シミュレータが固まると、初期値の6時間分まるごと課金されることがあります。すべてのmacOSジョブにtimeout-minutesを設定し、通常のビルド時間より少し長い値にしてください。
7. ツールの再インストールをやめる
ジョブのたびにCocoaPods、fastlane、特定のXcodeをインストールすると、ビルドが始まる前に分数を消費します。ホスト型イメージにすでにあるものに合わせるか、インストール結果をキャッシュしてください。
8. 成果物の保持期間を短くする
アーカイブやテストバンドルを90日間保持すると、ストレージ料金がじわじわ増えます。ストアに出さないものなら、7日で十分です。
9. 損益分岐点を超えたら、分単位で払うのをやめる
ここまでの対策はどれも請求額を削るものです。macOSの利用が常に月2,242分前後を超えるなら、どれだけ削っても固定料金にはかないません。月額$139の専用M6なら、分数無制限で、キャッシュもウォームなまま動きます。3と7の対策はまったく不要になります。チームがどこにいるかは計算ツールでわかります。
よくある質問
GitHub ActionsのmacOS費用で、一番大きな節約は何ですか?
+
多くのチームでは、concurrencyグループで古い実行をキャンセルすることと、ビルド以外の作業をLinuxに移すことです。この2つの小さなYAMLの変更で、課金されるmacOSの分数が3分の1ほど減ることがよくあります。
GitHub ActionsでDerivedDataをキャッシュする価値はありますか?
+
多くの場合ありますが、壊れやすいものです。パッケージのキャッシュ(SwiftPM、CocoaPods)は安全で、ジョブのたびに分数を節約します。DerivedDataはもっと節約できますが、差分ビルドで奇妙な失敗を起こすことがあります。キーを厳密に設定し、いつでも外せるようにしておいてください。
デバイスのマトリックスはプルリクエストのたびに実行すべきですか?
+
たいていは不要です。プルリクエストでは1つの構成、mainや夜間にはマトリックス全体。これでわずかな分数で同じ不具合を見つけられます。
こうした対策が意味を持たなくなるのはいつですか?
+
macOSの利用が月2,242分前後を超えると、月額$139の固定料金の専用Macが従量課金より安くなります。従量課金の構成をどれだけ最適化しても、これは変わりません。ウォームなキャッシュが、それだけで無駄のほとんどをなくします。