android – Integrating Patrol with GitHub Actions for Automated Flutter Integration Tests


I am working on setting up a continuous integration pipeline with automated integration tests for a Flutter application. My goal is to run the tests using Patrol and subsequently deploy to Firebase Test Lab. However, I’m encountering issues with building the test APK using Patrol in the GitHub Actions workflow.

I have configured my workflow to set up the environment, install dependencies, and build the test APK for Android and iOS. Despite multiple attempts and different configurations, the build process fails, and I have not been able to efficiently run an emulator within the pipeline.

on:
  push:
    branches: [ staging ]
  pull_request:
    branches: [ staging ]
  workflow_dispatch:

jobs:
  setup:
    runs-on: ubuntu-latest
     
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2

      - name: Set Git user info
        run: | 
       
      - name: Install Google Cloud SDK
        run: |
          curl -sSL https://sdk.cloud.google.com | bash
          echo "$HOME/google-cloud-sdk/bin" >> $GITHUB_PATH
      - name: Decode and Write Service Account to File
        run: |
            echo "${{ secrets.KEY}}" | base64 -d > /tmp/temp.json
            echo "GOOGLE_APPLICATION_CREDENTIALS=/tmp/temp.json" >> $GITHUB_ENV
      - name: Extract Project ID from Service Account
        run: |
            PROJECT_ID=$(jq -r '.project_id' /tmp/temp.json)
            echo "PROJECT_ID=$PROJECT_ID" >> $GITHUB_ENV
      - name: Install Firebase CLI
        run: curl -sL firebase.tools | bash
        
      - name: Install Google Cloud SDK
        run: |
          curl -sSL https://sdk.cloud.google.com | bash
          echo "$HOME/google-cloud-sdk/bin" >> $GITHUB_PATH
    
      - name: Authenticate with Google Cloud
        run: |
            gcloud auth activate-service-account --key-file=/tmp/temp.json
            gcloud config set project "$PROJECT_ID"
      - name: Retrieve and Mask all GCP Secrets
        run: |
            secrets=$(gcloud secrets list --format="get(name)")
            for secret_full_name in $secrets; do
              secret_name=${secret_full_name##*/}
              secret_value=$(gcloud secrets versions access latest --secret="$secret_name" --project="$PROJECT_ID" --quiet)
              echo "::add-mask::***"
              echo "$secret_name"='***' >> $GITHUB_ENV
            done
      
    
        
  

  android-tests:
    needs: setup
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2

      - name: Set up Flutter
        uses: subosito/flutter-action@v1
        with:
          flutter-version: '3.16.5'

      - name: Install Dependencies
        run: flutter pub get

      - name: Install Patrol
        run: flutter pub global activate patrol

      - name: Build Android App and Test APK with Patrol
        run: patrol build android -t integration_test/example_test.dart --flavor production

      - name: Run Tests on Firebase Test Lab (Android)
        run: |
          gcloud firebase test android run \
            --type instrumentation \
            --app build/app/outputs/apk/debug/app-debug.apk \
            --test build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
            --device model="nexus6", version="30", locale=en, orientation=portrait \
            --timeout 10m \
            --results-bucket="patrol_runs" \
            --use-orchestrator \
            --environment-variables clearPackageData=true
      - name: Fastlane Android Deployment
        run: fastlane android deploy

  ios-tests:
    needs: setup
    runs-on: macos-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2

      - name: Set up Flutter
        uses: subosito/flutter-action@v1
        with:
          flutter-version: '3.16.5'

      - name: Install Dependencies
        run: flutter pub get

      - name: Install Patrol
        run: flutter pub global activate patrol

      - name: Build iOS App for Testing
        run: patrol build ios --target integration_test/example_test.dart --release

      - name: Package iOS Tests
        run: |
          pushd build/ios_integ/Build/Products
          zip -r ios_tests.zip Release-iphoneos Runner_iphoneos16.2-arm64.xctestrun
          popd
      - name: Run Tests on Firebase Test Lab (iOS)
        run: |
          gcloud firebase test ios run \
            --test build/ios_integ/Build/Products/ios_tests.zip \
            --device model=iphone13, version=16.2, locale=en_US, orientation=portrait \
            --timeout 10m \
            --results-bucket="patrol_runs"
      - name: Fastlane iOS Deployment
        run: fastlane ios deploy 

I attempted to use an emulator build directly in the pipeline, but it proved to be inefficient. I’m now exploring how to best utilize Firebase Test Lab for running the tests.

I would appreciate any guidance on the following points:

How can I successfully build the test APK with Patrol in a GitHub Actions workflow?

What is the most efficient way to run these tests on Firebase Test Lab?

Are there best practices or recommended approaches for setting up this type of CI/CD pipeline for a Flutter app?

Latest articles

spot_imgspot_img

Related articles

Leave a reply

Please enter your comment!
Please enter your name here

spot_imgspot_img