Flutter開発で使っているGitHub Actionsのワークフロー
Flutter のモバイルアプリ開発で個人的に使っている GitHub Actions のワークフローを紹介します、ファイル一式はこちらに置いています。
-
check.yml
- flutter analyze と flutter test を実行
-
bump.yml
- GitHub の画面上からアプリのバージョン(
pubspec.yaml
のversion:
)を更新するワークフロー
- GitHub の画面上からアプリのバージョン(
-
bump-pull-request.yml
- 上記の Pull Request 版
-
tagging-when-merged.yml
- Pull Request がマージされたタイミングで tag を作成するワークフロー
-
deliver.yml
- tag の push イベントで Android と iOS のリリービルドとストアへのアップロードを行うワークフロー
check.yml
push と pull request に対してflutter analyze
とflutter tset
を実行するワークフローです。
analyze の実行結果を Pull Request の Files changed タブに表示させるために Danger action と Problem Matchers を使っています。
例えば以下のような info , warning, error が analyze で出力されるようなコードに対して check が走ると
flutter analyze
Analyzing app...
info • Prefer const with constant constructors • lib/main.dart:27:13 • prefer_const_constructors
warning • The receiver can't be null, so the null-aware operator '?.' is unnecessary • lib/main.dart:33:13 • invalid_null_aware_operator
error • A value of type 'String' can't be returned from the method 'bar' because it has a return type of 'int' • lib/main.dart:38:12 • return_of_invalid_type
3 issues found. (ran in 1.8s)
次のようなコメントが付きます、先頭が Danger による info に対する出力で残り 2 つの warning と error が Problem Matcher による出力です。
Danger action のセットアップ
Dangerfile を作成して解析対象のファイル名などを指定します
Gemfile を作成します
flutter analyze の内容を Dangerfile に記述したファイルに出力します
shell: bash
を指定しているのは analyze が失敗した際にこの step を fail 扱いにさせるためです
ワークフロー内に Danger action を記述します
Problem Matchers のセットアップ
analyze の出力内容を parse するための json ファイルを作成します
analyze の直前でインストールします
bump.yml
pubspec.yaml
のアプリのバージョン(version: 1.0.0+1
)を更新してコミットするワークフローです
使い方は Actions のタブでbump
を選び右端のRun workflow
をクリックします
更新するバージョンを major or minor or patch or build(number) から選んで緑色のRun workflow
をクリックして実行します
ワークフローが起動してバージョンを更新したコミットがプッシュされます
同時に Tag と Release も作成されます
pubspec.yaml
のアプリのバージョンを更新する処理は cider を使っています、そのためプロジェクトの dev_dependencies
への追加が必要です
dev_dependencies:
cider: ^0.1.1
バージョンの更新を含む commit と tag、release を作成します
tag の作成に Personal Access Token を使っています、これはワークフローから tag が push されたイベントをトリガーとして後続のワークフローを実行させるために必要でした(詳細)、使い方を誤るとワークフローの再起的なループが発生するので注意が必要です
bump-pull-request.yml
こちらはバージョン更新の Pull Request を作成するワークフローです
bump
と同様にワークフローの画面からbump pull request
を選んでRun workflow
から実行します
ワークフローが成功するとバージョンを更新する Pull Request が作成されます
bump
は個人での利用を想定していて、bump-pull-request
は protected branch でメインブランチへの push を禁しているような場合やチーム開発で使うことを想定しています
tagging-when-merged.yml
前述のbump-pull-request.yml
で作成した Pull Request がマージされたら自動的に tag を作成するワークフローです
「main
ブランチに対するreleases/
ブランチの Pull Request のマージ」という条件で実行されるようにしています
tag の作成には Personal Access Token を使っています
deliver.yml
Android と iOS のリリースビルドとストアへのアップロードを行うワークフローです
v
で始まる tag のプッシュイベントで実行されます
中身の説明は省略します、利用するために必要な情報とファイルは README に記載してありますのでそちらを見てもらえると良いかと思います 🙏
その他
dependabot.yml
を使って pubspec.yaml
に含まれるパッケージと GitHub Actions に含まれる action の更新をチェックしています
pubspec.yaml
のライブラリに更新が見つかったら PR が作成されます
GitHub Actions の更新はハッシュで指定している場合も対応しています
記載内容に誤りや改善点があればコメントいただけると嬉しいです、CI/CD に関するご相談などは Twitter で DM ください
Discussion