Flutterパッケージを管理する際に役立つCI/CD (GitHub Actions)
はじめに
パッケージを自前で管理していると以下のような困りごとはありませんでしたか?
- いちいち手動でデプロイするのがめんどくさい
- アップデートしたら思いもよらぬ場所でバグっちゃった
- PRきたけど、一回クローンして静的解析するのだるいな
- PRきたけど、それって本当にマージしても動作に影響ないのかな?
- 手元だとwarning出てなかったけど、保存し忘れたままPublishしたせいでスコアが落ちた!
安心してください、私がその問題を全て解決して差し上げます。
※今回はDart3に対応するためにFlutterはmaster channelで解説していきます。
登場するSecrets
CREDENTIAL_JSON ・・・ pub.devの認証情報のトークンです。credentials.jsonの内容をコピペします。
参考:
PRが来た際
PRが来たら、静的解析→テスト→パッケージの公開要件を確認します。
name: PR review
on:
pull_request:
jobs:
analyze:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- uses: subosito/flutter-action@v2
with:
channel: 'master'
cache: true
- name: Install dependencies
run: |
flutter pub get
- name: Analyze
run: |
flutter analyze
- name: Run tests
run: |
flutter test
- name: Dry run
run: |
flutter pub publish --dry-run
※実はDryRunで静的解析は入るのでAnalyzeは抜いてもいいかもしれません。自分は真っ先に静的解析の結果を知りたいので入れてます。
Masterに pushされた時 or マージされた時
まずはデプロイするワークフローから紹介します。
認証用のファイルを生成した後に、デプロイしているだけです。
name: Publish package on push
'on':
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: subosito/flutter-action@v2
with:
channel: 'master'
cache: true
- name: Setup credentials
run: |
mkdir -p ~/.config/dart
cat <<EOF > ~/.config/dart/pub-credentials.json
${{ secrets.CREDENTIAL_JSON }}
EOF
- name: Publish package
run: flutter pub publish -f
次にVRTを導入している人向けなのですが、ゴールデンイメージを生成するワークフローを紹介します。
このワークフローでは、
依存関係の解決→ゴールデンイメージの生成→gitの設定→生成されたイメージをマスターブランチにPushします。
また、Action内でPushしても上記のデプロイのActionは実行されないので安心してください。
name: update goldens
'on':
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- uses: subosito/flutter-action@v2
with:
channel: 'master'
cache: true
- name: Install dependencies
run: |
flutter pub get
- name: update goldens
run: |
flutter test --update-goldens
- name: Configure Git
run: |
git config --global user.name "MyName"
git config --global user.email "MyEmail@my-email.com"
- name: Push changes
run: |
git add test
git commit -m "$(date '+%Y-%m-%d %H:%M:%S') update goldens"
git push origin master
特にUIに関係するパッケージを作っている方はVRTの導入をお勧めします。デバッグなどを手動でやるより、テストに起こして、自動化した方がかなり楽です。
ゴールデンテストに関しては以下が参考になると思います。
参考:
使用させていただいたツール類
- actions/checkout・・・workflow内でリポジトリにアクセスできるようにします。
- subosito/flutter-action@v2・・・workflow内でFlutterを使えるようにします。
終わりに
このように静的解析→テスト→DryRun→デプロイ→ゴールデンイメージの更新をすることによって、だいぶミスは減ると思います。また、PRをしてくださる方の中にはWarningなどを無視している人もいるので事前にActionの結果を見ることで問題のあるところを確認できるのは有用だと思います。
今回はしていませんが、dart format .
を自動で行うようにしても良いかもしれませんね。
Discussion