From 0e3a5377b1708aa9a7772e0eb490b1b7e647de0f Mon Sep 17 00:00:00 2001 From: floydkim Date: Wed, 18 Feb 2026 02:10:39 +0900 Subject: [PATCH 1/9] ci: add manual e2e workflow with Gradle and Pods cache --- .github/workflows/e2e-manual.yml | 123 +++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 .github/workflows/e2e-manual.yml diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml new file mode 100644 index 00000000..e3eb5040 --- /dev/null +++ b/.github/workflows/e2e-manual.yml @@ -0,0 +1,123 @@ +name: Manual E2E + +on: + workflow_dispatch: + inputs: + app: + description: Example app name (e.g. RN0840) + required: true + default: RN0840 + type: string + platform: + description: Platform to test + required: true + default: both + type: choice + options: + - both + - ios + - android + +jobs: + e2e-ios: + if: ${{ inputs.platform == 'ios' || inputs.platform == 'both' }} + runs-on: macos-latest + timeout-minutes: 90 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install root dependencies + run: npm ci + + - name: Install example app dependencies + run: npm ci + working-directory: Examples/${{ inputs.app }} + + - name: Cache CocoaPods + uses: actions/cache@v4 + with: + path: | + ~/.cocoapods + Examples/${{ inputs.app }}/ios/Pods + key: ${{ runner.os }}-pods-${{ inputs.app }}-${{ hashFiles(format('Examples/{0}/ios/Podfile', inputs.app), format('Examples/{0}/ios/Podfile.lock', inputs.app), format('Examples/{0}/Gemfile.lock', inputs.app)) }} + restore-keys: | + ${{ runner.os }}-pods-${{ inputs.app }}- + + - name: Install Maestro CLI + run: | + curl -Ls "https://get.maestro.mobile.dev" | bash + echo "$HOME/.maestro/bin" >> "$GITHUB_PATH" + + - name: Boot iOS simulator + id: boot-simulator + run: | + SIMULATOR_NAME="$(xcrun simctl list devices available | awk -F '[()]' '/iPhone/ {print $1; exit}' | xargs)" + if [ -z "$SIMULATOR_NAME" ]; then + echo "No available iPhone simulator found." + exit 1 + fi + xcrun simctl boot "$SIMULATOR_NAME" || true + xcrun simctl bootstatus "$SIMULATOR_NAME" -b + echo "simulator=$SIMULATOR_NAME" >> "$GITHUB_OUTPUT" + + - name: Run iOS E2E + run: | + npm run e2e -- \ + --app "${{ inputs.app }}" \ + --platform ios \ + --simulator "${{ steps.boot-simulator.outputs.simulator }}" + + e2e-android: + if: ${{ inputs.platform == 'android' || inputs.platform == 'both' }} + runs-on: macos-latest + timeout-minutes: 90 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: zulu + java-version: "17" + + - name: Setup Gradle cache + uses: gradle/actions/setup-gradle@v4 + + - name: Install root dependencies + run: npm ci + + - name: Install example app dependencies + run: npm ci + working-directory: Examples/${{ inputs.app }} + + - name: Install Maestro CLI + run: | + curl -Ls "https://get.maestro.mobile.dev" | bash + echo "$HOME/.maestro/bin" >> "$GITHUB_PATH" + + - name: Run Android E2E + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 36 + arch: x86_64 + profile: pixel_7 + script: | + npm run e2e -- \ + --app "${{ inputs.app }}" \ + --platform android From 542934f3804d15bbd979e04ccd64098fed6201eb Mon Sep 17 00:00:00 2001 From: floydkim Date: Wed, 18 Feb 2026 02:13:33 +0900 Subject: [PATCH 2/9] ci: temporarily enable push trigger for manual e2e workflow --- .github/workflows/e2e-manual.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml index e3eb5040..723159c1 100644 --- a/.github/workflows/e2e-manual.yml +++ b/.github/workflows/e2e-manual.yml @@ -1,6 +1,9 @@ name: Manual E2E on: + push: + branches: + - github-e2e-workflow workflow_dispatch: inputs: app: From 633bf726c813593706e6971c1950cd6589c74c3c Mon Sep 17 00:00:00 2001 From: floydkim Date: Wed, 18 Feb 2026 02:19:51 +0900 Subject: [PATCH 3/9] ci: replace npm ci with npm install in e2e workflow --- .github/workflows/e2e-manual.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml index 723159c1..206d5969 100644 --- a/.github/workflows/e2e-manual.yml +++ b/.github/workflows/e2e-manual.yml @@ -38,10 +38,10 @@ jobs: cache: npm - name: Install root dependencies - run: npm ci + run: npm i - name: Install example app dependencies - run: npm ci + run: npm i working-directory: Examples/${{ inputs.app }} - name: Cache CocoaPods @@ -103,10 +103,10 @@ jobs: uses: gradle/actions/setup-gradle@v4 - name: Install root dependencies - run: npm ci + run: npm i - name: Install example app dependencies - run: npm ci + run: npm i working-directory: Examples/${{ inputs.app }} - name: Install Maestro CLI From fc07bd3da2354e3a330e74b517f7ff5cb5c291c4 Mon Sep 17 00:00:00 2001 From: floydkim Date: Wed, 18 Feb 2026 02:27:49 +0900 Subject: [PATCH 4/9] ci: run Android e2e on ubuntu runner --- .github/workflows/e2e-manual.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml index 206d5969..d26a3ba2 100644 --- a/.github/workflows/e2e-manual.yml +++ b/.github/workflows/e2e-manual.yml @@ -80,7 +80,7 @@ jobs: e2e-android: if: ${{ inputs.platform == 'android' || inputs.platform == 'both' }} - runs-on: macos-latest + runs-on: ubuntu-latest timeout-minutes: 90 steps: From 98a0be8b6c3a0f6eca7bbba14f5603ba12ed6706 Mon Sep 17 00:00:00 2001 From: floydkim Date: Wed, 18 Feb 2026 02:29:06 +0900 Subject: [PATCH 5/9] ci: avoid blocking on simctl bootstatus in iOS e2e workflow --- .github/workflows/e2e-manual.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml index d26a3ba2..14dd2115 100644 --- a/.github/workflows/e2e-manual.yml +++ b/.github/workflows/e2e-manual.yml @@ -59,7 +59,7 @@ jobs: curl -Ls "https://get.maestro.mobile.dev" | bash echo "$HOME/.maestro/bin" >> "$GITHUB_PATH" - - name: Boot iOS simulator + - name: Select iOS simulator id: boot-simulator run: | SIMULATOR_NAME="$(xcrun simctl list devices available | awk -F '[()]' '/iPhone/ {print $1; exit}' | xargs)" @@ -68,7 +68,6 @@ jobs: exit 1 fi xcrun simctl boot "$SIMULATOR_NAME" || true - xcrun simctl bootstatus "$SIMULATOR_NAME" -b echo "simulator=$SIMULATOR_NAME" >> "$GITHUB_OUTPUT" - name: Run iOS E2E From 2fc96e1d05623be0de43f707dd46f27414f011a4 Mon Sep 17 00:00:00 2001 From: floydkim Date: Wed, 18 Feb 2026 02:55:59 +0900 Subject: [PATCH 6/9] ci: stabilize Android emulator boot on ubuntu runner --- .github/workflows/e2e-manual.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml index 14dd2115..d7ba96db 100644 --- a/.github/workflows/e2e-manual.yml +++ b/.github/workflows/e2e-manual.yml @@ -101,6 +101,12 @@ jobs: - name: Setup Gradle cache uses: gradle/actions/setup-gradle@v4 + - name: Enable KVM + 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 + - name: Install root dependencies run: npm i @@ -116,9 +122,10 @@ jobs: - name: Run Android E2E uses: reactivecircus/android-emulator-runner@v2 with: - api-level: 36 + api-level: 35 arch: x86_64 profile: pixel_7 + emulator-boot-timeout: 900 script: | npm run e2e -- \ --app "${{ inputs.app }}" \ From 0ef71fb898c77320bdde12aa8ff743680318e879 Mon Sep 17 00:00:00 2001 From: floydkim Date: Wed, 18 Feb 2026 03:04:14 +0900 Subject: [PATCH 7/9] ci: fix missing --app/--platform args in Android workflow step --- .github/workflows/e2e-manual.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml index d7ba96db..7225f58b 100644 --- a/.github/workflows/e2e-manual.yml +++ b/.github/workflows/e2e-manual.yml @@ -126,7 +126,4 @@ jobs: arch: x86_64 profile: pixel_7 emulator-boot-timeout: 900 - script: | - npm run e2e -- \ - --app "${{ inputs.app }}" \ - --platform android + script: npm run e2e -- --app "${{ inputs.app }}" --platform android From 6cd7bba95e8596e1d8531fe3b88a324b531b9092 Mon Sep 17 00:00:00 2001 From: floydkim Date: Wed, 18 Feb 2026 03:33:25 +0900 Subject: [PATCH 8/9] ci: add Bundler gem cache for iOS e2e job --- .github/workflows/e2e-manual.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml index 7225f58b..29a53212 100644 --- a/.github/workflows/e2e-manual.yml +++ b/.github/workflows/e2e-manual.yml @@ -37,6 +37,14 @@ jobs: node-version: 22 cache: npm + - name: Setup Ruby (cache gems) + uses: ruby/setup-ruby@v1 + env: + BUNDLE_GEMFILE: Examples/${{ inputs.app }}/Gemfile + with: + ruby-version: "3.2" + bundler-cache: true + - name: Install root dependencies run: npm i From e9125cbcdb8199ff7e0c4e47e29478f866d18b85 Mon Sep 17 00:00:00 2001 From: floydkim Date: Wed, 18 Feb 2026 14:19:50 +0900 Subject: [PATCH 9/9] ci: rename workflow to E2E and remove temporary push trigger --- .github/workflows/e2e-manual.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/e2e-manual.yml b/.github/workflows/e2e-manual.yml index 29a53212..51ebee83 100644 --- a/.github/workflows/e2e-manual.yml +++ b/.github/workflows/e2e-manual.yml @@ -1,9 +1,6 @@ -name: Manual E2E +name: E2E on: - push: - branches: - - github-e2e-workflow workflow_dispatch: inputs: app: