🆎

Flutterで開発する時のGitHub Actions

2024/02/12に公開

個人開発でFlutterを採用するケースが多いので、備忘録も兼ねて自分流のGitHub Actionsを記事にしました。

個人開発はFreeプランで行うことが多いため、必要なフェーズで必要なActionsを追加できるように #導入編 #誰かとやることになった時編 #リリース後編 #育てていくぞ!編 で分けています。

導入編

リポジトリ作成直後に設定しているActionsたちです。

flutter installのComposite

準備として、FlutterをインストールするComposite(複合アクション)を作成します。
これから作成するActionsで都度Flutter installの記述をするのは面倒なために、共通化として作成しています。

FVMを使ってバージョン管理しているため.fvm/fvm_config.jsonからFlutterのバージョンを取得しています。
他にバージョンの取得方法はこちらのActionsを使う方法も便利です。

.github/actions/install_flutter_dependencies/action.yml
name: "Install Flutter Dependencies"

description: "dependencies install step"

runs:
  using: "composite"
  steps:
    - name: "Read flutter version from fvm config"
      id: flutter_info
      run: |
        FLUTTER_VERSION=$(jq -r '.flutterSdkVersion' ./.fvm/fvm_config.json)
        echo "FLUTTER_VERSION=$FLUTTER_VERSION" >> $GITHUB_ENV
      shell: bash

    - name: "Setup Flutter"
      uses: subosito/flutter-action@v2
      with:
        flutter-version: ${{ env.FLUTTER_VERSION }}
        cache: true

flutter test

FlutterのTestを実行するためのActionです。

.github/workflows/flutter_test.yml
name: flutter test

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout"
        uses: actions/checkout@v4

      - uses: ./.github/actions/install_flutter_dependencies

      - name: "Run tests"
        run: flutter test

flutter analyze

Flutterのanalyzeコマンドを走らせるためのActionです。

.github/workflows/flutter_analyze.yml
name: flutter analyze

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  analyze:
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout"
        uses: actions/checkout@v4

      - uses: ./.github/actions/install_flutter_dependencies

      - name: "Run analyze"
        run: flutter analyze

dependabot

Actionsとはちょっと違いますが、dependabotの設定ファイルもこのタイミングで作成しちゃいます。

.github/dependabot.yml
version: 2
enable-beta-ecosystems: true
updates:
  - package-ecosystem: "pub"
    directory: "/"
    schedule:
      interval: "weekly"
    ignore:
      - dependency-name: "*"
        update-types: ["version-update:semver-major"]
    reviewers:
      - "imajoriri" # 個人やチームに置き換えてください

誰かとやることになった時編

自分以外の誰か(人)と開発をすることになった時に設定するActionsです。

Pull requestのAuthorを追加

PRを作成した時に、Assigneeに作成者を追加してくれます。
PR一覧で、作成者が見れるので便利で使っています。

.github/workflows/pr_author.yml
name: pull request author

on:
  pull_request:
    types: [opened]

jobs:
  author:
    runs-on: ubuntu-latest
    uses: technote-space/assign-author@v1.3.1

deploy編

GitHub Pagesへのデプロイ

Flutter WebをGitHub pagesへデプロイするActionです。
このほかにGitHubの「Settings -> Actions -> General -> Workflow permissionsを「Read and write permissions」にする必要があります。

成功すると、以下のリンクから開けます。

name: deploy flutter web

on:
  push:
    branches: ["main"]
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      pages: write
      id-token: write
      contents: write
    steps:
      - uses: actions/checkout@v4

      - uses: ./.github/actions/install_flutter_dependencies

      # --base-hrefには、リポジトリ名に変えてください
      - name: build web
        run: |
          flutter build web --base-href=/widgetbook_sample/

      - uses: actions/upload-pages-artifact@v1
        with:
          path: ./build/web

  deploy:
    needs: build
    permissions:
      pages: write
      id-token: write
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v1

Flutter webをS3へdeploy

name: deploy flutter web for s3

on:
  push:
    branches:
      - main

jobs:
  deploy_widgetbook:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v3.3.0

      - name: Install dependencies
        uses: ./.github/actions/install_dependencies

      # ここら辺は適宜変更してください
      - uses: aws-actions/configure-aws-credentials@v4.0.1
        with:
          role-to-assume: arn:aws:iam::xxx:role/xxx
          aws-region: ap-northeast-1
          role-duration-seconds: 3600
          role-session-name: xxx

      # --base-hrefには、s3のバケット名を指定する
      - name: build web
        run: |
          flutter build web --base-href=/backagename/
      - name: Copy files to s3
        run: |
          aws s3 cp ./build/web/ s3://xxx/backagename/ --acl public-read --recursive

(Mac App)releaseが作成されたらビルドをzip化してreleaseに添付

GitHubのリリース作成時にビルドしassetsにzipファイルをアップロードするactionです。
私は個人開発とかで使用しています。
例えばこちらのリポジトリのreleaseなどをみてもらうとapp-macos.zipがそれです。


https://github.com/tinp-lab/tokeru/releases

name: Build and Release macOS App

on:
  release:
    types: [published]

jobs:
  build:
    runs-on: macos-latest
    steps:
      - name: "Checkout"
        uses: actions/checkout@v4

      - name: "setup java"
        uses: actions/setup-java@v3
        with:
          distribution: "zulu"
          java-version: "12.x"

      - uses: ./.github/actions/install_flutter_dependencies

      - name: Build macOS app
        run: flutter build macos --dart-define-from-file=dart_defines/prod.json

      - name: Zip the app
        run: |
          cp -r build/macos/Build/Products/Release/Tokeru.app Tokeru.app
          zip -r release.zip Tokeru.app

      - name: Upload ZIP to Release
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ github.event.release.upload_url }}
          asset_path: ./release.zip
          asset_name: app-macos.zip
          asset_content_type: application/zip

そのほか編

CodeRabbit

AIがコードレビューをしてくれるサービスのCodeRabbitです。
1人で開発していると、レビューをしてくれる人がいないため重宝しています。

...執筆中!! フォローして待っててね!

Discussion