Flutter プロジェクトに設定している GitHub Actions の内容の紹介
こんにちは!
テイラーワークスでモバイルアプリ開発を担当している辰濱です。
今回は、ソーシャルコミュニティプラットフォーム Tailor Works のモバイルアプリ開発の現場に導入した GitHub Actions の内容を紹介します。
はじめに
Tailor Works のモバイルアプリは、Flutter を使って開発されており、CI は GitHub Actions を使っています。
文言修正などの軽微な作業はフロントエンドエンジニアにも改修に入ってもらう事もあり、Flutter でアプリ開発をしているエンジニアであれば暗黙知になっているような事の対応漏れを、見落とさずに早く検知する仕組みが必要でした。
例えば、
- コードの生成漏れの検知をしたい
- ライブラリのライセンス表記ページの更新漏れをなくしたい
などです。
もちろん、Notion 等にルールやチェックリストを記しておくこともできますが、頭のリソースを使わなくて済む CI にそれらを委ねることにしました。
CI でやっていること
コードフォーマットができているかどうかの確認
実行コマンド
dart format $(find lib -name "*.dart" -not \( -name "*.*freezed.dart" -o -name "*.*g.dart" -o -name "oss_licenses.dart" \) ) --set-exit-if-changed
やっていること
Android Studio の Save Actions にフォーマットの設定は行っていますが、それが漏れなく行われているかの検知を行っています。
ポイント
- 自動生成されたファイルを対象外とする
-
--set-exit-if-changed
を設定して、コードフォーマットが行われていない箇所があれば CI を失敗させる
lint エラーがないかの確認
実行コマンド
flutter analyze --no-fatal-infos
やっていること
lint を実行して、そのルールが守れているか確認をします。
ポイント
--no-fatal-infos
です。
flutter analyze
だけだと、エラーがあっても CI が失敗になりませんが、エラーがあった場合に CI を失敗扱いにさせるために、これを指定しています。
ライブラリのライセンス表記ページの更新漏れがないか確認
実行コマンド
flutter pub run flutter_oss_licenses:generate.dart
git diff --name-only --exit-code
やっていること
アプリ内で利用しているライブラリのライセンスを明記するために、 flutter_oss_licenses パッケージを利用しています。
このライブラリを利用し、次のコマンドを実行すると pubspec.yaml
に記述されている依存関係を解析して、 oss_licenses.dart
を生成してくれます。
flutter pub run flutter_oss_licenses:generate.dart
ポイント
上記コマンドを実行後にファイルに差分があれば(= git の diff があれば) CI を失敗扱いにしたいので、
git diff --name-only --exit-code
を実行してファイルの差分チェックを行っています。
使われていないコード(関数・クラス)がないかの確認
実行コマンド
flutter pub run dart_code_metrics:metrics analyze lib
flutter pub run dart_code_metrics:metrics check-unused-files lib
やっていること
dart_code_metrics を使って、使われていないコード(関数・クラス)がないかの確認を行っています。
ポイント
使われていないコード(関数・クラス)があれば CI が失敗するので、オプション指定は不要でした。
UnitTest / WidgetTest が通ることの確認
実行コマンド
flutter test --dart-define=CI=$CI
やっていること
プロジェクト内に実装されている、UnitTest / WidgetTest を実行しています。
なお、WidgetTest も多く実装しているので、このあたりはまた別の機会に紹介できればと思います。
ポイント
CI 環境では実行が失敗するテスト(タイムゾーン依存)があったので、ひとまず CI 環境ではテスト実行をスキップする指定をできるようにしました。
GitHub Actions などの CI サービスでは環境変数の CI
に true
が設定されているので、その値を --dart-define
で指定し、 dart コードで CI 上かどうかを判断できるようにしました。
void main() {
test('formatDateTime', () async {
if (const bool.fromEnvironment('CI')) {
// 実行環境のタイムゾーンに依存するので、CI ではひとまずスキップさせる
return;
}
...
}
}
ビルドが通ることの確認
実行コマンド
flutter build appbundle --debug --flavor staging --dart-define=FLAVOR=staging
やっていること
Android アプリのデバッグビルドが成功するか検証しています。
逆に以下のことはやっていません。
- Android アプリのリリースビルド(ビルド速度・CI 実行時間の観点)
- iOS アプリのビルド(MacOS 環境でしか実行できず、GitHub Actions のコスト面も)
ポイント
CI 環境では実行が失敗するテスト(タイムゾーン依存)があったので、ひとまず CI 環境ではテス
おわりに
色々と CI に組み込んでおくことで、「気をつける」という事に頭のリソースを使うことなく、コードのルール・品質を保つことができました。
割と色々チェックしている方だと思うので、参考になれば幸いです。
テイラーワークスは、エンジニア採用強化中です!
▼少しでも興味をお持ちいただけましたら、採用ページもチェックしてみてください
Discussion