From 117d31594440e8cf31b52412fc981feb5f35c848 Mon Sep 17 00:00:00 2001 From: "Vincent (Wen Yu) Ge" <29069505+gewenyu99@users.noreply.github.com> Date: Thu, 18 Jun 2026 12:44:13 -0400 Subject: [PATCH 1/2] ci: route Expo react-native jobs to a dedicated expo runner Expo apps fail in CI because the GitHub-hosted runners don't ship the Expo environment. Mirror the swift -> macos-latest routing and send react-native/expo apps to a self-hosted runner labeled `expo`. Generated-By: PostHog Code Task-Id: 625c99d1-c95d-4741-a75c-88a1e64f4462 --- .github/workflows/wizard-ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/wizard-ci.yml b/.github/workflows/wizard-ci.yml index aaf76e4f..7cdb6c1b 100644 --- a/.github/workflows/wizard-ci.yml +++ b/.github/workflows/wizard-ci.yml @@ -456,7 +456,11 @@ jobs: wizard-ci: needs: [discover, notify-start, notify-pr-start, setup-deps] if: always() && needs.discover.result == 'success' - runs-on: ${{ contains(matrix.app, 'swift/') && 'macos-latest' || 'ubuntu-latest' }} + # Swift apps need macOS (Xcode); Expo react-native apps need a runner with + # the Expo environment pre-installed (the GitHub-hosted images don't ship it), + # so they route to a dedicated self-hosted runner labeled `expo`. Everything + # else runs on the standard ubuntu image. + runs-on: ${{ contains(matrix.app, 'swift/') && 'macos-latest' || contains(matrix.app, 'react-native/expo') && fromJson('["self-hosted", "expo"]') || 'ubuntu-latest' }} timeout-minutes: 60 permissions: contents: read From e9b5a953cde042807895aa2f716cda9326766ad5 Mon Sep 17 00:00:00 2001 From: "Vincent (Wen Yu) Ge" <29069505+gewenyu99@users.noreply.github.com> Date: Thu, 18 Jun 2026 12:49:06 -0400 Subject: [PATCH 2/2] ci: install Expo app deps in-app for Expo jobs instead of a special runner Each matrix entry runs on its own fresh runner, and the Expo apps live outside the pnpm workspace, so their dependencies (including the local Expo CLI the wizard shells out to) are never installed. Rather than route to a dedicated runner, add a conditional `npm ci` step gated to react-native/expo jobs so the Expo environment is present on the standard ubuntu runner. Reverts the earlier runs-on routing. Generated-By: PostHog Code Task-Id: 625c99d1-c95d-4741-a75c-88a1e64f4462 --- .github/workflows/wizard-ci.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/wizard-ci.yml b/.github/workflows/wizard-ci.yml index 7cdb6c1b..39f92688 100644 --- a/.github/workflows/wizard-ci.yml +++ b/.github/workflows/wizard-ci.yml @@ -456,11 +456,7 @@ jobs: wizard-ci: needs: [discover, notify-start, notify-pr-start, setup-deps] if: always() && needs.discover.result == 'success' - # Swift apps need macOS (Xcode); Expo react-native apps need a runner with - # the Expo environment pre-installed (the GitHub-hosted images don't ship it), - # so they route to a dedicated self-hosted runner labeled `expo`. Everything - # else runs on the standard ubuntu image. - runs-on: ${{ contains(matrix.app, 'swift/') && 'macos-latest' || contains(matrix.app, 'react-native/expo') && fromJson('["self-hosted", "expo"]') || 'ubuntu-latest' }} + runs-on: ${{ contains(matrix.app, 'swift/') && 'macos-latest' || 'ubuntu-latest' }} timeout-minutes: 60 permissions: contents: read @@ -503,6 +499,15 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + # Expo react-native apps live outside the pnpm workspace, so the root + # install above never installs their dependencies — including the local + # Expo CLI the wizard shells out to. Install them in-app for just the + # Expo matrix jobs so the Expo environment is available on ubuntu. + - name: Install Expo app dependencies + if: contains(matrix.app, 'react-native/expo') + run: npm ci + working-directory: apps/${{ matrix.app }} + - name: Install GitHub CLI run: | if command -v gh > /dev/null 2>&1; then