🌟

FlutterアプリのCI/CDパイプライン構築ガイド

2024/05/19に公開

はじめに

私は現在業務で、Flutterのintegration_testパッケージを活用した回帰試験の自動化を行なっています。

この記事では、FlutterアプリのためのCI/CDパイプラインをGitHub Actionsを使用して構築する方法を紹介します。CI/CDパイプラインを設定することで、ビルドやテストのプロセス(CI:継続的インテグレーション)を自動化し、アプリのリリースやデプロイ(CD:継続的デリバリー)を円滑に行うことができます。これにより、手動の作業が減り、バグを早期に発見できるようになります。

前提条件

  • Flutterプロジェクトが既に存在していること
  • GitHubリポジトリが設定されていること
  • GitHub Actionsを使用するための基本的な知識の理解

https://zenn.dev/takuowake/articles/d9ca15539dc152

ステップ1:GitHub Actionsのセットアップ

まずはGitHub Actionsのセットアップから始めましょう。これは、GitHubリポジトリに新しいディレクトリとファイルを作成する簡単な手順です。

1.1 ワークフローファイルの作成

GitHubリポジトリのルートに .github/workflowsディレクトリを作成し、その中にflutter.ymlファイルを作成します。
このファイルに、CI/CDのプロセスを定義します。

name: Flutter CI/CD Pipeline

# ワークフローをトリガーするイベントを定義
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

# ワークフロー内のジョブを定義
jobs:
  build:
    # ジョブが実行される仮想環境を指定
    runs-on: ubuntu-latest 

    # ジョブ内のステップを定義
    steps:
      - name: Checkout repository
        # リポジトリをチェックアウトするアクションを使用
        uses: actions/checkout@v2 

      - name: Set up Flutter
        # Flutterをセットアップするアクションを使用
        uses: subosito/flutter-action@v2 
        with:
          flutter-version: '2.22.0'

      - name: Install dependencies
        run: flutter pub get

      - name: Run tests
        run: flutter test

      - name: Build APK
        # リリース用のAPKをビルドするコマンドを実行
        run: flutter build apk --release

ステップ2:テストの自動化

次に、Integrationテストの設定を行います。これにより、アプリの主要な機能が期待通りに動作するかどうかを確認できます。

2.1 Integrationテストの設定

Flutterプロジェクトに integration_test ディレクトリを作成し、その中にテストファイルを配置します。以下に簡単なサンプルコードを示します。
このコードは、アプリが正常に起動するかを確認する基本的なテストです。

import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:my_app/main.dart' as app;

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('sample test', (WidgetTester tester) async {
    app.main();
    await tester.pumpAndSettle();

    // テストコードをここに追加
  });
}

ちなみに私は、テストコードを書くにあたり、AAA:Arrange-Act-Assertを参考にしました。
https://qiita.com/inasync/items/e0b54e62784710c4b42d

ステップ3:CI/CDパイプラインでのテスト実行

次に、GitHub ActionsでIntegrationテストを実行するステップを追加します。

3.1 GitHub ActionsでのIntegrationテストの実行

flutter.yml にIntegrationテストのステップを追加します。
これにより、コードがプッシュされたときやプルリクエストが作成されたときに、自動的にテストが実行されます。

      - name: Run integration tests
        run: flutter drive --target=test_driver/app.dart

ステップ4:成果物の生成とデプロイ

次に、ビルド成果物の生成とアップロードを行います。これにより、テスト後にアプリのAPKファイルを生成し、保存します。

4.1 APKの生成とアップロード

生成されたAPKをGitHub Actionsのアーティファクトとして保存するためのステップを追加します。

      - name: Build APK
        run: flutter build apk --release

      - name: Upload APK
        uses: actions/upload-artifact@v2
        with:
          name: release-apk
          path: build/app/outputs/flutter-apk/app-release.apk

ステップ5:デプロイメントの自動化

最後に、Firebase App Distributionを使用してテスターに自動的にデプロイするステップを追加します。

5.1 Firebase App Distributionへのデプロイ

Firebase App DistributionにAPKをアップロードし、テスターに配布するための設定を行います。

      - name: Deploy to Firebase App Distribution
        uses: wzieba/Firebase-Distribution-Github-Action@v1
        with:
          appId: ${{ secrets.FIREBASE_APP_ID }}
          token: ${{ secrets.FIREBASE_TOKEN }}
          groups: testers
          file: build/app/outputs/flutter-apk/app-release.apk

まとめ

以上で、FlutterアプリのためのCI/CDパイプラインの基本的な設定が完了しました。このパイプラインは、コードのプッシュやプルリクエスト時に自動的にビルド、テスト、デプロイを行います。これにより、手動での作業が減り、開発効率が向上します。

この記事がFlutterアプリのCI/CDパイプライン構築の参考になれば幸いです。興味がある方は、ぜひ自分のプロジェクトに取り入れてみてください!

Discussion