🐙

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 サービスでは環境変数の CItrue が設定されているので、その値を --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 に組み込んでおくことで、「気をつける」という事に頭のリソースを使うことなく、コードのルール・品質を保つことができました。
割と色々チェックしている方だと思うので、参考になれば幸いです。

テイラーワークスは、エンジニア採用強化中です!
▼少しでも興味をお持ちいただけましたら、採用ページもチェックしてみてください
https://tailorworks.co.jp/careers

Tailor Worksテックブログ

Discussion