🌊

GitHub ActionsでFlutter Windowsアプリをリリースする

2023/06/25に公開

はじめに

現在、下記環境でFlutter Windowsアプリを開発しています。

ツール名 バージョン
Windows 11 Pro 22H2
Flutter SDK 3.10.5
Windows 11 SDK 10.0.22000.0

リリースする度にいろいろやらないといけないのは面倒くさいっと思ったので、GitHub Actionsを使ってテストからデプロイまでの作業を自動化しています。

自分用メモですが、ご参考になれば幸いです。

事前に用意しておくと良いもの

  1. GitHub Personal access tokenを作成
    GitHub Releaseを作るため、access tokenを作りましょう(作成方法)。

  2. 作成したtokenをRepository secretsに登録
    workflowでtokenを利用するため、repoにアクセスする権限を付与してGitHubに登録しましょう(登録方法)。

設定ファイルを作る

共通設定

まずは全体の設定を書きます。

# .github\workflows\build.yml
name: build

# 実行するトリガーを指定
# - masterブランチ
# - Pull Request
on:
  push:
    branches:
      - master
  pull_request:

# 同じブランチで新しいJobが来たら、今実行中のJobをキャンセルする
concurrency:
  group: ${{ github.ref }}
  cancel-in-progress: true

# 環境変数を設定
env:
  # 使用しているFlutter SDKのバージョン
  flutter_version: 3.10.5
  # 成果物のファイル名
  release_file_name: your_release_file_name

テストJobの設定

次は静的検査とテスト用のJobの設定を書きます。

※キャッシュは7日間に使用されていなければ自動的に削除される[1]

# .github\workflows\build.yml
jobs:
  # Job名
  analyze-and-test:
    # ubuntuで実行する
    runs-on: ubuntu-latest
    steps:
      # ソースコードをDL
      - uses: actions/checkout@v3

      # Flutter SDKをインストール
      - name: Install flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: ${{ env.flutter_version }}
          channel: 'stable'
          cache: true
          cache-key: ${{ runner.os }}-flutter-sdk-v${{ env.flutter_version }}

      # キャッシュ設定
      - name: Cache pubspec
        id: cache-pubspec
        uses: actions/cache@v3
        with:
          path: |
            ${{ env.FLUTTER_HOME }}/.pub-cache
            **/.flutter-plugins
            **/.flutter-plugin-dependencies
            **/.dart_tool/package_config.json
          key: pubspec-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: |
            pubspec-

      # Flutterのパッケージをインストール
      - name: Run pub get
        run: flutter pub get

      # キャッシュ設定
      - name: Cache build_runner
        id: cache-build-runner
        uses: actions/cache@v3
        with:
          path: |
            **/.dart_tool/build
          key: build-runner-${{ hashFiles('**/asset_graph.json') }}-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: |
            build-runner-

      # ソースコードの自動生成を行う
      - name: Run build_runner
        run: flutter packages pub run build_runner build -d

      # Flutterの静的検査を実行
      - name: Run analyze
        run: flutter analyze --fatal-infos

      # Flutterのユニットテストを実行
      - name: Run test
        run: flutter test --machine > test-report.json

      # ユニットテストの結果をGitHub Actionsに反映
      - name: Archive report
        uses: dorny/test-reporter@v1
        if: success() || failure()
        with:
          name: Flutter Tests
          path: test-report.json
          reporter: flutter-json
          fail-on-error: true

リリースJobの設定

最後にリリース用のJobの設定を書きます。

# .github\workflows\build.yml
jobs:
  # Job名
  build-windows:
    # masterブランチのみで実行
    if: github.ref == 'refs/heads/master'
    # テストJobが成功していることを前提とする
    needs: analyze-and-test
    # Windowsで実行する
    runs-on: windows-latest
    steps:
      # ソースコードをDL
      - uses: actions/checkout@v3

      # Flutter SDKをインストール
      - name: Install flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: ${{ env.flutter_version }}
          channel: 'stable'
          cache: true
          cache-key: ${{ runner.os }}-flutter-sdk-v${{ env.flutter_version }}

      # キャッシュ設定
      - name: Cache pubspec
        id: cache-pubspec
        uses: actions/cache@v3
        with:
          path: |
            ${{ env.FLUTTER_HOME }}/.pub-cache
            **/.flutter-plugins
            **/.flutter-plugin-dependencies
            **/.dart_tool/package_config.json
          key: pubspec-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: |
            pubspec-

      # Flutterのパッケージをインストール
      - name: Run pub get
        run: flutter pub get

      # キャッシュ設定
      - name: Cache build_runner
        id: cache-build-runner
        uses: actions/cache@v3
        with:
          path: |
            **/.dart_tool/build
          key: build-runner-${{ hashFiles('**/asset_graph.json') }}-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: |
            build-runner-

      # ソースコードの自動生成を行う
      - name: Run build_runner
        run: flutter packages pub run build_runner build -d

      # アプリのビルド番号の自動設定
      - name: Bump build number
        run: |
          flutter pub global activate cider
          cider bump build --build=${{ github.run_number }}

      # Windowsアプリのビルドを実行
      - name: Build windows
        run: |
          flutter config --enable-windows-desktop
          flutter build windows --release

      # GitHubのtag名を取得
      - name: Set tag name
        run: echo "tag_name=v$(cider version)" >> $env:GITHUB_ENV

      # 成果物をzip形式で圧縮
      - name: Archive release
        uses: thedoctor0/zip-release@main
        with:
          type: 'zip'
          filename: '${{ env.release_file_name }}-${{ env.tag_name }}-windwos.zip'
          directory: build/windows/runner/Release

      # zip形式の成果物をGitHub Releaseに公開
      - name: Publish release
        uses: ncipollo/release-action@v1
        with:
          allowUpdates: true
          artifacts: build/windows/runner/Release/${{ env.release_file_name }}-${{ env.tag_name }}-windwos.zip
          generateReleaseNotes: true
          tag: ${{ env.tag_name }}
          # 事前に登録したtokenを使用
          token: ${{ secrets.RELEASE_TOKEN }}

これからやりたいこと

ひとまずテスト~リリースの作業を自動化しましたが、まだ改善の余地があるので次のステップとして下記機能を実装したいと思っています。

  • exeもしくはmsi形式でリリースする
  • Microsoft Storeにも公開する
脚注
  1. Usage limits and eviction policy ↩︎

GitHubで編集を提案

Discussion