natsuk4ze/gal

View on GitHub
.github/workflows/ci.yml

Summary

Maintainability
Test Coverage
# Runner details on https://github.com/actions/runner-images/tree/main/images

name: CI

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  set-up:
    runs-on: ubuntu-latest
    steps:
      - name: Cancel
        uses: styfle/cancel-workflow-action@0.12.1
        with:
          access_token: ${{ github.token }}

  windows:
    needs: set-up
    timeout-minutes: 30
    strategy:
      matrix:
        windows-version: [10]
      fail-fast: false
    runs-on: windows-latest
    steps:
      - name: Check out
        uses: actions/checkout@v4

      - name: Setup Flutter SDK
        timeout-minutes: 10
        uses: subosito/flutter-action@v2
        with:
          channel: stable

      - name: Run integration tests
        id: Run-integration-tests
        timeout-minutes: 15
        run: |
          cd example
          flutter test integration_test/integration_test.dart windows

  macos:
    needs: set-up
    timeout-minutes: 30
    strategy:
      matrix:
        macos-version: [13,14]
      fail-fast: false
    runs-on: macos-${{ matrix.macos-version }}
    steps:
      - name: Check out
        uses: actions/checkout@v4

      - name: Setup Flutter SDK
        timeout-minutes: 10
        uses: subosito/flutter-action@v2
        with:
          channel: beta

      - name: Run integration tests
        id: Run-integration-tests
        timeout-minutes: 15
        run: |
          cd example
          flutter test -d macos integration_test/integration_test.dart macos

  ios:
    needs: set-up
    timeout-minutes: 60
    strategy:
      matrix:
        ios-version: [17,18]
      fail-fast: false
    runs-on: macos-14
    steps:
      - name: Check out
        uses: actions/checkout@v4

      - name: Setup Flutter SDK
        timeout-minutes: 10
        uses: subosito/flutter-action@v2
        with:
          channel: beta

      - name: Boot ios simulator
        uses: futureware-tech/simulator-action@v4
        with:
          os: iOS
          model: 'iPhone 15'
          os_version: ^${{ matrix.ios-version }}
      
      - name: Grant permission
        run: |
          brew tap wix/brew
          brew install applesimutils
          cd example
          applesimutils --booted --bundle studio.midoridesign.galExample --setPermissions photos=YES

      - name: Run integration tests
        id: Run-integration-tests
        continue-on-error: true
        timeout-minutes: 15
        run: |
          cd example
          flutter test integration_test/integration_test.dart

      # Retry: Integration testing with GitHub Actions is unstable.
      - name: Retry integration tests
        id: Retry-integration-tests
        timeout-minutes: 15
        if: steps.Run-integration-tests.outcome == 'failure'
        run: |
          flutter clean && flutter pub get
          cd example
          flutter clean && flutter pub get
          flutter test integration_test/integration_test.dart

  android:
    needs: set-up
    timeout-minutes: 60
    runs-on: macos-13
    strategy:
      matrix:
        api-level: [34,33,32,31,30,29,28,27,26,25,24,23,22,21]
      fail-fast: false
    steps:
      - name: Check out
        uses: actions/checkout@v4
 
      - name: Setup Flutter SDK
        uses: subosito/flutter-action@v2
        with:
          channel: beta
 
      - name: Install Flutter dependencies
        run: flutter pub get ./example
 
      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: 17
          distribution: temurin
          
      - name: Cache Gradle
        uses: actions/cache@v4
        with:
          path: ~/.gradle/caches
          key: gradle
        
      - name: Cache AVD
        uses: actions/cache@v4
        id: cache-avd
        with:
          path: |
            ~/.android/avd/*
            ~/.android/adb*
          key: avd-${{ matrix.api-level }}
 
      # Retry: Integration testing with GitHub Actions is unstable.
      - name: Run integration tests
        id: Run-integration-tests
        continue-on-error: true
        timeout-minutes: 20
        uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: ${{ matrix.api-level }}
          working-directory: ./example
          arch: x86_64
          emulator-boot-timeout: 200
          disable-spellchecker: true
          force-avd-creation: false
          disk-size: 4GB
          sdcard-path-or-size: ${{ matrix.api-level < 29 && '10M' || null }}
          emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -camera-front none
          script: |
            if [ ${{ matrix.api-level }} -le 29 ]; then flutter build apk --debug; adb install -r build/app/outputs/flutter-apk/app-debug.apk; adb shell pm grant studio.midoridesign.gal_example android.permission.WRITE_EXTERNAL_STORAGE; adb shell pm grant studio.midoridesign.gal_example android.permission.READ_EXTERNAL_STORAGE; fi
            flutter test integration_test/integration_test.dart
 
      # Retry: Integration testing with GitHub Actions is unstable.
      - name: Retry integration tests
        id: Retry-integration-tests
        continue-on-error: true
        timeout-minutes: 20
        if: steps.Run-integration-tests.outcome == 'failure'
        uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: ${{ matrix.api-level }}
          working-directory: ./example
          arch: x86_64
          emulator-boot-timeout: 200
          disable-spellchecker: true
          force-avd-creation: false
          disk-size: 4GB
          sdcard-path-or-size: ${{ matrix.api-level < 29 && '10M' || null }}
          emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -camera-front none
          pre-emulator-launch-script: |
            adb kill-server
            adb start-server
          script: |
            flutter clean && flutter pub get
            if [ ${{ matrix.api-level }} -le 29 ]; then flutter build apk --debug; adb install -r build/app/outputs/flutter-apk/app-debug.apk; adb shell pm grant studio.midoridesign.gal_example android.permission.WRITE_EXTERNAL_STORAGE; adb shell pm grant studio.midoridesign.gal_example android.permission.READ_EXTERNAL_STORAGE; fi
            flutter test integration_test/integration_test.dart

      # Retry: Integration testing with GitHub Actions is unstable.
      - name: Re:Retry integration tests
        if: steps.Retry-integration-tests.outcome == 'failure'
        timeout-minutes: 20
        uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: ${{ matrix.api-level }}
          working-directory: ./example
          arch: x86_64
          emulator-boot-timeout: 200
          disable-spellchecker: true
          force-avd-creation: false
          disk-size: 4GB
          sdcard-path-or-size: ${{ matrix.api-level < 29 && '10M' || null }}
          emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -camera-front none
          pre-emulator-launch-script: |
            adb kill-server
            adb start-server
          script: |
            flutter clean && flutter pub get
            if [ ${{ matrix.api-level }} -le 29 ]; then flutter build apk --debug; adb install -r build/app/outputs/flutter-apk/app-debug.apk; adb shell pm grant studio.midoridesign.gal_example android.permission.WRITE_EXTERNAL_STORAGE; adb shell pm grant studio.midoridesign.gal_example android.permission.READ_EXTERNAL_STORAGE; fi
            flutter test integration_test/integration_test.dart