Use correct simulator for iOS #638
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: Run Native Pipeline | ||
on: | ||
workflow_dispatch: | ||
inputs: | ||
mendix_version: | ||
description: "Provide the SP version to be used (e.g., 10.14.0.43709) - has to be a released version (Default: latest from Mendix versions.json)" | ||
required: false | ||
default: "" | ||
nt_branch: | ||
description: "Native Template branch to use (Default: master)" | ||
default: "master" | ||
required: false | ||
type: string | ||
workspace: | ||
description: "Select a widget to test (Default will run all)" | ||
required: true | ||
default: "*-native" | ||
type: choice | ||
options: | ||
- "*-native" | ||
- accordion-native | ||
- activity-indicator-native | ||
- animation-native | ||
- app-events-native | ||
- background-gradient-native | ||
- background-image-native | ||
- badge-native | ||
- bar-chart-native | ||
- barcode-scanner-native | ||
- bottom-sheet-native | ||
- carousel-native | ||
- color-picker-native | ||
- column-chart-native | ||
- feedback-native | ||
- floating-action-button-native | ||
- gallery-native | ||
- gallery-text-filter-native | ||
- image-native | ||
- intro-screen-native | ||
- line-chart-native | ||
- listview-swipe-native | ||
- maps-native | ||
- notifications-native | ||
- pie-doughnut-chart-native | ||
- popup-menu-native | ||
- progress-bar-native | ||
- qr-code-native | ||
- radio-buttons-native | ||
- range-slider-native | ||
- rating-native | ||
- repeater-native | ||
- safe-area-view-native | ||
- signature-native | ||
- slider-native | ||
- switch-native | ||
- toggle-buttons-native | ||
- video-player-native | ||
- web-view-native | ||
pull_request: | ||
# branches: [master] | ||
permissions: | ||
packages: write | ||
jobs: | ||
scope: | ||
runs-on: ubuntu-latest | ||
outputs: | ||
scope: ${{ steps.scope.outputs.scope }} | ||
steps: | ||
- name: "Determine scope" | ||
id: scope | ||
run: | | ||
if [ -n "${{ github.event.inputs.workspace }}" ] && [ "${{ github.event.inputs.workspace }}" != "*-native" ]; then | ||
selected_workspaces=$(echo "${{ github.event.inputs.workspace }}" | sed 's/,/ /g') | ||
echo "scope=--all --include '${selected_workspaces}'" >> $GITHUB_OUTPUT | ||
else | ||
if [ "${{ github.event_name }}" == "pull_request" ]; then | ||
echo "scope=--since --include '*-native'" >> $GITHUB_OUTPUT | ||
else | ||
echo "scope=--all --include '*-native'" >> $GITHUB_OUTPUT | ||
fi | ||
fi | ||
- name: "Debug Scope Output" | ||
run: | | ||
echo "Scope is: ${{ steps.scope.outputs.scope }}" | ||
mendix-version: | ||
runs-on: ubuntu-22.04 | ||
outputs: | ||
mendix_version: ${{ steps.set-mendix-version.outputs.MENDIX_VERSION }} | ||
steps: | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
- name: "Get Mendix version from JSON" | ||
id: get-mendix-version | ||
uses: notiz-dev/github-action-json-property@7a701887f4b568b23eb7b78bb0fc49aaeb1b68d3 # v0.2.0 | ||
with: | ||
path: configs/e2e/mendix-versions.json | ||
prop_path: latest | ||
- name: Set Mendix version | ||
id: set-mendix-version | ||
run: | | ||
if [[ -n "${{ github.event.inputs.mendix_version }}" ]]; then | ||
echo "MENDIX_VERSION=${{ github.event.inputs.mendix_version }}" >> $GITHUB_OUTPUT | ||
else | ||
echo "MENDIX_VERSION=${{ steps.get-mendix-version.outputs.prop }}" >> $GITHUB_OUTPUT | ||
fi | ||
- name: "Debug Mendix Version" | ||
run: | | ||
echo "Mendix Version: ${{ steps.set-mendix-version.outputs.MENDIX_VERSION }}" | ||
docker-images: | ||
needs: mendix-version | ||
runs-on: ubuntu-22.04 | ||
steps: | ||
- name: "Login to GitHub Container Registry" | ||
uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0 | ||
with: | ||
registry: ghcr.io | ||
username: ${{ github.actor }} | ||
password: ${{ secrets.GITHUB_TOKEN }} | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
- name: "Check if docker image already exists" | ||
run: | | ||
docker manifest inspect ghcr.io/mendix/native-widgets/mxbuild:${{ needs.mendix-version.outputs.mendix_version }} || EXIT_CODE=$? | ||
echo "IMAGE_MISSING=$EXIT_CODE" >> $GITHUB_ENV | ||
- name: "Build mxbuild image" | ||
# if: ${{ env.IMAGE_MISSING != 0 }} | ||
uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # v5.3.0 | ||
with: | ||
file: ./.github/scripts/mxbuild.Dockerfile | ||
context: ./.github/scripts | ||
build-args: | | ||
MENDIX_VERSION=${{ needs.mendix-version.outputs.mendix_version }} | ||
push: true | ||
tags: ghcr.io/mendix/native-widgets/mxbuild:${{ needs.mendix-version.outputs.mendix_version }} | ||
resources: | ||
needs: [scope, mendix-version] | ||
runs-on: ubuntu-22.04 | ||
permissions: | ||
packages: read | ||
contents: read | ||
steps: | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
with: | ||
fetch-depth: 0 | ||
- name: "Set up node" | ||
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 | ||
with: | ||
node-version-file: .nvmrc | ||
cache: yarn | ||
- name: "Install dependencies" | ||
run: yarn install --immutable | ||
- name: "Unit test" | ||
run: yarn workspaces foreach ${{ needs.scope.outputs.scope }} run test | ||
- name: "Run build for development" | ||
run: yarn workspaces foreach ${{ needs.scope.outputs.scope }} run build | ||
env: | ||
NODE_OPTIONS: --max_old_space_size=6144 | ||
- name: "Upload resources artifact" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
with: | ||
name: resources | ||
path: | | ||
packages/pluggableWidgets/**/dist/*/*.mpk | ||
packages/jsActions/mobile-resources-native/dist/**/* | ||
packages/jsActions/nanoflow-actions-native/dist/**/* | ||
project: | ||
needs: [resources, mendix-version] | ||
runs-on: ubuntu-22.04 | ||
container: | ||
image: ghcr.io/mendix/native-widgets/mxbuild:${{ needs.mendix-version.outputs.mendix_version }} | ||
credentials: | ||
username: ${{ github.actor }} | ||
password: ${{ secrets.GITHUB_TOKEN }} | ||
steps: | ||
- name: "Make sure curl is installed" | ||
run: | | ||
apt update && apt upgrade -y | ||
apt install curl -y | ||
- name: "Download test project" | ||
run: curl -L -o project.zip https://github.com/mendix/Native-Mobile-Resources/archive/refs/heads/main.zip | ||
- name: "Extract test project" | ||
uses: montudor/action-zip@0852c26906e00f8a315c704958823928d8018b28 # v1.0.0 | ||
with: | ||
args: unzip -qq project.zip -d . | ||
- name: "Download resources artifact" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: resources | ||
path: resources | ||
- name: "List resources" | ||
run: ls -R resources | ||
- name: "Move widgets" | ||
shell: bash | ||
run: | | ||
if compgen -G 'resources/pluggableWidgets/**/dist/*/*.mpk' > /dev/null; then | ||
for oldPath in resources/pluggableWidgets/**/dist/*/*.mpk; do | ||
newPath=Native-Mobile-Resources-main/widgets/$(basename $oldPath) | ||
mv -f $oldPath $newPath | ||
done | ||
mx update-widgets --loose-version-check Native-Mobile-Resources-main/NativeComponentsTestProject.mpr | ||
fi | ||
- name: "Move mobile-resources" | ||
shell: bash | ||
run: | | ||
if compgen -G 'resources/jsActions/mobile-resources-native/*' > /dev/null; then | ||
mv -f resources/jsActions/mobile-resources-native/* Native-Mobile-Resources-main/javascriptsource/nativemobileresources/actions/ | ||
fi | ||
- name: "Move nanoflow-actions" | ||
shell: bash | ||
run: | | ||
if compgen -G 'resources/jsActions/mobile-resources-native/*' > /dev/null; then | ||
mv -f resources/jsActions/nanoflow-actions-native/* Native-Mobile-Resources-main/javascriptsource/nanoflowcommons/actions/ | ||
fi | ||
- name: "Build test project" | ||
run: mxbuild -o automation.mda --loose-version-check Native-Mobile-Resources-main/NativeComponentsTestProject.mpr | ||
- name: "Upload MDA" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
with: | ||
name: mda | ||
path: automation.mda | ||
android-bundle: | ||
needs: [project, mendix-version] | ||
runs-on: ubuntu-22.04 | ||
container: | ||
image: ghcr.io/mendix/native-widgets/mxbuild:${{ needs.mendix-version.outputs.mendix_version }} | ||
credentials: | ||
username: ${{ github.actor }} | ||
password: ${{ secrets.GITHUB_TOKEN }} | ||
steps: | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
- name: "Download deployment package" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: mda | ||
- name: "Create Android bundle" | ||
uses: ./.github/actions/create-native-bundle | ||
with: | ||
platform: android | ||
mda-file: automation.mda | ||
ios-bundle: | ||
needs: [project, mendix-version] | ||
runs-on: ubuntu-22.04 | ||
container: | ||
image: ghcr.io/mendix/native-widgets/mxbuild:${{ needs.mendix-version.outputs.mendix_version }} | ||
credentials: | ||
username: ${{ github.actor }} | ||
password: ${{ secrets.GITHUB_TOKEN }} | ||
steps: | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
- name: "Download project MDA file" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: mda | ||
- name: "Create iOS bundle" | ||
uses: ./.github/actions/create-native-bundle | ||
with: | ||
platform: ios | ||
mda-file: automation.mda | ||
android-app: | ||
needs: [android-bundle] | ||
runs-on: ubuntu-22.04 | ||
steps: | ||
- name: "Check out Native Template for Native Components Test Project" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
with: | ||
repository: mendix/native-template | ||
ref: ${{ github.event.inputs.nt_branch || 'master' }} | ||
path: native-template | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
with: | ||
path: native-widgets | ||
- name: "Download Android bundle and assets" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: android-bundle | ||
path: bundles/android | ||
- name: "Set up Node" | ||
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 | ||
with: | ||
node-version-file: native-template/.nvmrc | ||
cache: npm | ||
cache-dependency-path: native-template/package-lock.json | ||
- name: "Copy files to the right location" | ||
run: | | ||
mv bundles/android/index.android.bundle native-template/android/app/src/main/assets/index.android.bundle | ||
cp -r bundles/android/assets/* native-template/android/app/src/main/res/ | ||
mv native-widgets/configs/e2e/config.json native-template | ||
mv native-widgets/configs/e2e/google-services.json native-template/android/app | ||
node native-widgets/scripts/test/add-native-dependencies.js | ||
- name: "Install dependencies" | ||
working-directory: native-template | ||
run: npm i | ||
- name: "Setup JDK" | ||
uses: actions/setup-java@v4 | ||
with: | ||
java-version: 21 | ||
distribution: temurin | ||
cache: gradle | ||
- name: "Build Android app" | ||
working-directory: native-template/android | ||
run: | | ||
./gradlew assembleAppstoreDebug assembleAppstoreDebugAndroidTest | ||
if [ $? -ne 0 ]; then | ||
echo "Build failed!" | ||
exit 1 | ||
fi | ||
- name: "List APK files" | ||
run: | | ||
echo "Listing APK files in the output directory:" | ||
ls -R native-template/android/app/build/outputs/apk/ | ||
- name: "Archive Android app" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
with: | ||
name: android-app | ||
path: native-template/android/app/build/outputs/apk/**/*.apk | ||
ios-app: | ||
needs: [ios-bundle] | ||
runs-on: macos-13 | ||
steps: | ||
- name: "Check out Native Template for Native Components Test Project" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
with: | ||
repository: mendix/native-template | ||
ref: ${{ github.event.inputs.nt_branch || 'master' }} | ||
path: native-template | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
with: | ||
path: native-widgets | ||
- name: "Download iOS bundle and assets" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: ios-bundle | ||
path: bundles/ios | ||
- name: "Set up Node" | ||
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 | ||
with: | ||
node-version-file: native-template/.nvmrc | ||
cache: npm | ||
cache-dependency-path: native-template/package-lock.json | ||
- name: "Cache iOS Build" | ||
uses: actions/cache@v3 | ||
with: | ||
path: native-template/ios/build | ||
key: ${{ runner.os }}-ios-build-${{ hashFiles('native-template/ios/**/*.swift', 'native-template/ios/**/*.h', 'native-template/ios/Podfile.lock') }} | ||
restore-keys: | | ||
${{ runner.os }}-ios-build- | ||
- name: "Copy files to the right location" | ||
run: | | ||
mv bundles/ios/index.ios.bundle native-template/ios/Bundle/index.ios.bundle | ||
mv bundles/ios/assets/assets native-template/ios/Bundle/ | ||
mv native-widgets/configs/e2e/config.json native-template | ||
node native-widgets/scripts/test/add-native-dependencies.js | ||
- name: "Install Node dependencies" | ||
working-directory: native-template | ||
run: npm i | ||
- name: "Setup Pods cache" | ||
uses: actions/cache@v3 | ||
with: | ||
path: native-template/Pods | ||
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} | ||
restore-keys: | | ||
${{ runner.os }}-pods- | ||
- name: "Install Pod dependencies" | ||
working-directory: native-template/ios | ||
run: pod install | ||
- name: "Build iOS app" | ||
working-directory: native-template/ios | ||
run: xcodebuild -workspace NativeTemplate.xcworkspace -scheme nativeTemplate -configuration Debug -sdk iphonesimulator -derivedDataPath build ONLY_ACTIVE_ARCH=YES VALID_ARCHS="i386 x86_64" | ||
- name: "Archive iOS app" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
with: | ||
name: ios-app | ||
path: native-template/ios/build/Build/Products/**/*.app | ||
android-tests: | ||
needs: [scope, mendix-version, project, android-app] | ||
runs-on: ubuntu-22.04 | ||
steps: | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
with: | ||
fetch-depth: 0 | ||
- name: "Set up node" | ||
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 | ||
with: | ||
node-version-file: .nvmrc | ||
cache: yarn | ||
- name: "Install dependencies" | ||
run: yarn install --immutable | ||
- name: "Download project MDA file" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: mda | ||
- name: "List contents of working directory before downloading Android app" | ||
run: ls -R | ||
- name: "Start runtime" | ||
uses: ./.github/actions/start-runtime | ||
with: | ||
mda-file: automation.mda | ||
mendix-version: ${{ needs.mendix-version.outputs.mendix_version }} | ||
- name: "Download Android app" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: android-app | ||
path: android-app | ||
- name: "List contents of android-app directory after download" | ||
run: ls -R android-app | ||
- name: "Move android apps to correct location" | ||
run: | | ||
mkdir -p detox/apps | ||
find android-app -type f -iname "*.apk" -exec mv {} detox/apps/ \; | ||
- name: "Check if APK files are present" | ||
run: | | ||
echo "Listing APK files in detox/apps directory:" | ||
ls -R detox/apps | ||
- 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: "Run tests" | ||
uses: reactivecircus/[email protected] | ||
with: | ||
api-level: 30 | ||
target: google_apis | ||
arch: x86_64 | ||
profile: pixel | ||
cores: 3 | ||
ram-size: 4096M | ||
heap-size: 512M | ||
avd-name: NATIVE_pixel_30 | ||
force-avd-creation: false | ||
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | ||
disable-animations: true | ||
script: | | ||
adb shell "rm -fr /data/local/tmp/detox" | ||
adb shell "mkdir -p /data/local/tmp/detox" | ||
adb push "detox/apps/app-appstore-debug.apk" "/data/local/tmp/detox/Application.apk" | ||
adb push "detox/apps/app-appstore-debug-androidTest.apk" "/data/local/tmp/detox/Test.apk" | ||
adb shell pm install -r -g -t /data/local/tmp/detox/Application.apk 2>/dev/null | ||
adb shell pm install -r -g -t /data/local/tmp/detox/Test.apk 2>/dev/null | ||
yarn workspaces foreach ${{ needs.scope.outputs.scope }} run test:e2e:android | ||
- name: "Archive runtime logs" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
if: always() | ||
with: | ||
name: android-runtime-logs | ||
path: log/*.log | ||
if-no-files-found: ignore | ||
- name: "Archive test screenshot diff results" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
if: failure() | ||
with: | ||
name: android-screenshot-results | ||
path: | | ||
${{ github.workspace }}/packages/**/e2e/images/diffs/**/*.png | ||
${{ github.workspace }}/packages/**/e2e/images/actual/**/*.png | ||
if-no-files-found: ignore | ||
- name: "Archive artifacts" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
if: always() | ||
with: | ||
name: android-artifacts | ||
path: packages/pluggableWidgets/**/artifacts/ | ||
if-no-files-found: ignore | ||
ios-tests: | ||
needs: [scope, mendix-version, project, ios-app] | ||
runs-on: macos-15 | ||
steps: | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
with: | ||
fetch-depth: 0 | ||
- name: "Set up node" | ||
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 | ||
with: | ||
node-version-file: .nvmrc | ||
cache: yarn | ||
- name: "Install dependencies" | ||
run: yarn install --immutable | ||
- name: "Download project MDA file" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: mda | ||
- name: "Clean detox framework cache" | ||
run: npx detox clean-framework-cache | ||
- name: "Build detox framework cache" | ||
run: npx detox build-framework-cache | ||
- name: "Start runtime" | ||
uses: ./.github/actions/start-runtime | ||
with: | ||
mda-file: automation.mda | ||
mendix-version: ${{ needs.mendix-version.outputs.mendix_version }} | ||
- name: "Download iOS app" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: ios-app | ||
path: ios-app | ||
- name: "Move iOS app to correct location" | ||
run: | | ||
mkdir -p detox/apps | ||
find ios-app -type d -iname "*.app" -exec cp -R {} detox/apps/ \; | ||
- name: Install Detox Dependencies | ||
run: | | ||
brew tap wix/brew | ||
brew install applesimutils | ||
- name: Find or Create Simulator | ||
id: find-or-create-simulator | ||
run: | | ||
SIMULATOR_ID=$(xcrun simctl list devices | grep "iPhone 16" | grep -v "unavailable" | grep -v "Shutdown" | awk -F '[()]' '{print $2}' | head -n 1) | ||
if [ -z "$SIMULATOR_ID" ]; then | ||
echo "No available simulator found for iPhone 16. Creating a new one..." | ||
xcrun simctl create "iPhone 16" "com.apple.CoreSimulator.SimDeviceType.iPhone-16" "com.apple.CoreSimulator.SimRuntime.iOS-15-0" | ||
SIMULATOR_ID=$(xcrun simctl list devices | grep "iPhone 16" | grep -v "unavailable" | grep -v "Shutdown" | awk -F '[()]' '{print $2}' | head -n 1) | ||
fi | ||
echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV | ||
echo "Simulator ID: $SIMULATOR_ID" | ||
- name: Boot Simulator | ||
env: | ||
SIMULATOR_ID: ${{ env.SIMULATOR_ID }} | ||
run: xcrun simctl boot $SIMULATOR_ID | ||
- name: Wait for Simulator to Boot | ||
run: | | ||
while ! xcrun simctl list | grep "Booted"; do | ||
echo "Waiting for simulator to boot..." | ||
sleep 5 | ||
done | ||
- name: "Check if iOS app exists in detox/apps" | ||
run: | | ||
APP_PATH="detox/apps/NativeTemplate.app" | ||
if [ ! -d "$APP_PATH" ]; then | ||
echo "App not found at path: $APP_PATH" | ||
else | ||
echo "App found at path: $APP_PATH" | ||
fi | ||
- name: "Check if iOS app exists in full BINARY_PATH" | ||
run: | | ||
BINARY_PATH="/Users/runner/work/native-widgets/native-widgets/detox/apps/NativeTemplate.app" | ||
echo "BINARY_PATH=$BINARY_PATH" >> $GITHUB_ENV | ||
if [ ! -d "$BINARY_PATH" ]; then | ||
echo "App not found at path: $BINARY_PATH" | ||
echo "Listing contents of the apps directory:" | ||
ls -R /Users/runner/work/native-widgets/native-widgets/detox/apps # List contents of the apps directory for debugging | ||
else | ||
echo "App found at path: $BINARY_PATH" | ||
fi | ||
- name: "List contents of the app bundle" | ||
run: | | ||
echo "Listing contents of the app bundle at $BINARY_PATH:" | ||
ls -R "$BINARY_PATH" | ||
- name: "Install app on simulator" | ||
run: | | ||
if [ -z "$SIMULATOR_ID" ]; then | ||
echo "No booted simulator found for iPhone 16." | ||
exit 1 | ||
fi | ||
echo "Installing app on simulator with ID: $SIMULATOR_ID" | ||
xcrun simctl install "$SIMULATOR_ID" "$BINARY_PATH" | ||
- name: "Verify app installation" | ||
run: | | ||
if ! xcrun simctl get_app_container "$SIMULATOR_ID" com.mendix.native.template; then | ||
echo "App is not installed on the simulator." | ||
exit 1 | ||
else | ||
echo "App is installed on the simulator." | ||
fi | ||
- name: "Run tests" | ||
env: ios-tests: | ||
needs: [scope, mendix-version, project, ios-app] | ||
runs-on: macos-15 | ||
steps: | ||
- name: "Check out code" | ||
uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 | ||
with: | ||
fetch-depth: 0 | ||
- name: "Set up node" | ||
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 | ||
with: | ||
node-version-file: .nvmrc | ||
cache: yarn | ||
- name: "Install dependencies" | ||
run: yarn install --immutable | ||
- name: "Download project MDA file" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: mda | ||
- name: "Clean detox framework cache" | ||
run: npx detox clean-framework-cache | ||
- name: "Build detox framework cache" | ||
run: npx detox build-framework-cache | ||
- name: "Start runtime" | ||
uses: ./.github/actions/start-runtime | ||
with: | ||
mda-file: automation.mda | ||
mendix-version: ${{ needs.mendix-version.outputs.mendix_version }} | ||
- name: "Download iOS app" | ||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | ||
with: | ||
name: ios-app | ||
path: ios-app | ||
- name: "Move iOS app to correct location" | ||
run: | | ||
mkdir -p detox/apps | ||
find ios-app -type d -iname "*.app" -exec cp -R {} detox/apps/ \; | ||
- name: Install Detox Dependencies | ||
run: | | ||
brew tap wix/brew | ||
brew install applesimutils | ||
- name: Find or Create Simulator | ||
id: find-or-create-simulator | ||
run: | | ||
SIMULATOR_ID=$(xcrun simctl list devices | grep "iPhone 16" | grep -v "unavailable" | grep -v "Shutdown" | awk -F '[()]' '{print $2}' | head -n 1) | ||
if [ -z "$SIMULATOR_ID" ]; then | ||
echo "No available simulator found for iPhone 16. Creating a new one..." | ||
xcrun simctl create "iPhone 16" "com.apple.CoreSimulator.SimDeviceType.iPhone-16" "com.apple.CoreSimulator.SimRuntime.iOS-15-0" | ||
SIMULATOR_ID=$(xcrun simctl list devices | grep "iPhone 16" | grep -v "unavailable" | grep -v "Shutdown" | awk -F '[()]' '{print $2}' | head -n 1) | ||
fi | ||
echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV | ||
echo "Simulator ID: $SIMULATOR_ID" | ||
- name: Boot Simulator | ||
env: | ||
SIMULATOR_ID: ${{ env.SIMULATOR_ID }} | ||
run: xcrun simctl boot $SIMULATOR_ID | ||
- name: Wait for Simulator to Boot | ||
run: | | ||
while ! xcrun simctl list | grep "Booted"; do | ||
echo "Waiting for simulator to boot..." | ||
sleep 5 | ||
done | ||
- name: "Check if iOS app exists in detox/apps" | ||
run: | | ||
APP_PATH="detox/apps/NativeTemplate.app" | ||
if [ ! -d "$APP_PATH" ]; then | ||
echo "App not found at path: $APP_PATH" | ||
else | ||
echo "App found at path: $APP_PATH" | ||
fi | ||
- name: "Check if iOS app exists in full BINARY_PATH" | ||
run: | | ||
BINARY_PATH="/Users/runner/work/native-widgets/native-widgets/detox/apps/NativeTemplate.app" | ||
echo "BINARY_PATH=$BINARY_PATH" >> $GITHUB_ENV | ||
if [ ! -d "$BINARY_PATH" ]; then | ||
echo "App not found at path: $BINARY_PATH" | ||
echo "Listing contents of the apps directory:" | ||
ls -R /Users/runner/work/native-widgets/native-widgets/detox/apps # List contents of the apps directory for debugging | ||
else | ||
echo "App found at path: $BINARY_PATH" | ||
fi | ||
- name: "List contents of the app bundle" | ||
run: | | ||
echo "Listing contents of the app bundle at $BINARY_PATH:" | ||
ls -R "$BINARY_PATH" | ||
- name: "Install app on simulator" | ||
env: | ||
SIMULATOR_ID: ${{ env.SIMULATOR_ID }} | ||
run: | | ||
if [ -z "$SIMULATOR_ID" ]; then | ||
echo "No booted simulator found for iPhone 16." | ||
exit 1 | ||
fi | ||
echo "Installing app on simulator with ID: $SIMULATOR_ID" | ||
xcrun simctl install "$SIMULATOR_ID" "$BINARY_PATH" | ||
- name: "Verify app installation" | ||
env: | ||
SIMULATOR_ID: ${{ env.SIMULATOR_ID }} | ||
run: | | ||
if ! xcrun simctl get_app_container "$SIMULATOR_ID" com.mendix.native.template; then | ||
echo "App is not installed on the simulator." | ||
exit 1 | ||
else | ||
echo "App is installed on the simulator." | ||
fi | ||
- name: "Run tests" | ||
env: | ||
DETOX_LOGLEVEL: trace | ||
SIMULATOR_ID: ${{ env.SIMULATOR_ID }} | ||
run: yarn workspaces foreach ${{ needs.scope.outputs.scope }} run test:e2e:ios | ||
- name: "Archive runtime logs" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
if: always() | ||
with: | ||
name: ios-runtime-logs | ||
path: log/*.log | ||
if-no-files-found: ignore | ||
- name: "Archive test screenshot diff results" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
if: failure() | ||
with: | ||
name: ios-screenshot-results | ||
path: | | ||
${{ github.workspace }}/packages/**/e2e/images/diffs/**/*.png | ||
${{ github.workspace }}/packages/**/e2e/images/actual/**/*.png | ||
if-no-files-found: ignore | ||
- name: "Archive artifacts" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
if: always() | ||
with: | ||
name: ios-artifacts | ||
path: packages/pluggableWidgets/**/artifacts/ | ||
if-no-files-found: ignore | ||
DETOX_LOGLEVEL: trace | ||
SIMULATOR_ID: ${{ env.SIMULATOR_ID }} | ||
run: yarn workspaces foreach ${{ needs.scope.outputs.scope }} run test:e2e:ios | ||
- name: "Archive runtime logs" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
if: always() | ||
with: | ||
name: ios-runtime-logs | ||
path: log/*.log | ||
if-no-files-found: ignore | ||
- name: "Archive test screenshot diff results" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
if: failure() | ||
with: | ||
name: ios-screenshot-results | ||
path: | | ||
${{ github.workspace }}/packages/**/e2e/images/diffs/**/*.png | ||
${{ github.workspace }}/packages/**/e2e/images/actual/**/*.png | ||
if-no-files-found: ignore | ||
- name: "Archive artifacts" | ||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | ||
if: always() | ||
with: | ||
name: ios-artifacts | ||
path: packages/pluggableWidgets/**/artifacts/ | ||
if-no-files-found: ignore |