GitHub ActionsでFlutter SDKをキャッシュする
GitHub Actionsを利用してFlutterアプリをビルドする場合、ビルド前にSDKをいちいち設定する必要があります。下の例ではそれに1分近くかけており、CIの時間をかなり圧迫していることがわかります。
GitHub Actionsにはキャッシュの機能が存在するため、Flutter SDKをキャッシュすることでCI時間を大幅に削減することが見込めます。
1.Cacheアクションを使う
#...略...
'on':
push:
branches:
- master
env:
flutter_version: '2.10.0'
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: search flutter cache
uses: actions/cache@v2
with:
path: /opt/hostedtoolcache/flutter
key: ${{ runner.os }}-flutter-install-cache-${{ env.flutter_version }}
- uses: subosito/flutter-action@v1
with:
flutter-version: ${{ env.flutter_version }}
channel: stable
- name: Install
run: flutter pub get
#...略...
subosito/flutter-actionはv2が出てますが試していません
まずenv
で環境変数にSDKのバージョンを指定します。バージョンが異なるとキャッシュが機能しないためです。次にbuildのjob内で、actions/cache
を使いキャッシュを検索します。もしヒットすればここだけでSDKを入手できます。失敗した場合は次のsubosito/flutter-action
で通常通りSDKを取得することになります。基本的には2回目以降はキャッシュが使われるはずなので、高速化が見込めます。
バージョン固定しない場合
- name: search flutter cache
uses: actions/cache@v2
with:
path: /opt/hostedtoolcache/flutter
key: ${{ runner.os }}-flutter-install-cache-stable
- uses: subosito/flutter-action@v2
with:
channel: stable
バージョン固定しない場合は上のようにその記述を削除しても動かせます。ただしキャッシュの関係上常に最新のバージョンが使えるとは限りません。(なので固定したほうが安心かも?)
結果
キャッシュによりSDKの設定部分が50秒→20秒とだいだい30秒程度の改善に成功しました!
キャッシュの期限について
GitHub will remove any cache entries that have not been accessed in over 7 days.
1週間以上はキャッシュしてくれないようなので、数日に1度程度以上回すプロジェクトについては恩恵があると思われます。
2.flutter-actionのキャッシュ機能を使う
書いているときに気がついたのですがflutter-action
にキャッシュの設定がありました(試していません)
steps:
- uses: actions/checkout@v2
- uses: subosito/flutter-action@v2
with:
flutter-version: '2.5.0'
channel: 'stable'
cache: true
cache-key: flutter # optional, change this to force refresh cache
cache-path: ${{ runner.tool_cache }}/flutter # optional, change this to specify the cache path
- run: flutter --version
こちらも内部ではactions/cache
を利用しているため同様の効果があると思われます。
まとめ
- SDKのキャッシュを使うことでCIの時間を30秒程度削減できる
- 1週間以上はキャッシュしてくれない
参考
Discussion