🦅

GitHub ActionsでFlutter SDKをキャッシュする

2022/02/13に公開

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秒程度の改善に成功しました!

キャッシュの期限について

https://docs.github.com/en/actions/advanced-guides/caching-dependencies-to-speed-up-workflows

GitHub will remove any cache entries that have not been accessed in over 7 days.

1週間以上はキャッシュしてくれないようなので、数日に1度程度以上回すプロジェクトについては恩恵があると思われます。

2.flutter-actionのキャッシュ機能を使う

書いているときに気がついたのですがflutter-actionにキャッシュの設定がありました(試していません)

https://github.com/subosito/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週間以上はキャッシュしてくれない

参考

https://sollematthew.medium.com/github-actions-for-flutter-with-caching-reusable-template-4536c1b67f6a

https://developermemos.com/posts/flutter-tests-github-actions

Discussion