🍻

Flutterパッケージを管理する際に役立つCI/CD (GitHub Actions)

2023/05/03に公開

はじめに

パッケージを自前で管理していると以下のような困りごとはありませんでしたか?

  • いちいち手動でデプロイするのがめんどくさい
  • アップデートしたら思いもよらぬ場所でバグっちゃった
  • PRきたけど、一回クローンして静的解析するのだるいな
  • PRきたけど、それって本当にマージしても動作に影響ないのかな?
  • 手元だとwarning出てなかったけど、保存し忘れたままPublishしたせいでスコアが落ちた!

安心してください、私がその問題を全て解決して差し上げます。
※今回はDart3に対応するためにFlutterはmaster channelで解説していきます。

登場するSecrets

CREDENTIAL_JSON ・・・ pub.devの認証情報のトークンです。credentials.jsonの内容をコピペします。
参考:
https://stackoverflow.com/questions/70487479/whats-the-new-location-of-credentials-json-for-dart-flutter-pub

PRが来た際

PRが来たら、静的解析→テスト→パッケージの公開要件を確認します。

pr-review.yaml
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 マージされた時

まずはデプロイするワークフローから紹介します。
認証用のファイルを生成した後に、デプロイしているだけです。

push-and-publish.yaml
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は実行されないので安心してください。

update-goldens.yaml
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の導入をお勧めします。デバッグなどを手動でやるより、テストに起こして、自動化した方がかなり楽です。
ゴールデンテストに関しては以下が参考になると思います。
参考:

https://www.youtube.com/watch?v=PMZqrCjHhbA

使用させていただいたツール類

終わりに

このように静的解析→テスト→DryRun→デプロイ→ゴールデンイメージの更新をすることによって、だいぶミスは減ると思います。また、PRをしてくださる方の中にはWarningなどを無視している人もいるので事前にActionの結果を見ることで問題のあるところを確認できるのは有用だと思います。
今回はしていませんが、dart format .を自動で行うようにしても良いかもしれませんね。

Discussion