Skip to content

[MOO-1834]: Add workflow to update minimumMXVersion #862

[MOO-1834]: Add workflow to update minimumMXVersion

[MOO-1834]: Add workflow to update minimumMXVersion #862

Workflow file for this run

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
- pie-doughnut-chart-native
- popup-menu-native
- progress-bar-native
- progress-circle-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
# Trigger on PR
pull_request:
permissions:
packages: write
jobs:
scope:
runs-on: ubuntu-latest
outputs:
scope: ${{ steps.scope.outputs.scope }}
widgets: ${{ steps.scope.outputs.widgets }}
steps:
- name: "Check out code"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 2 # Fetch the latest two commits and its parent commit
- name: "Determine scope"
id: scope
run: |
if [ "${{ github.event_name }}" == "pull_request" ]; then
if git cat-file -e ${{ github.event.before }} 2>/dev/null; then
changed_files=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }})
else
echo "Previous commit not found, using HEAD~1 as fallback"
changed_files=$(git diff --name-only HEAD~1 ${{ github.sha }})
fi
selected_workspaces=""
for file in $changed_files; do
if [[ $file == packages/pluggableWidgets/* ]]; then
widget=$(echo $file | cut -d'/' -f3)
if [[ ! $selected_workspaces =~ $widget ]]; then
selected_workspaces="$selected_workspaces $widget"
fi
fi
done
# Trim leading and trailing spaces from selected_workspaces
selected_workspaces=$(echo $selected_workspaces | xargs)
if [[ -n "$selected_workspaces" ]]; then
echo "scope=--all --include '$selected_workspaces'" >> $GITHUB_OUTPUT
echo "widgets=[\"$selected_workspaces\"]" >> $GITHUB_OUTPUT
else
widgets='["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","pie-doughnut-chart-native","popup-menu-native","progress-bar-native","progress-circle-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"]'
echo "scope=--all --include '*-native'" >> $GITHUB_OUTPUT
echo "widgets=${widgets}" >> $GITHUB_OUTPUT
fi
else
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
echo "widgets=[\"${{ github.event.inputs.workspace }}\"]" >> $GITHUB_OUTPUT
else
widgets='["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","pie-doughnut-chart-native","popup-menu-native","progress-bar-native","progress-circle-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"]'
echo "scope=--all --include '*-native'" >> $GITHUB_OUTPUT
echo "widgets=${widgets}" >> $GITHUB_OUTPUT
fi
fi
- name: "Debug Scope Output"
run: |
echo "Scope is: ${{ steps.scope.outputs.scope }}"
echo "Widgets are: ${{ steps.scope.outputs.widgets }}"
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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- 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 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: "Check out code"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
if: ${{ env.IMAGE_MISSING != 0 }}
- 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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0
- name: "Set up node"
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
with:
node-version-file: .nvmrc
cache: yarn
- name: "Install dependencies"
run: yarn install --immutable
- name: "Force rebuild resources"
run: |
yarn workspaces foreach ${{ needs.scope.outputs.scope }} run build # Ensure all resources are rebuilt
- 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@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
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: "Force rebuild test project"
run: |
mxbuild -o automation.mda --loose-version-check Native-Mobile-Resources-main/NativeComponentsTestProject.mpr
- name: "Upload MDA"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- 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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- 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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
repository: mendix/native-template
ref: ${{ github.event.inputs.nt_branch || 'master' }}
path: native-template
- name: "Check out code"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
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@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
with:
node-version-file: native-template/.nvmrc
cache: npm
cache-dependency-path: native-template/package-lock.json
- name: "Cache Android Build"
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
with:
path: native-template/android/app/build
key: ${{ runner.os }}-android-build-${{ hashFiles('native-template/android/app/src/**/*.java', 'native-template/android/app/src/**/*.kt', 'native-template/android/app/build.gradle') }}
restore-keys: |
${{ runner.os }}-android-build-
- 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@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 #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@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
repository: mendix/native-template
ref: ${{ github.event.inputs.nt_branch || 'master' }}
path: native-template
- name: "Check out code"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
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@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
with:
node-version-file: native-template/.nvmrc
cache: npm
cache-dependency-path: native-template/package-lock.json
- name: "Cache iOS Build"
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
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@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
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@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
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
strategy:
matrix:
widget: ${{ fromJson(needs.scope.outputs.widgets) }}
fail-fast: false
steps:
- name: "Check out code"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0
- name: "Set up node"
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
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
# USED ONLY FOR TESTING PURPOSE - TO SKIP APP BUILD PART AND DOWNLOAD FROM SPECIFIC RUN
# - name: "Install GitHub CLI"
# run: |
# curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
# sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
# sudo apt update
# sudo apt install gh
# - name: "Authenticate GitHub CLI"
# run: |
# unset GITHUB_TOKEN
# echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token
# - name: "Fetch artifacts from run 676"
# id: fetch-artifacts
# run: |
# artifacts_url=$(gh api "repos/${{ github.repository }}/actions/runs/13453887084/artifacts" --jq '.artifacts[] | select(.name == "android-app") | .archive_download_url')
# echo "Artifacts URL: $artifacts_url"
# echo "artifacts_url=$artifacts_url" >> $GITHUB_ENV
# - name: "Download Android app"
# if: env.artifacts_url != ''
# run: |
# if [ -z "$artifacts_url" ]; then
# echo "No artifacts URL found."
# exit 1
# fi
# curl -L -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -o android-app.zip "$artifacts_url"
# unzip android-app.zip -d android-app
- name: "Download Android app"
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with:
name: android-app
path: android-app
- name: "Start runtime"
uses: ./.github/actions/start-runtime
with:
mda-file: automation.mda
mendix-version: ${{ needs.mendix-version.outputs.mendix_version }}
- name: "Install Maestro"
run: |
mkdir -p $HOME/.local/bin
curl -L "https://github.com/mobile-dev-inc/maestro/releases/latest/download/maestro.zip" -o maestro.zip
unzip maestro.zip -d $HOME/.local/bin
chmod +x $HOME/.local/bin/maestro/bin/maestro
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Verify maestro
run: $HOME/.local/bin/maestro/bin/maestro --version
- name: Set up Android SDK
run: echo "ANDROID_HOME=$ANDROID_SDK_ROOT" >> $GITHUB_ENV
- 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 the android tests"
uses: reactivecircus/android-emulator-runner@62dbb605bba737720e10b196cb4220d374026a6d # v2.0.0
with:
api-level: 30
target: google_apis
arch: x86_64
profile: pixel
emulator-options: "-no-window -gpu swiftshader_indirect -no-boot-anim -no-snapshot -memory 4096 -cores 4"
disable-animations: true
script: |
chmod +x maestro/helpers/prepare_android.sh
chmod +x maestro/run_maestro_tests.sh
bash maestro/helpers/prepare_android.sh
bash maestro/run_maestro_tests.sh android "${{ matrix.widget }}"
- name: "Archive runtime logs"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
if: always()
with:
name: android-runtime-logs-${{ matrix.widget }}
path: log/*.log
if-no-files-found: ignore
- name: "Archive test screenshots"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
if: always()
with:
name: android-screenshots-${{ matrix.widget }}
path: ${{ github.workspace }}/maestro/images/actual/android/**/*.png
if-no-files-found: ignore
- name: "Archive artifacts"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
if: always()
with:
name: android-artifacts-${{ matrix.widget }}
path: packages/pluggableWidgets/**/artifacts/
if-no-files-found: ignore
ios-tests:
needs: [scope, mendix-version, project, ios-app]
runs-on: macos-15
strategy:
matrix:
widget: ${{ fromJson(needs.scope.outputs.widgets) }}
fail-fast: false
steps:
- name: "Check out code"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0
- name: "Set up node"
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
with:
node-version-file: .nvmrc
cache: yarn
- name: "Install dependencies"
run: |
yarn cache clean
yarn install --immutable
- name: "Download project MDA file"
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with:
name: mda
# USED ONLY FOR TESTING PURPOSE - TO SKIP APP BUILD PART AND DOWNLOAD APP FROM SPECIFIC RUN
# - name: "Install GitHub CLI"
# run: |
# brew install gh
# - name: "Authenticate GitHub CLI"
# run: |
# unset GITHUB_TOKEN
# echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token
# - name: "Fetch artifacts from run 676"
# id: fetch-artifacts
# run: |
# artifacts_url=$(gh api "repos/${{ github.repository }}/actions/runs/13453887084/artifacts" --jq '.artifacts[] | select(.name == "ios-app") | .archive_download_url')
# echo "Artifacts URL: $artifacts_url"
# echo "artifacts_url=$artifacts_url" >> $GITHUB_ENV
# - name: "Download iOS app"
# if: env.artifacts_url != ''
# run: |
# if [ -z "$artifacts_url" ]; then
# echo "No artifacts URL found."
# exit 1
# fi
# curl -L -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -o ios-app.zip "$artifacts_url"
# unzip ios-app.zip -d ios-app
- 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: Check iOS App Path
run: ls ios-app
- name: "Verify Xcode CLI Tools"
run: |
if ! xcode-select --print-path; then
echo "Xcode CLI tools not set. Setting them now."
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
else
echo "Xcode CLI tools are already configured."
fi
- name: "Install Maestro"
run: |
mkdir -p $HOME/.local/bin
curl -L "https://github.com/mobile-dev-inc/maestro/releases/latest/download/maestro.zip" -o maestro.zip
unzip maestro.zip -d $HOME/.local/bin
chmod +x $HOME/.local/bin/maestro/bin/maestro
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: "Verify maestro"
run: $HOME/.local/bin/maestro/bin/maestro --version
- name: "List Available Simulators"
run: xcrun simctl list devices
- name: "Run Maestro Script"
run: |
chmod +x maestro/helpers/prepare_ios.sh
chmod +x maestro/run_maestro_tests.sh
bash maestro/helpers/prepare_ios.sh
bash maestro/run_maestro_tests.sh ios "${{ matrix.widget }}"
- name: "Archive runtime logs"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
if: always()
with:
name: ios-runtime-logs-${{ matrix.widget }}
path: log/*.log
if-no-files-found: ignore
- name: "Archive test screenshots"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
if: always()
with:
name: ios-screenshots-${{ matrix.widget }}
path: ${{ github.workspace }}/maestro/images/actual/ios/**/*.png
if-no-files-found: ignore
- name: "Archive artifacts"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
if: always()
with:
name: ios-artifacts-${{ matrix.widget }}
path: packages/pluggableWidgets/**/artifacts/
if-no-files-found: ignore
compare-screenshots:
needs: [scope, android-tests, ios-tests]
runs-on: ubuntu-latest
if: always()
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: "Check out code"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: "Download Android screenshots"
run: |
widgets=$(echo '${{ needs.scope.outputs.widgets }}' | jq -r '.[]')
mkdir -p images/actual/android/
for widget in $widgets; do
echo "Downloading android-screenshots-${widget}"
gh run download ${{ github.run_id }} --name android-screenshots-${widget} --dir images/actual/android/ || true
ls -l images/actual/android/
done
- name: "Download iOS screenshots"
run: |
widgets=$(echo '${{ needs.scope.outputs.widgets }}' | jq -r '.[]')
mkdir -p images/actual/ios/
for widget in $widgets; do
echo "Downloading ios-screenshots-${widget}"
gh run download ${{ github.run_id }} --name ios-screenshots-${widget} --dir images/actual/ios/ || true
ls -l images/actual/ios/
done
- name: "Set up node"
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4
with:
node-version-file: .nvmrc
cache: yarn
- name: "Install dependencies"
run: yarn install
- name: "Compare Android screenshots"
continue-on-error: true
run: node ${{ github.workspace }}/maestro/helpers/compare_screenshots.js android
- name: "Compare iOS screenshots"
continue-on-error: true
run: node ${{ github.workspace }}/maestro/helpers/compare_screenshots.js ios
- name: "Archive diff results"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
with:
name: screenshot-diffs
path: images/diffs
if-no-files-found: ignore
- name: "Archive comparison results"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 #v4
with:
name: comparison-results
path: compare_output.txt
if-no-files-found: ignore
- name: "Fail if comparisons failed"
run: |
if [ "$ANDROID_COMPARISON_FAILED" == "true" ] || [ "$IOS_COMPARISON_FAILED" == "true" ]; then
echo "One or more comparisons failed."
exit 1
fi