Skip to content

add CI/CD setup

add CI/CD setup #24

Workflow file for this run

name: React Native Maestro Tests
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
workflow_dispatch:
jobs:
test-android-emulator:
name: Test Android Emulator Setup
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'yarn'
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- 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: Gradle cache
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Increase Gradle memory
run: |
echo "org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError" >> android/gradle.properties
echo "org.gradle.daemon=false" >> android/gradle.properties
- name: Run Maestro tests on Android emulator
uses: reactivecircus/android-emulator-runner@v2
env:
JAVA_TOOL_OPTIONS: -Xmx4g
with:
api-level: 29
arch: x86_64
force-avd-creation: true
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
script: |
adb devices
echo "Building and installing app..."
cd android && ./gradlew clean
cd .. && ./gradlew assembleDebug --no-daemon
yarn android --verbose
echo "Waiting for app to start..."
sleep 60
echo "Installing Maestro..."
curl -Ls "https://get.maestro.mobile.dev" | bash
export PATH="$PATH":"$HOME/.maestro/bin"
echo "Running Maestro tests..."
maestro --verbose test e2e/main-flow-android.yaml
- name: Upload Maestro logs
if: always()
uses: actions/upload-artifact@v4
with:
name: maestro-android-logs
path: |
~/.maestro/logs
./e2e/main-flow-android.yaml
test-ios-simulator:
name: Test iOS Simulator Setup
runs-on: macos-13
env:
DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'yarn'
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Cache CocoaPods
uses: actions/cache@v3
with:
path: ios/Pods
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-pods-
- name: Install CocoaPods
run: |
cd ios
pod install --repo-update
- name: Build iOS app
run: |
cd ios
xcodebuild -workspace weatherApp.xcworkspace -scheme weatherApp -destination 'platform=iOS Simulator,name=iPhone 14,OS=16.4' -configuration Debug build -quiet
- name: Create and boot iOS simulator
run: |
UDID=$(xcrun simctl create "iPhone 14" com.apple.CoreSimulator.SimDeviceType.iPhone-14 com.apple.CoreSimulator.SimRuntime.iOS-16-4)
xcrun simctl boot $UDID
MAX_RETRY=30
COUNT=0
while [ $COUNT -lt $MAX_RETRY ]; do
xcrun simctl list devices | grep "(Booted)" && break
echo "Waiting for simulator to boot..."
sleep 10
COUNT=$((COUNT+1))
done
if [ $COUNT -eq $MAX_RETRY ]; then
echo "Simulator failed to boot in time"
exit 1
fi
echo "Simulator is ready"
- name: Run app in simulator
run: |
xcrun simctl install booted ios/build/Build/Products/Debug-iphonesimulator/weatherApp.app
xcrun simctl launch booted com.weatherApp.callstack
- name: Install and run Maestro
run: |
set -x
curl -Ls "https://get.maestro.mobile.dev" | bash
export PATH="$PATH":"$HOME/.maestro/bin"
echo "Running diagnostics..."
xcrun simctl list
echo "Running Maestro tests..."
maestro --verbose test e2e/main-flow-ios.yaml
- name: Upload Maestro logs
if: always()
uses: actions/upload-artifact@v4
with:
name: maestro-ios-logs
path: |
~/.maestro/logs
./e2e/main-flow-ios.yaml