Mobile
GitHub Actions GitHub Actions is the recommended way to run mobile tests automatically.
You only need to provide a simulator build and your TesterArmy credentials. TesterArmy handles the cloud simulator setup, app installation, test execution, and run orchestration for you, so you do not need to manage simulators in your CI pipeline.
Before you set it up, make sure you have already:
built and uploaded a simulator app,
created at least one mobile test in TesterArmy,
run that test manually once,
added the test to a group with a webhook.
If you want a working reference, see the mobile GitHub Action and the mobile example app .
Add these GitHub secrets to your repository:
Secret Description TESTERARMY_API_KEYAPI key from Team Settings → API Keys
TESTERARMY_PROJECT_IDYour TesterArmy project ID from Project Settings
TESTERARMY_WEBHOOK_URLGroup webhook URL for the mobile tests you want to run
The most reliable setup is:
Build the iOS Simulator app on a macOS runner.
Upload the .app bundle as a GitHub artifact.
Download that artifact on Linux.
Run tester-army/mobile-github-action to upload the app, trigger the webhook, wait for results, and clean up.
name : Mobile Tests
on :
push :
branches :
- main
pull_request :
workflow_dispatch :
jobs :
build :
name : Build iOS Simulator app
runs-on : macos-latest
steps :
- name : Check out repository
No manual upload step in CI
The GitHub Action accepts either a .app directory or an archived app file. If you pass a .app
directory, the action zips and uploads it for you.
tester-army/mobile-github-action handles the full CI flow for you:
Uploads the app to TesterArmy.
Provisions the cloud simulator environment and installs the app for the run.
Triggers your mobile test group webhook and orchestrates the run lifecycle.
Polls until the runs finish or the timeout is reached.
Deletes the uploaded app after the run if cleanup is enabled.
Results are written to the GitHub step summary so you can quickly see pass/fail status, duration, issues, and screenshots.
Input Required Description app_pathYes Path to the .app, .app.zip, or .app.tar.gz you want to test api_keyYes TesterArmy API key project_idYes TesterArmy project ID webhook_urlYes Group webhook URL delete_app_after_runNo Delete the uploaded app when the run finishes remove_afterNo Auto-delete the upload after a number of seconds timeout_secondsNo Maximum time to wait for all runs to finish poll_interval_secondsNo How often the action checks for run completion
The action exposes these outputs:
app_id — the uploaded TesterArmy app ID
run_ids — a JSON array of created run IDs
overall_status — passed, failed, or timed_out
You can use overall_status in later workflow steps if you want custom reporting or notifications.
Make sure you are building for iOS Simulator and passing a .app, .app.zip, or .app.tar.gz file. An .ipa will not work.
Double-check the .app path inside the build job. The most common output path is:
ios/build/Build/Products/Release-iphonesimulator/MyApp.app Make sure your TESTERARMY_WEBHOOK_URL points to a group that already contains mobile tests.
Increase timeout_seconds for slower builds or longer test suites. The default is 30 minutes.
uses : actions/checkout@v5
- name : Build iOS Simulator app
shell : bash
run : |
set -euo pipefail
xcodebuild \
-workspace ios/MyApp.xcworkspace \
-scheme MyApp \
-configuration Release \
-sdk iphonesimulator \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath ios/build \
build \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO
- name : Copy .app to artifact directory
shell : bash
run : |
set -euo pipefail
mkdir -p .build
cp -R ios/build/Build/Products/Release-iphonesimulator/MyApp.app .build/MyApp.app
- name : Upload .app artifact
uses : actions/upload-artifact@v5
with :
name : ios-simulator-app
path : .build/MyApp.app
retention-days : 1
test :
name : Run TesterArmy tests
needs : build
runs-on : ubuntu-latest
steps :
- name : Download .app artifact
uses : actions/download-artifact@v5
with :
name : ios-simulator-app
path : .build/MyApp.app
- name : Upload app and run TesterArmy tests
id : mobile
uses : tester-army/mobile-github-action@v1
with :
app_path : .build/MyApp.app
api_key : ${{ secrets.TESTERARMY_API_KEY }}
project_id : ${{ secrets.TESTERARMY_PROJECT_ID }}
webhook_url : ${{ secrets.TESTERARMY_WEBHOOK_URL }}
delete_app_after_run : "true"
remove_after : "3600"
timeout_seconds : "1800"
- name : Print overall status
run : echo "Overall status : ${{ steps.mobile.outputs.overall_status }}"