🙌

Flutter開発で使っているGitHub Actionsのワークフロー

2022/12/10に公開約6,400字

Flutter のモバイルアプリ開発で個人的に使っている GitHub Actions のワークフローを紹介します、ファイル一式はこちらに置いています。
https://github.com/yorifuji/flutter_github_actions_template

  • check.yml
    • flutter analyze と flutter test を実行
  • bump.yml
    • GitHub の画面上からアプリのバージョン(pubspec.yamlversion:)を更新するワークフロー
  • 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 analyzeflutter tsetを実行するワークフローです。

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/check.yml

analyze の実行結果を Pull Request の Files changed タブに表示させるために Danger actionProblem 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 を作成して解析対象のファイル名などを指定します

https://github.com/yorifuji/flutter_github_actions_template/blob/main/Dangerfile

Gemfile を作成します

https://github.com/yorifuji/flutter_github_actions_template/blob/main/Gemfile

flutter analyze の内容を Dangerfile に記述したファイルに出力します

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/check.yml#L51-L54

shell: bashを指定しているのは analyze が失敗した際にこの step を fail 扱いにさせるためです

ワークフロー内に Danger action を記述します

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/check.yml#L51-L54

Problem Matchers のセットアップ

analyze の出力内容を parse するための json ファイルを作成します

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/analyzer-problem-matcher.json

analyze の直前でインストールします

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/check.yml#L48-L58

bump.yml

pubspec.yamlのアプリのバージョン(version: 1.0.0+1)を更新してコミットするワークフローです

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/bump.yml

使い方は 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

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/bump.yml#L47-L51

バージョンの更新を含む commit と tag、release を作成します

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/bump.yml#L53-L63

tag の作成に Personal Access Token を使っています、これはワークフローから tag が push されたイベントをトリガーとして後続のワークフローを実行させるために必要でした(詳細)、使い方を誤るとワークフローの再起的なループが発生するので注意が必要です

bump-pull-request.yml

こちらはバージョン更新の Pull Request を作成するワークフローです
https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/bump-pull-request.yml

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 を作成するワークフローです

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/tagging-when-merged.yml

mainブランチに対するreleases/ブランチの Pull Request のマージ」という条件で実行されるようにしています

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/tagging-when-merged.yml#L3-L15

tag の作成には Personal Access Token を使っています

deliver.yml

Android と iOS のリリースビルドとストアへのアップロードを行うワークフローです

https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/deliver.yml

v で始まる tag のプッシュイベントで実行されます
https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/workflows/deliver.yml#L3-L6

中身の説明は省略します、利用するために必要な情報とファイルは README に記載してありますのでそちらを見てもらえると良いかと思います 🙏
https://github.com/yorifuji/flutter_github_actions_template#セットアップ手順

その他

dependabot.ymlを使って pubspec.yaml に含まれるパッケージと GitHub Actions に含まれる action の更新をチェックしています
https://github.com/yorifuji/flutter_github_actions_template/blob/main/.github/dependabot.yml

pubspec.yaml のライブラリに更新が見つかったら PR が作成されます

GitHub Actions の更新はハッシュで指定している場合も対応しています

https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file


記載内容に誤りや改善点があればコメントいただけると嬉しいです、CI/CD に関するご相談などは Twitter で DM ください

Discussion

ログインするとコメントできます