add CI/CD setup #24
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |