Skip to content

feat: add maestro test on CI/CD #28

feat: add maestro test on CI/CD

feat: add maestro test on CI/CD #28

Workflow file for this run

name: React Native CI
on:
pull_request:
branches: main
push:
branches: main
schedule:
- cron: '0 0 * * *' # Runs at 00:00 UTC every day
jobs:
ios-build:
name: iOS Build
runs-on: macos-latest
defaults:
run:
working-directory: example
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: example/package-lock.json
- name: Cache CocoaPods
uses: actions/cache@v3
with:
path: |
example/ios/Pods
key: ${{ runner.os }}-pods-${{ hashFiles('example/ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-
- name: Install dependencies
run: |
npm install --frozen-lockfile
cd ios && pod install
- name: Install Maestro CLI
run: |
curl -Ls "https://get.maestro.mobile.dev" | bash
brew tap facebook/fb
brew install facebook/fb/idb-companion
- name: Add Maestro to path
run: echo "${HOME}/.maestro/bin" >> $GITHUB_PATH
- name: Start packager
run: npm start &
- name: Build iOS
run: |
npm run ios
- name: Setup iOS simulator
run: |
UDID=$(xcrun simctl list devices | grep "iPhone" | grep "Booted" | head -1 | grep -E -o -i "([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})")
if [ -z "$UDID" ]; then
UDID=$(xcrun simctl list devices available | grep "iPhone" | head -1 | grep -E -o -i "([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})")
xcrun simctl boot "${UDID}"
fi
open -a Simulator
xcrun simctl launch "${UDID}" com.jscexample
- name: Run iOS tests
run: |
# Set timeouts
export MAESTRO_DRIVER_STARTUP_TIMEOUT=1500000
export MAESTRO_WAIT_TIMEOUT=10000
# Get the UDID of the booted simulator
UDID=$(xcrun simctl list devices | grep "iPhone" | grep "Booted" | head -1 | grep -E -o -i "([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})")
if [ -z "$UDID" ]; then
echo "No booted iPhone simulator found"
exit 1
fi
echo "Using simulator with UDID: ${UDID}"
# Find test files
MAESTRO_DIR="./maestro-tests"
# Run each test with a timeout
for TEST_FILE in ${MAESTRO_DIR}/*.yaml; do
echo "Running test: ${TEST_FILE}"
COMMAND="$HOME/.maestro/bin/maestro --udid=\"${UDID}\" test \"${TEST_FILE}\" --format junit"
echo "Executing: ${COMMAND}"
# Use timeout command to enforce a 10-minute limit
timeout 600 bash -c "$HOME/.maestro/bin/maestro --udid=\"${UDID}\" test \"${TEST_FILE}\" --format junit"
# Store exit code but continue with other tests even if one fails
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
echo "Test failed: ${TEST_FILE} with exit code ${EXIT_CODE}"
fi
done
android-build:
name: Android Build
runs-on: ubuntu-latest
defaults:
run:
working-directory: example
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
cache-dependency-path: example/package-lock.json
- name: Setup Java
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '17'
- name: Install dependencies
run: npm install --frozen-lockfile
- name: Start packager
run: npm start &
- name: Install Maestro CLI
run: |
curl -Ls "https://get.maestro.mobile.dev" | bash
- name: Add Maestro to path
run: echo "${HOME}/.maestro/bin" >> $GITHUB_PATH
- name: Create AVD and generate snapshot for caching
uses: reactivecircus/android-emulator-runner@v2
with:
target: aosp_atd
api-level: 30
arch: x86
ram-size: 4096M
channel: canary
profile: pixel
avd-name: Pixel_3a_API_30_AOSP
force-avd-creation: false
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
emulator-boot-timeout: 12000
disable-animations: false
working-directory: example
script: |
npm run android
npm run test:e2e