Run TesterArmy mobile tests from Expo EAS workflows by uploading the EAS iOS Simulator build and triggering a remote test group.
Before you set it up, make sure you have already:
Also make sure that you have configured Expo EAS with Github
These values can be found in the TesterArmy Dashboard:
Set TESTERARMY_API_KEY as an EAS secret or sensitive environment variable. Do not commit it, and
do not expose it through an EXPO_PUBLIC_* environment variable.
Below you will find instructions for AI agent to set up EAS integration with TesterArmy for you.
You are working in an Expo app repository. Add TesterArmy mobile testing through Expo EAS workflows.
Before editing files:
* Inspect the existing `eas.json`, `.eas/workflows`, `package.json`, and package manager lockfile.
* Do not overwrite an existing EAS workflow. Create a new workflow file or make the smallest safe edit.
* Do not hard-code secrets, API keys, project IDs, or group IDs in committed files.
* Use the repository’s existing package manager style when adding commands.
Implement this setup:
1. Ensure `eas.json` has an iOS Simulator build profile for TesterArmy. Prefer the profile name `testerarmy-ios-simulator`. If the project already has a simulator build profile, reuse it and keep the workflow profile name in sync.
2. The build profile must set `ios.simulator` to `true`. TesterArmy needs a `.app` simulator build, not an `.ipa` device build.
3. Create `.eas/workflows/testerarmy-mobile-tests.yml` if it does not already exist.
4. The workflow should support `push` to `main`, `pull_request` to `main`, and `workflow_dispatch`.
5. The workflow should read these values from EAS environment variables:
* `TESTERARMY_API_KEY`
* `TESTERARMY_PROJECT_ID`
* `TESTERARMY_GROUP_ID`
6. The workflow should build the iOS Simulator app with EAS.
7. The workflow should download the build artifact with `eas/download_build`.
8. The workflow should upload the downloaded `.app` artifact with `npx --yes testerarmy@latest upload-app`.
9. The workflow should run the saved TesterArmy group with the uploaded app ID.
10. The workflow should pass commit SHA for GitHub check reporting when the EAS/GitHub context provides it.
11. The workflow should pass PR number only when the workflow is running for a pull request.
12. The workflow should delete the uploaded app after the run.
Use this workflow as the baseline and adapt it to the repository if needed:
```yaml
name: TesterArmy Mobile Tests
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch: {}
jobs:
build_ios:
name: Build iOS Simulator app
type: build
environment: preview
params:
platform: ios
profile: testerarmy-ios-simulator
upload_app:
name: Upload app to TesterArmy
needs: [build_ios]
environment: preview
outputs:
app_id: ${{ fromJSON(steps.upload_app.outputs.upload_result).uploadedAppId }}
steps:
- uses: eas/checkout
- uses: eas/download_build
id: download_build
with:
build_id: ${{ needs.build_ios.outputs.build_id }}
extensions:
- app
- name: Upload app
id: upload_app
run: |
set -euo pipefail
APP_PATH="${{ steps.download_build.outputs.artifact_path }}"
mkdir -p .testerarmy
npx --yes testerarmy@latest upload-app \
--app-path "$APP_PATH" \
--project "$TESTERARMY_PROJECT_ID" \
--output .testerarmy/upload.json
set-output upload_result "$(tr -d '\n' < .testerarmy/upload.json)"
run_tests:
name: Run TesterArmy tests
needs: [upload_app]
environment: preview
steps:
- uses: eas/checkout
- name: Run tests
run: |
set -euo pipefail
APP_ID="${{ needs.upload_app.outputs.app_id }}"
COMMIT_SHA="${{ github.sha }}"
EVENT_NAME="${{ github.event_name }}"
PR_NUMBER="${{ github.event.pull_request.number || '' }}"
TIMEOUT_MS="1800000"
POLL_INTERVAL_SECONDS="10"
mkdir -p .testerarmy
args=(
ci
--group "$TESTERARMY_GROUP_ID"
--project "$TESTERARMY_PROJECT_ID"
--app-id "$APP_ID"
--commit-sha "$COMMIT_SHA"
--timeout "$TIMEOUT_MS"
--poll-interval-seconds "$POLL_INTERVAL_SECONDS"
--output .testerarmy/ci-result.json
--delete-app-after-run
)
if [ "$EVENT_NAME" = "pull_request" ] && [ -n "$PR_NUMBER" ]; then
args+=(--pr-number "$PR_NUMBER")
fi
npx --yes testerarmy@latest "${args[@]}"
```
Use these command shapes:
```bash
npx --yes testerarmy@latest upload-app \
--app-path "$APP_PATH" \
--project "$PROJECT_ID" \
--output .testerarmy/upload.json
```
```bash
npx --yes testerarmy@latest ci \
--group "$GROUP_ID" \
--project "$PROJECT_ID" \
--app-id "$APP_ID" \
--commit-sha "$COMMIT_SHA" \
--timeout "$TIMEOUT_MS" \
--poll-interval-seconds "$POLL_INTERVAL_SECONDS" \
--output .testerarmy/ci-result.json
```
If a PR number is available, append:
```bash
--pr-number "$PR_NUMBER"
```
If cleanup is enabled, append:
```bash
--delete-app-after-run
```
After editing:
* Show the user which files changed.
* Tell the user to configure `TESTERARMY_API_KEY`, `TESTERARMY_PROJECT_ID`, and `TESTERARMY_GROUP_ID` in their EAS environment.
* Tell the user which EAS workflow command to run.
* Do not run the real TesterArmy CLI or EAS build unless the user explicitly asks you to.
Finish by summarizing the files changed and the manual test command.TesterArmy requires an iOS Simulator build profile in EAS. Add the following snippet to your eas.json file:
Here is an example workflow file that:
When your workflow is triggered by a pull request, TesterArmy will create a GitHub check and comment on the PR.
When workflow is triggered by a commit (eg. on push to main), TesterArmy will create a GitHub check on the commit.
To enable this, you need to configure your TesterArmy project with your GitHub repository. You can do it in Integrations Tab in project.
You can find a working example repository here.
TesterArmy requires an iOS Simulator build to run tests. If you are using a physical device build, you need to build a simulator build first.
If you are seeing this error, it means that your TesterArmy project has no GitHub integration configured. You can configure it in Integrations Tab in project.