そもそも
GitHub Actionsを最適化するためにやったこと。
Jestの実行時間を短縮する
Barrel Fileをやめる
Barrel FileはプロダクションコードのパフォーマンスやJestの実行時間に悪影響を与える。
ts-jestをやめる
transpilerをts-jestから@swc/jestに変更した。
注意点としては、testにspyOn()
が使えなくなることと、テスト実行時に型チェックが走らなくなること。
spyOn()
はjest.mock
などに置き換える。
型チェックが必須の場合は別途tsc --noEmit
などを実行する。Next.jsの場合はbuild実行時に型チェックが走るので不要かも。
lintの実行時間を短縮する
差分があるファイルのみlintを適用する
キャッシュを最適化する
前提
- GitHub Actionsは実行時間が伸びると、料金も増大していく。
- GitHub Actionsのキャッシュの保存容量は10GBで、それを超えると古いキャッシュから自動で削除されていく。
- キャッシュはブランチごとにsaveされており、workflow対象のブランチは自ブランチまたはmainブランチのキャッシュにしかアクセスできない(=restoreできない)。
key
が完全一致している、またはrestore-keys
が部分一致していたらキャッシュがrestoreされる。
- フロントエンドの場合、
yarn.lock
をハッシュ化した文字列によって差分を検知して、node_modules
をキャッシュするのがセオリー。
何が問題か
- キャッシュが頻繁に保存されすぎると、保存されたキャッシュがすぐに10GBに達し、頻繁にrestoreしたいキャッシュが削除されてしまう。
key
が同じなら保存されているキャッシュも同じはずだが、同じkey
のキャッシュが何度も保存されている。
- キャッシュを保存する処理に数十秒かかる。
- いわゆるfeatureブランチのキャッシュは、他のブランチからアクセスできないので、大抵の場合はrestoreされることがなく無駄。
mainブランチのキャッシュのみ保存する
mainブランチのキャッシュのみを保存し、そのキャッシュをfeatureブランチがrestoreする構成にすれば、大抵の場合は最適化される。
actions/cache
の代わりにactions/cache/restore
とactions/cache/save
を使い分けることで、mainブランチのみキャッシュを保存することができる。
参考書籍
GitHub CI/CD実践ガイド――持続可能なソフトウェア開発を支えるGitHub Actionsの設計と運用
参考リンク
依存関係をキャッシュしてワークフローのスピードを上げる
フロントエンドのGitHub Actions実行時間を削減するために取り組んだこと