chore: enhance mobile E2E workflow for iOS simulator verification (#1532)

- Added checks for simctl availability and ensured necessary simulator directories exist.
- Improved app installation verification with graceful error handling and fallback checks.
- Enhanced Maestro test execution with detailed output handling and cleanup error suppression.
- Verified the existence of the Maestro test file before execution to prevent failures.
This commit is contained in:
Javier Cortejoso
2025-12-26 15:36:32 +01:00
committed by GitHub
parent 6172497abf
commit 09e5ea1bf7

View File

@@ -386,7 +386,19 @@ jobs:
- name: Verify iOS Runtime
run: |
echo "📱 Verifying iOS Runtime availability..."
echo "Available iOS runtimes:"
# Check simctl availability (simctl without args returns non-zero, so check if tool exists)
SIMCTL_PATH=$(xcrun -f simctl 2>/dev/null || echo "")
if [ -z "$SIMCTL_PATH" ] || [ ! -f "$SIMCTL_PATH" ]; then
echo "❌ simctl binary not found"
exit 1
fi
# Ensure simulator directories exist (required for Namespace runners)
mkdir -p "$HOME/Library/Developer/CoreSimulator/Devices"
mkdir -p "$HOME/Library/Developer/CoreSimulator/Caches"
echo "📱 Available iOS runtimes:"
xcrun simctl list runtimes | grep iOS
- name: Build dependencies (outside main flow)
run: |
@@ -409,6 +421,9 @@ jobs:
run: |
echo "Setting up iOS Simulator..."
# Ensure simulator directories exist
mkdir -p "$HOME/Library/Developer/CoreSimulator/Devices"
# First, check what simulators are actually available
echo "Available simulators:"
xcrun simctl list devices available || {
@@ -553,12 +568,16 @@ jobs:
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"
# get_app_container may fail with NSPOSIXErrorDomain if app isn't ready yet - handle gracefully
APP_CONTAINER_OUTPUT=$(xcrun simctl get_app_container "$SIMULATOR_ID" "$IOS_BUNDLE_ID" app 2>&1) || APP_CONTAINER_EXIT=$?
if [ -z "${APP_CONTAINER_EXIT:-}" ] && [ -n "$APP_CONTAINER_OUTPUT" ]; then
echo "✅ App successfully installed at: $APP_CONTAINER_OUTPUT"
else
echo " App installation verification failed"
exit 1
echo "⚠️ App installation verification returned exit code ${APP_CONTAINER_EXIT:-unknown} (may be expected)"
# Check if app appears in installed apps list as fallback
xcrun simctl listapps "$SIMULATOR_ID" 2>/dev/null | grep -i "$IOS_BUNDLE_ID" || echo "App not found in installed apps list"
fi
unset APP_CONTAINER_OUTPUT APP_CONTAINER_EXIT
echo "🚀 Testing app launch capability..."
xcrun simctl launch "$SIMULATOR_ID" "$IOS_BUNDLE_ID" || {
@@ -567,15 +586,46 @@ jobs:
echo "⏰ Checking simulator readiness..."
sleep 10
# Probe container as readiness check instead of listapps
# Final readiness check (suppress errors to avoid annotations)
xcrun simctl get_app_container "$SIMULATOR_ID" "$IOS_BUNDLE_ID" app >/dev/null 2>&1 || sleep 5
echo "Running Maestro tests..."
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..."
# Verify Maestro test file exists
if [ ! -f "app/tests/e2e/launch.ios.flow.yaml" ]; then
echo "❌ Maestro test file not found: app/tests/e2e/launch.ios.flow.yaml"
exit 1
}
fi
# Run Maestro with error handling for cleanup issues
# Note: Maestro may show NSPOSIXErrorDomain code=3 errors during cleanup when
# terminating the test runner app that's already terminated. This is harmless.
MAESTRO_OUTPUT=$(maestro test app/tests/e2e/launch.ios.flow.yaml --format junit --output app/maestro-results.xml 2>&1)
MAESTRO_EXIT_CODE=$?
# Check if tests actually passed (ignore cleanup errors)
if echo "$MAESTRO_OUTPUT" | grep -q "Flow Passed"; then
echo "✅ Maestro tests passed"
# Suppress harmless cleanup errors (NSPOSIXErrorDomain code=3)
if [ $MAESTRO_EXIT_CODE -ne 0 ] && echo "$MAESTRO_OUTPUT" | grep -q "NSPOSIXErrorDomain.*code=3.*terminate"; then
echo "⚠️ Maestro cleanup warning (harmless): Test runner termination error"
elif [ $MAESTRO_EXIT_CODE -ne 0 ]; then
echo "❌ Maestro test failed with exit code: $MAESTRO_EXIT_CODE"
exit 1
fi
elif echo "$MAESTRO_OUTPUT" | grep -q "Flow Failed"; then
echo "❌ Maestro tests failed"
exit 1
elif [ $MAESTRO_EXIT_CODE -ne 0 ]; then
# Check results file if exit code is non-zero
if [ -f "app/maestro-results.xml" ] && ! grep -q "<failure" app/maestro-results.xml; then
echo "✅ Tests passed (cleanup error caused non-zero exit)"
else
echo "❌ Maestro test failed"
exit 1
fi
fi
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4