【Flutter】CIの実行時間を63%削減した話をしようか

Dart

概要

どうも、@daiki1003です!

Flutterでもなんでもそうですが、普段開発をする上で
安定して高品質なプロダクトをリリースしなければならないため、CIは欠かせない存在になっていますね。

そんな必要不可欠なCIですが、1秒でも早く終わってほしいですよね?
毎回のことなので、少しでも改善できれば複利のように効いてくるので
ぜひ本記事を読んで使えるところは使ってみてくださいね!

最終的に完成したyamlも貼り付けるのでコピペで
使えると思いますよ 👍

今回CIの改善で行ったのは下記3点です。

Flutterインストールのキャッシュ
flutter pub getのキャッシュ
build_runnerのキャッシュ

では行ってみましょー!

Flutterのインストールのキャッシュ

ここだけやるだけでも結構効果的ですね。
やり方は2通りあると思います。

subosito/flutter-action@v2を使い、cacheの有効化
actions/cache@v2の使用

今回は前者のみ解説しようと思いますが、もし要望があれば後者も追記しますね。

subosito/flutter-action@v2を使い、cacheの有効化

Flutterをインストールする上で、一番使われているであろうsubosito/flutter-action

すでに使われている場合は、バージョンをv2にした上で、cache: trueを追加するだけでOKです。
v2にしないとcacheなんてキーはないよ、と怒られます。

もし、キャッシュが効けば3〜40秒ほどの時間短縮になるかと思います。(もちろん環境に依ります)

flutter pub getのキャッシュ

actions/cache@v2を使っていきます。

GitHub - actions/cache: Cache dependencies and build outputs in GitHub Actions
Cache dependencies and build outputs in GitHub Actions - actions/cache

Flutterをインストールしたあとは、依存パッケージの取得などを行います。

その際に、flutter pub getを行うと思いますがこの結果をキャッシュします。
pubspec.lockの内容が変更されたらキャッシュは使用しないようにするため、
pubspec.lockのハッシュ値をキーに含めます。

これも成功すれば数十秒の時間短縮になるかと思います。

build_runnerのキャッシュ

これは必要ない人もいると思いますが、freezedなどの生成ファイルをコミットしていない場合、
CIでflutter pub run build_runner build --delete-conflicting-outputsを実行すると思います。
もちろんファイル数や設定によりますがこれも数分かかったりする場合があります。
この結果をキャッシュします。
pubspec.lock及びasset_graph.jsonが更新されたらキャッシュは使用しません。

これは生成対象となるファイル数やbuild.yamlの設定によりますが、かなりの時間短縮につながる可能性がありますね。

最後に

これらを全て行うyamlファイルは以下のようになります。

いかがでしたでしょうか?
では、良いCIライフを!

本記事は、以下の記事を参考にさせていただきました!

Como reduzimos o tempo de execução do Flutter no CI em cerca de 20%
Já pensou quanto tempo é necessário para rodar todos os pipelines de Integração Contínua do seu projeto mobile, assegurando a qualidade dos…
誰かのお役に立てば。

Twitterフォローお願いします

「次回以降も記事を読んでみたい!」
「この辺分からなかったから質問したい!」

そんな時は、是非Twitter (@daiki1003)Instagram (@ashdik_flutter)のフォローお願いします♪

Twitterコミュニティ参加お願いします

Twitterコミュニティ「Flutter lovers」を開設しました!
参加お待ちしております😁

☕️ Buy me a coffee

また、記事がとても役に立ったと思う人は
コーヒーを奢っていただけると非常に嬉しいです!
@daiki1003

コメント

タイトルとURLをコピーしました