mirror of
https://github.com/selfxyz/self.git
synced 2026-01-10 15:18:18 -05:00
* update CI
* bump iOS version
* update readme
* update mobile-deploy ci
* bump version iOS
* update workflow to use workload identity federation (#933)
* update workflow to use workload identity federation
* add token permissions
* correct provider name
* chore: incrementing android build version for version 2.6.4 [github action]
---------
Co-authored-by: Self GitHub Actions <action@github.com>
* update ci
* update ci
* update ci
* update ci
* update ci
* fix ci
* fix ci
* fix ci
* remove fastlane use for android
* bump iOS build version
* update CI python script
* iterate on CI
* iterate on CI
* iterate on CI
* Dev (#941)
* SDK Go version (#920)
* feat: helper functions and constant for go-sdk
* feat: formatRevealedDataPacked in go
* chore: refactor
* feat: define struct for selfBackendVerifier
* feat: verify function for selfBackendVerifier
* feat(wip): custom hasher
* feat: SelfVerifierBacked in go
* test(wip): scope and userContextHash is failing
* test: zk proof verified
* fix: MockConfigStore getactionId function
* chore: refactor
* chore: remove abi duplicate files
* chore: move configStore to utils
* chore: modified VcAndDiscloseProof struct
* chore: more review changes
* feat: impl DefaultConfig and InMemoryConfigStore
* chore: refactor and export functions
* fix: module import and README
* chore: remove example folder
* chore: remove pointers from VerificationConfig
* chore: coderabbit review fixes
* chore: more coderabbit review fix
* chore: add license
* fix: convert attestationIdd to int
* chore: remove duplicate code
---------
Co-authored-by: ayman <aymanshaik1015@gmail.com>
* Moving proving Utils to common (#935)
* remove react dom
* moves proving utils to the common
* need to use rn components
* fix imports
* add proving-utils and dedeuplicate entry configs for esm and cjs.
* must wrap in text component
* fix metro bundling
* fix mock import
* fix builds and tests
* please save me
* solution?
* fix test
* Move proving inputs to the common package (#937)
* create ofactTree type to share
* move proving inputs from app to register inputs in common
* missed reexport
* ok
* add some validations as suggested by our ai overlords
* Fix mock passport flow (#942)
* fix dev screens
* add hint
* rename
* fix path
* fix mobile-ci path
* fix: extractMRZ (#938)
* fix: extractMRZ
* yarn nice && yarn types
* fix test: remove unused
* fix mobile ci
* add script
---------
Co-authored-by: Justin Hernandez <transphorm@gmail.com>
* Move Proving attest and cose (#950)
* moved attest and cose utils to common
with cursor converted tests in common to use vitest and converted coseVerify.test to vitest after moving from app to common
what does cryptoLoader do?
* moved away
* get buff
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* SELF-253 feat: add user email feedback (#889)
* feat: add sentry feedback
* add sentry feedback to web
* feat: add custom feedback modal & fix freeze on IOS
* yarn nice
* update lock
* feat: show feedback widget on NFC scan issues (#948)
* feat: show feedback widget on NFC scan issues
* fix ref
* clean up
* fix report issue screen
* abstract send user feedback email logic
* fixes
* change text to Report Issue
* sanitize email and track event messge
* remove unnecessary sanitization
* add sanitize error message tests
* fix tests
* save wip. almost done
* fix screen test
* fix screen test
* remove non working test
---------
Co-authored-by: Justin Hernandez <transphorm@gmail.com>
Co-authored-by: Justin Hernandez <justin.hernandez@self.xyz>
* chore: centralize license header checks (#952)
* chore: centralize license header scripts
* chore: run license header checks from root
* add header to other files
* add header to bundle
* add migration script and update check license headers
* convert license to mobile sdk
* migrate license headers
* remove headers from common; convert remaining
* fix headers
* add license header checks
* update unsupported passport screen (#953)
* update unsupported passport screen
* yarn nice
---------
Co-authored-by: Vishalkulkarni45 <109329073+Vishalkulkarni45@users.noreply.github.com>
Co-authored-by: ayman <aymanshaik1015@gmail.com>
Co-authored-by: Aaron DeRuvo <aaron.deruvo@clabs.co>
Co-authored-by: Justin Hernandez <justin.hernandez@self.xyz>
Co-authored-by: Seshanth.S🐺 <35675963+seshanthS@users.noreply.github.com>
Co-authored-by: Justin Hernandez <transphorm@gmail.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* bump version
* bump yarn.lock
* update ci (#966)
* chore: Manually bump and release v2.6.4 (#961)
* update lock files
* bump and build android
* update build artifacts
* show generate mock document button
* update lock
* fix formatting and update failing e2e test
* revert podfile
* fixes
* fix cold start of the app with deeplink
* update ci
* update ci
* Sync MARKETING_VERSION to iOS project files after version bump
* chore: incrementing android build version for version 2.6.4 [github action] (#976)
Co-authored-by: remicolin <98749896+remicolin@users.noreply.github.com>
* chore: add build dependencies step for iOS and Android in mobile deploy workflow
* chore: enhance mobile deploy workflow by adding CMake installation step
* bump android build version
* chore: incrementing android build version for version 2.6.4 [github action] (#985)
Co-authored-by: remicolin <98749896+remicolin@users.noreply.github.com>
* chore: configure Metro bundler for production compatibility in mobile deploy workflow
* chore: incrementing android build version for version 2.6.4 [github action] (#987)
Co-authored-by: remicolin <98749896+remicolin@users.noreply.github.com>
* Revert "chore: configure Metro bundler for production compatibility in mobile deploy workflow"
This reverts commit 60fc1f2580.
* reduce max old space size in mobile-deploy ci
* fix android french id card (#957)
* fix android french id card
* fix common ci cache
* feat: log apdu (#988)
---------
Co-authored-by: Justin Hernandez <transphorm@gmail.com>
Co-authored-by: Seshanth.S🐺 <35675963+seshanthS@users.noreply.github.com>
* unblock ci
* fix merge
* merge fixes
* fix tests
* make ci happy
---------
Co-authored-by: turnoffthiscomputer <colin.remi07@gmail.com>
Co-authored-by: pputman-clabs <99900942+pputman-clabs@users.noreply.github.com>
Co-authored-by: Self GitHub Actions <action@github.com>
Co-authored-by: turnoffthiscomputer <98749896+remicolin@users.noreply.github.com>
Co-authored-by: Vishalkulkarni45 <109329073+Vishalkulkarni45@users.noreply.github.com>
Co-authored-by: ayman <aymanshaik1015@gmail.com>
Co-authored-by: Aaron DeRuvo <aaron.deruvo@clabs.co>
Co-authored-by: Seshanth.S🐺 <35675963+seshanthS@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
413 lines
17 KiB
YAML
413 lines
17 KiB
YAML
name: Mobile E2E
|
|
|
|
env:
|
|
# Build environment versions
|
|
JAVA_VERSION: 17
|
|
ANDROID_API_LEVEL: 33
|
|
ANDROID_NDK_VERSION: 27.0.11718014
|
|
XCODE_VERSION: 16.4
|
|
# Cache versions
|
|
GH_CACHE_VERSION: v1 # Global cache version
|
|
GH_GEMS_CACHE_VERSION: v1 # Ruby gems cache version
|
|
# Performance optimizations
|
|
GRADLE_OPTS: -Dorg.gradle.workers.max=4 -Dorg.gradle.parallel=true -Dorg.gradle.caching=true
|
|
CI: true
|
|
# Disable Maestro analytics in CI
|
|
MAESTRO_CLI_NO_ANALYTICS: true
|
|
MAESTRO_VERSION: 1.41.0
|
|
|
|
on:
|
|
pull_request:
|
|
branches:
|
|
- dev
|
|
- staging
|
|
- main
|
|
paths:
|
|
- "app/**"
|
|
- ".github/workflows/mobile-e2e.yml"
|
|
|
|
jobs:
|
|
e2e-android:
|
|
if: false # Temporarily disable Android E2E until emulator disk issue resolved
|
|
concurrency:
|
|
group: ${{ github.workflow }}-android-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
timeout-minutes: 45
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Read and sanitize Node.js version
|
|
shell: bash
|
|
run: |
|
|
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
|
|
echo "❌ .nvmrc is missing or empty"; exit 1;
|
|
fi
|
|
VERSION="$(tr -d '\r\n' < .nvmrc)"
|
|
VERSION="${VERSION#v}"
|
|
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
|
|
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
|
|
fi
|
|
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
|
|
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
- run: corepack enable
|
|
- run: corepack prepare yarn@4.6.0 --activate
|
|
- name: Cache Yarn dependencies
|
|
uses: ./.github/actions/cache-yarn
|
|
with:
|
|
cache-version: ${{ env.GH_CACHE_VERSION }}-node-${{ env.NODE_VERSION_SANITIZED }}
|
|
- run: yarn install --immutable --silent
|
|
- name: Validate Maestro test file
|
|
run: |
|
|
[ -f app/tests/e2e/launch.android.flow.yaml ] || { echo "❌ Android E2E test file missing"; exit 1; }
|
|
- name: Cache Maestro
|
|
id: cache-maestro
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.maestro
|
|
key: ${{ runner.os }}-maestro-${{ env.MAESTRO_VERSION }}
|
|
- name: Install Maestro
|
|
if: steps.cache-maestro.outputs.cache-hit != 'true'
|
|
run: curl -Ls "https://get.maestro.mobile.dev" | bash
|
|
- name: Add Maestro to path
|
|
run: echo "$HOME/.maestro/bin" >> "$GITHUB_PATH"
|
|
- name: Setup Java environment
|
|
uses: actions/setup-java@v4
|
|
with:
|
|
distribution: "temurin"
|
|
java-version: ${{ env.JAVA_VERSION }}
|
|
- name: Cache Gradle packages
|
|
uses: ./.github/actions/cache-gradle
|
|
- name: Setup Android SDK
|
|
uses: android-actions/setup-android@v3
|
|
with:
|
|
accept-android-sdk-licenses: true
|
|
- name: Install NDK
|
|
run: sdkmanager "ndk;${{ env.ANDROID_NDK_VERSION }}"
|
|
- name: Build dependencies (outside emulator)
|
|
run: |
|
|
echo "Building dependencies..."
|
|
yarn workspace @selfxyz/mobile-app run build:deps --silent || { echo "❌ Dependency build failed"; exit 1; }
|
|
echo "✅ Dependencies built successfully"
|
|
- name: Build Android APK
|
|
run: |
|
|
echo "Building Android APK..."
|
|
chmod +x app/android/gradlew
|
|
(cd app/android && ./gradlew assembleDebug --quiet --parallel --build-cache --no-configuration-cache) || { echo "❌ Android build failed"; exit 1; }
|
|
echo "✅ Android build succeeded"
|
|
- name: Install and Test on Android
|
|
uses: reactivecircus/android-emulator-runner@v2
|
|
with:
|
|
api-level: ${{ env.ANDROID_API_LEVEL }}
|
|
arch: x86_64
|
|
target: google_apis
|
|
force-avd-creation: false
|
|
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -camera-front none -memory 8192 -cores 4 -accel on
|
|
disable-animations: true
|
|
script: |
|
|
echo "Installing app on emulator..."
|
|
APK_PATH="app/android/app/build/outputs/apk/debug/app-debug.apk"
|
|
[ -f "$APK_PATH" ] || { echo "❌ APK not found at $APK_PATH"; exit 1; }
|
|
adb install -r "$APK_PATH" || { echo "❌ App installation failed"; exit 1; }
|
|
echo "✅ App installed successfully"
|
|
|
|
echo "⏰ Giving the emulator a moment to settle..."
|
|
sleep 5
|
|
|
|
echo "🎭 Running Maestro tests..."
|
|
export MAESTRO_DRIVER_STARTUP_TIMEOUT=180000
|
|
maestro test app/tests/e2e/launch.android.flow.yaml --format junit --output app/maestro-results.xml
|
|
- name: Upload test results
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: maestro-results-android
|
|
path: app/maestro-results.xml
|
|
if-no-files-found: warn
|
|
|
|
e2e-ios:
|
|
timeout-minutes: 45
|
|
runs-on: macos-latest-large
|
|
concurrency:
|
|
group: ${{ github.workflow }}-ios-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
env:
|
|
# iOS project configuration - hardcoded for E2E testing stability
|
|
# Note: During migration, project name is "Self" but scheme is still "OpenPassport"
|
|
# mobile-deploy.yml uses secrets for production deployment
|
|
IOS_PROJECT_NAME: "Self"
|
|
IOS_PROJECT_SCHEME: "OpenPassport"
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Read and sanitize Node.js version
|
|
shell: bash
|
|
run: |
|
|
if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then
|
|
echo "❌ .nvmrc is missing or empty"; exit 1;
|
|
fi
|
|
VERSION="$(tr -d '\r\n' < .nvmrc)"
|
|
VERSION="${VERSION#v}"
|
|
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then
|
|
echo "Invalid .nvmrc content: '$VERSION'"; exit 1;
|
|
fi
|
|
echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV"
|
|
echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV"
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
- run: corepack enable
|
|
- run: corepack prepare yarn@4.6.0 --activate
|
|
- name: Cache Yarn dependencies
|
|
uses: ./.github/actions/cache-yarn
|
|
with:
|
|
cache-version: ${{ env.GH_CACHE_VERSION }}-node-${{ env.NODE_VERSION_SANITIZED }}
|
|
- run: yarn install --immutable --silent
|
|
- name: Validate Maestro test file
|
|
run: |
|
|
[ -f app/tests/e2e/launch.ios.flow.yaml ] || { echo "❌ iOS E2E test file missing"; exit 1; }
|
|
- name: Cache Maestro
|
|
id: cache-maestro
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.maestro
|
|
key: ${{ runner.os }}-maestro-${{ env.MAESTRO_VERSION }}
|
|
- name: Install Maestro
|
|
if: steps.cache-maestro.outputs.cache-hit != 'true'
|
|
run: curl -Ls "https://get.maestro.mobile.dev" | bash
|
|
- name: Add Maestro to path
|
|
run: echo "$HOME/.maestro/bin" >> "$GITHUB_PATH"
|
|
- name: Set up Xcode
|
|
uses: maxim-lobanov/setup-xcode@v1
|
|
with:
|
|
xcode-version: ${{ env.XCODE_VERSION }}
|
|
- name: Configure Xcode path
|
|
run: |
|
|
echo "🔧 Configuring Xcode path to fix iOS SDK issues..."
|
|
# Fix for macOS 15 runner iOS SDK issues
|
|
# See: https://github.com/actions/runner-images/issues/12758
|
|
sudo xcode-select --switch /Applications/Xcode_${{ env.XCODE_VERSION }}.app
|
|
echo "✅ Xcode path configured"
|
|
|
|
# Verify Xcode setup
|
|
echo "Xcode version:"
|
|
xcodebuild -version
|
|
echo "Xcode path:"
|
|
xcode-select -p
|
|
- name: Set up Ruby
|
|
uses: ruby/setup-ruby@v1
|
|
with:
|
|
ruby-version: "3.3"
|
|
bundler-cache: true
|
|
working-directory: app
|
|
- name: Cache Pods
|
|
uses: ./.github/actions/cache-pods
|
|
with:
|
|
path: |
|
|
app/ios/Pods
|
|
~/Library/Caches/CocoaPods
|
|
lock-file: app/ios/Podfile.lock
|
|
- name: Cache DerivedData
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: app/ios/build
|
|
key: ${{ runner.os }}-derived-data-${{ env.XCODE_VERSION }}-${{ hashFiles('app/ios/Podfile.lock', 'app/ios/OpenPassport.xcworkspace/contents.xcworkspacedata', 'app/ios/Self.xcworkspace/contents.xcworkspacedata') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-derived-data-${{ env.XCODE_VERSION }}-${{ hashFiles('app/ios/Podfile.lock') }}-
|
|
${{ runner.os }}-derived-data-${{ env.XCODE_VERSION }}-
|
|
- name: Verify iOS Runtime
|
|
run: |
|
|
echo "📱 Verifying iOS Runtime availability..."
|
|
echo "Available iOS runtimes:"
|
|
xcrun simctl list runtimes | grep iOS
|
|
- name: Build dependencies (outside main flow)
|
|
run: |
|
|
echo "Building dependencies..."
|
|
yarn workspace @selfxyz/mobile-app run build:deps --silent || { echo "❌ Dependency build failed"; exit 1; }
|
|
echo "✅ Dependencies built successfully"
|
|
- name: Install iOS dependencies
|
|
run: |
|
|
echo "Installing iOS dependencies..."
|
|
cd app/ios
|
|
echo "📦 Installing pods via centralized script…"
|
|
BUNDLE_GEMFILE=../Gemfile bundle exec bash scripts/pod-install-with-cache-fix.sh || { echo "❌ Pod install failed"; exit 1; }
|
|
- name: Setup iOS Simulator
|
|
run: |
|
|
echo "Setting up iOS Simulator..."
|
|
|
|
# First, check what simulators are actually available
|
|
echo "Available simulators:"
|
|
xcrun simctl list devices available || {
|
|
echo "❌ Failed to list available devices"
|
|
echo "Trying to list all devices:"
|
|
xcrun simctl list devices || {
|
|
echo "❌ Failed to list any devices"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
# Find iPhone SE (3rd generation) simulator
|
|
echo "Finding iPhone SE (3rd generation) simulator..."
|
|
AVAILABLE_SIMULATOR=$(xcrun simctl list devices available | grep "iPhone SE (3rd generation)" | head -1 | sed -E 's/.*\(([A-F0-9-]+)\).*/\1/')
|
|
|
|
if [ -z "$AVAILABLE_SIMULATOR" ]; then
|
|
echo "iPhone SE (3rd generation) not found, trying any iPhone SE..."
|
|
AVAILABLE_SIMULATOR=$(xcrun simctl list devices available | grep "iPhone SE" | head -1 | sed -E 's/.*\(([A-F0-9-]+)\).*/\1/')
|
|
fi
|
|
|
|
if [ -z "$AVAILABLE_SIMULATOR" ]; then
|
|
echo "No iPhone SE found, trying any iPhone..."
|
|
AVAILABLE_SIMULATOR=$(xcrun simctl list devices available | grep "iPhone" | head -1 | sed -E 's/.*\(([A-F0-9-]+)\).*/\1/')
|
|
fi
|
|
|
|
if [ -z "$AVAILABLE_SIMULATOR" ]; then
|
|
echo "❌ No available iPhone simulator found"
|
|
echo "Creating a new iPhone SE (3rd generation) simulator..."
|
|
# Create a new iPhone SE (3rd generation) simulator
|
|
xcrun simctl create "iPhone SE (3rd generation)" "iPhone SE (3rd generation)" || {
|
|
echo "❌ Failed to create iPhone SE (3rd generation) simulator"
|
|
echo "Trying to create any iPhone SE simulator..."
|
|
xcrun simctl create "iPhone SE" "iPhone SE" || {
|
|
echo "❌ Failed to create simulator"
|
|
exit 1
|
|
}
|
|
}
|
|
AVAILABLE_SIMULATOR=$(xcrun simctl list devices | grep "iPhone SE" | sed -E 's/.*\(([A-F0-9-]+)\).*/\1/')
|
|
fi
|
|
|
|
echo "Using simulator: $AVAILABLE_SIMULATOR"
|
|
|
|
# Get simulator name for display
|
|
SIMULATOR_NAME=$(xcrun simctl list devices | grep "$AVAILABLE_SIMULATOR" | sed -E 's/^[[:space:]]*([^(]+).*/\1/' | xargs)
|
|
echo "Simulator name: $SIMULATOR_NAME"
|
|
|
|
# Boot simulator and wait for it to be ready
|
|
echo "Booting simulator..."
|
|
xcrun simctl boot "$AVAILABLE_SIMULATOR" || {
|
|
echo "❌ Failed to boot simulator"
|
|
exit 1
|
|
}
|
|
|
|
echo "Waiting for simulator to be ready..."
|
|
xcrun simctl bootstatus "$AVAILABLE_SIMULATOR" -b
|
|
|
|
# Wait for simulator to be fully ready
|
|
echo "Waiting for simulator to be fully ready..."
|
|
sleep 15
|
|
|
|
echo "Simulator status:"
|
|
xcrun simctl list devices | grep "$AVAILABLE_SIMULATOR"
|
|
|
|
# Store simulator ID for later use
|
|
echo "IOS_SIMULATOR_ID=$AVAILABLE_SIMULATOR" >> $GITHUB_ENV
|
|
echo "IOS_SIMULATOR_NAME=$SIMULATOR_NAME" >> $GITHUB_ENV
|
|
- name: Resolve iOS workspace
|
|
run: |
|
|
WORKSPACE_OPEN="app/ios/OpenPassport.xcworkspace"
|
|
WORKSPACE_SELF="app/ios/Self.xcworkspace"
|
|
|
|
if xcodebuild -list -workspace "$WORKSPACE_OPEN" 2>/dev/null | grep -q "OpenPassport"; then
|
|
WORKSPACE_PATH="$WORKSPACE_OPEN"
|
|
else
|
|
WORKSPACE_PATH="$WORKSPACE_SELF"
|
|
fi
|
|
|
|
echo "WORKSPACE_PATH=$WORKSPACE_PATH" >> "$GITHUB_ENV"
|
|
echo "Resolved workspace: $WORKSPACE_PATH"
|
|
- name: Build iOS App
|
|
run: |
|
|
echo "Building iOS app..."
|
|
echo "Project: ${{ env.IOS_PROJECT_NAME }}, Scheme: ${{ env.IOS_PROJECT_SCHEME }}"
|
|
|
|
# Verify workspace exists before building
|
|
if [ -z "$WORKSPACE_PATH" ]; then
|
|
echo "❌ WORKSPACE_PATH is not set"
|
|
exit 1
|
|
fi
|
|
if [ ! -d "$WORKSPACE_PATH" ]; then
|
|
echo "❌ Workspace not found at: $WORKSPACE_PATH"
|
|
echo "Available workspaces:"
|
|
find app/ios -name "*.xcworkspace" -type d
|
|
exit 1
|
|
fi
|
|
|
|
# Verify scheme exists by listing available schemes
|
|
echo "Verifying scheme availability..."
|
|
AVAILABLE_SCHEMES=$(xcodebuild -list -workspace "$WORKSPACE_PATH" 2>/dev/null | grep -A 200 "Schemes:" | grep -v "Schemes:" | xargs)
|
|
echo "Available schemes (first 20): $(echo $AVAILABLE_SCHEMES | cut -d' ' -f1-20)..."
|
|
|
|
if [[ ! "$AVAILABLE_SCHEMES" =~ ${{ env.IOS_PROJECT_SCHEME }} ]]; then
|
|
echo "❌ Scheme '${{ env.IOS_PROJECT_SCHEME }}' not found"
|
|
echo "Full scheme list:"
|
|
xcodebuild -list -workspace "$WORKSPACE_PATH" 2>/dev/null | grep -A 200 "Schemes:" | grep -v "Schemes:" | head -50
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ Using workspace: $WORKSPACE_PATH"
|
|
echo "✅ Using scheme: ${{ env.IOS_PROJECT_SCHEME }}"
|
|
|
|
# Use cached derived data and enable parallel builds for faster compilation
|
|
# Additional flags disable indexing, restrict architecture, and use whole-module Swift compilation
|
|
# Use the simulator that was set up earlier in the workflow
|
|
FORCE_BUNDLING=1 RCT_NO_LAUNCH_PACKAGER=1 \
|
|
xcodebuild -workspace "$WORKSPACE_PATH" -scheme ${{ env.IOS_PROJECT_SCHEME }} -configuration Debug -destination "id=${{ env.IOS_SIMULATOR_ID }}" -derivedDataPath app/ios/build -jobs "$(sysctl -n hw.ncpu)" -parallelizeTargets -quiet COMPILER_INDEX_STORE_ENABLE=NO ONLY_ACTIVE_ARCH=YES SWIFT_COMPILATION_MODE=wholemodule || { echo "❌ iOS build failed"; exit 1; }
|
|
echo "✅ iOS build succeeded"
|
|
- name: Install and Test on iOS
|
|
run: |
|
|
echo "Installing app on simulator..."
|
|
APP_PATH=$(find app/ios/build/Build/Products/Debug-iphonesimulator -name "*.app" | head -1)
|
|
[ -z "$APP_PATH" ] && { echo "❌ Could not find built iOS app"; exit 1; }
|
|
echo "Found app at: $APP_PATH"
|
|
|
|
echo "🔍 Determining app bundle ID from built app..."
|
|
IOS_BUNDLE_ID=$(/usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" "$APP_PATH/Info.plist")
|
|
[ -z "$IOS_BUNDLE_ID" ] && { echo "❌ Could not determine bundle ID from $APP_PATH/Info.plist"; exit 1; }
|
|
echo "✅ App Bundle ID: $IOS_BUNDLE_ID"
|
|
|
|
# Use the dynamic simulator ID
|
|
SIMULATOR_ID="${IOS_SIMULATOR_ID:-iPhone SE (3rd generation)}"
|
|
echo "Installing on simulator: $SIMULATOR_ID"
|
|
|
|
echo "Removing any existing app installation..."
|
|
xcrun simctl uninstall "$SIMULATOR_ID" "$IOS_BUNDLE_ID" 2>/dev/null || true
|
|
|
|
echo "Installing app..."
|
|
xcrun simctl install "$SIMULATOR_ID" "$APP_PATH"
|
|
if [ $? -ne 0 ]; then
|
|
echo "❌ iOS app installation failed"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Verifying app installation..."
|
|
if xcrun simctl get_app_container "$SIMULATOR_ID" "$IOS_BUNDLE_ID" app >/dev/null 2>&1; then
|
|
echo "✅ App successfully installed"
|
|
else
|
|
echo "❌ App installation verification failed"
|
|
exit 1
|
|
fi
|
|
|
|
echo "🚀 Testing app launch capability..."
|
|
xcrun simctl launch "$SIMULATOR_ID" "$IOS_BUNDLE_ID" || {
|
|
echo "⚠️ Direct app launch test failed - this might be expected."
|
|
}
|
|
|
|
echo "⏰ Checking simulator readiness..."
|
|
sleep 10
|
|
# Probe container as readiness check instead of listapps
|
|
xcrun simctl get_app_container "$SIMULATOR_ID" "$IOS_BUNDLE_ID" app >/dev/null 2>&1 || sleep 5
|
|
|
|
echo "Running Maestro tests..."
|
|
echo "Starting test execution..."
|
|
maestro test app/tests/e2e/launch.ios.flow.yaml --format junit --output app/maestro-results.xml || {
|
|
echo "Maestro test failed, but continuing to upload results..."
|
|
exit 1
|
|
}
|
|
- name: Upload test results
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: maestro-results-ios
|
|
path: app/maestro-results.xml
|
|
if-no-files-found: warn
|