E2E Tests #6
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: E2E Tests | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| app: | |
| description: 'Specific app to test (leave empty for all apps)' | |
| required: false | |
| type: string | |
| platform: | |
| description: 'Platform to test' | |
| required: false | |
| default: 'all' | |
| type: choice | |
| options: | |
| - all | |
| - android | |
| - ios | |
| jobs: | |
| discover-apps: | |
| name: Discover Apps | |
| runs-on: ubuntu-latest | |
| outputs: | |
| apps: ${{ steps.set-apps.outputs.apps }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Discover apps | |
| id: set-apps | |
| run: | | |
| # TODO: Implement app discovery logic | |
| # For now, we'll use a static list based on current structure | |
| if [ -n "${{ github.event.inputs.app }}" ]; then | |
| apps='["${{ github.event.inputs.app }}"]' | |
| else | |
| apps='["playground"]' | |
| fi | |
| echo "apps=$apps" >> $GITHUB_OUTPUT | |
| echo "Discovered apps: $apps" | |
| e2e-android: | |
| name: E2E Android - ${{ matrix.app }} | |
| runs-on: ubuntu-latest | |
| needs: discover-apps | |
| if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'android' }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| app: ${{ fromJson(needs.discover-apps.outputs.apps) }} | |
| steps: | |
| - name: Delete unnecessary tools 🔧 | |
| uses: jlumbroso/free-disk-space@v1.3.1 | |
| with: | |
| android: false # Don't remove Android tools | |
| tool-cache: true # Remove image tool cache - rm -rf "$AGENT_TOOLSDIRECTORY" | |
| docker-images: false # Takes 16s, enable if needed in the future | |
| large-packages: false # includes google-cloud-sdk and it's slow | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Install pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: latest | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '18' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: | | |
| pnpm install | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v3 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Restore APK from cache | |
| id: cache-apk-restore | |
| uses: actions/cache/restore@v4 | |
| with: | |
| path: apps/${{ matrix.app }}/android/app/build/outputs/apk/debug/app-debug.apk | |
| key: apk-${{ matrix.app }} | |
| - name: Build Android app | |
| if: steps.cache-apk-restore.outputs.cache-hit != 'true' | |
| working-directory: apps/${{ matrix.app }} | |
| run: | | |
| pnpm nx run @react-native-harness/${{ matrix.app }}:build-android --tasks=assembleDebug | |
| - name: Save APK to cache | |
| if: steps.cache-apk-restore.outputs.cache-hit != 'true' && success() | |
| uses: actions/cache/save@v4 | |
| with: | |
| path: apps/${{ matrix.app }}/android/app/build/outputs/apk/debug/app-debug.apk | |
| key: apk-${{ matrix.app }} | |
| - name: Enable KVM group perms | |
| run: | | |
| echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
| sudo udevadm control --reload-rules | |
| sudo udevadm trigger --name-match=kvm | |
| ls /dev/kvm | |
| - name: Restore AVD from cache | |
| id: avd-cache-restore | |
| uses: actions/cache/restore@v4 | |
| with: | |
| path: | | |
| ~/.android/avd/* | |
| ~/.android/adb* | |
| key: avd-${{ matrix.app }} | |
| - name: Create AVD and generate snapshot for caching | |
| if: steps.avd-cache-restore.outputs.cache-hit != 'true' | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| working-directory: apps/${{ matrix.app }}/android | |
| api-level: 35 | |
| arch: x86_64 | |
| profile: pixel_7 | |
| disk-size: 1G | |
| heap-size: 1G | |
| force-avd-creation: false | |
| avd-name: Pixel_8_API_35 | |
| emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| script: | | |
| echo "Generated AVD and snapshot for caching" | |
| - name: Save AVD to cache | |
| if: steps.avd-cache-restore.outputs.cache-hit != 'true' && success() | |
| uses: actions/cache/save@v4 | |
| with: | |
| path: | | |
| ~/.android/avd/* | |
| ~/.android/adb* | |
| key: avd-${{ matrix.app }} | |
| - name: Run E2E tests | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| working-directory: apps/${{ matrix.app }}/android | |
| api-level: 35 | |
| arch: x86_64 | |
| profile: pixel_7 | |
| disk-size: 1G | |
| heap-size: 1G | |
| force-avd-creation: false | |
| avd-name: Pixel_8_API_35 | |
| emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| script: | | |
| adb install -r "./app/build/outputs/apk/debug/app-debug.apk" | |
| pnpm nx run @react-native-harness/${{ matrix.app }}:start --args="test android-native" | |
| - name: Upload test results | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: e2e-results-android-${{ matrix.app }} | |
| path: test-results/ | |
| retention-days: 7 | |
| e2e-ios: | |
| name: E2E iOS - ${{ matrix.app }} | |
| runs-on: macos-latest | |
| needs: discover-apps | |
| if: ${{ github.event.inputs.platform == 'all' || github.event.inputs.platform == 'ios' }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| app: ${{ fromJson(needs.discover-apps.outputs.apps) }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '18' | |
| cache: 'pnpm' | |
| - name: Install pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: latest | |
| - name: Install dependencies | |
| run: | | |
| # TODO: Install project dependencies | |
| echo "Installing dependencies for ${{ matrix.app }}" | |
| - name: Run E2E tests | |
| run: | | |
| # TODO: Run E2E tests on iOS | |
| echo "Running E2E tests for ${{ matrix.app }} on iOS" | |
| - name: Upload test results | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: e2e-results-ios-${{ matrix.app }} | |
| path: test-results/ | |
| retention-days: 7 | |
| e2e-summary: | |
| name: E2E Test Summary | |
| runs-on: ubuntu-latest | |
| needs: [e2e-android, e2e-ios] | |
| if: always() | |
| steps: | |
| - name: Check test results | |
| run: | | |
| # TODO: Aggregate and report test results | |
| echo "E2E test summary:" | |
| echo "Android tests: ${{ needs.e2e-android.result }}" | |
| echo "iOS tests: ${{ needs.e2e-ios.result }}" | |
| if [[ "${{ needs.e2e-android.result }}" == "failure" || "${{ needs.e2e-ios.result }}" == "failure" ]]; then | |
| echo "Some E2E tests failed" | |
| exit 1 | |
| else | |
| echo "All E2E tests passed" | |
| fi |