Expo EAS
Automatically run mobile QA against every EAS build and report the result via your linked GitHub repository.
The Expo EAS integration receives build completion webhooks from EAS Build. When a build finishes successfully, Autonomy downloads the artifact and runs the configured test case or test plan on an iOS Simulator or Android emulator. Status is reported as a GitHub check run on the commit if a GitHub repository is linked.
What it does
- Receives a webhook when an EAS build finishes.
- Downloads the build artifact (
.apparchive for iOS,.apkfor Android). - Runs the configured test case or test plan against the artifact on the matching platform.
- Reports the result as a GitHub check run on the commit when a GitHub repository is linked.
.aab(Android App Bundle) artifacts cannot be installed on an emulator — only.apkbuilds are testable. An.aabartifact is skipped withartifact kind aab is not installable.- Unrecognized artifact formats (neither
.app,.apk,.ipa, nor.aab) are skipped withartifact format not recognized: <ext>. - EAS artifact URLs expire after 30 days. Autonomy downloads the artifact at trigger time; expired URLs are skipped with
build artifact expired.
Setup
Before you start
- An Expo account with at least one project that uses EAS Build.
- At least one Autonomy test case that passes against a mobile upload.
- An Autonomy environment configured for mobile testing.
- An Expo robot access token with permission to read builds and projects.
- For status reporting: the Autonomy GitHub App installed on the repository.
- Open Settings → Integrations in the Autonomy dashboard.
- Click Connect on the Expo EAS card. Paste an Expo robot access token. Expo uses token-based authentication — there is no OAuth flow.
- Click Link App. Autonomy lists the Expo apps visible to your account — pick the one you want to test. The webhook is registered automatically at link time.
- Choose a Test Case or Test Plan as the default run target.
- Choose the Environment whose configuration should apply.
- Select which platforms (iOS, Android, or both) should trigger runs.
- To report results as a GitHub check, enable Report checks and select the Linked repository. The Autonomy GitHub App must be installed on that repository.
Webhook registration
The webhook is registered automatically when you link an app. If automatic registration fails — for example, because the access token does not have permission to manage webhooks — a fallback is available:
eas webhook:create --event BUILD --url <callback-url> --secret <secret>To find the callback URL and webhook secret:
- In Autonomy, open the linked app's settings.
- Expand Manual fallback (eas webhook:create). Copy the Callback URL and the Webhook secret.
- Run the
eas webhook:createcommand above with those values.
The webhook secret is generated by Autonomy when you link the app. It is used to verify the signature of every inbound webhook.
Branch filters
Branch filters are not available for Expo EAS. EAS Build webhooks do not carry a branch name, so branch filters cannot be evaluated. The branch filter control is hidden in the dashboard, and the backend rejects non-empty branch filters for Expo projects.
Build profiles for testable artifacts
Autonomy needs a build profile in eas.json that produces installable artifacts:
- iOS: set
simulatortotrueto produce a.appSimulator build instead of a signed.ipa. A device.ipacannot be installed on a Simulator. - Android: set
buildTypetoapkto produce an.apkinstead of an.aab. An.aabcannot be installed on an emulator.
1{2 "build": {3 "autonomy-e2e": {4 "withoutCredentials": true,5 "ios": {6 "simulator": true7 },8 "android": {9 "buildType": "apk"10 }11 }12 }13}How a run is triggered
When EAS sends a BUILD webhook with a finished status:
- Autonomy looks up the linked app by the Expo project ID.
- The build context (preview, production, or branch) is checked against the app's configured trigger contexts.
- Branch filters are not applied — EAS Build webhooks carry no branch.
- The build platform (iOS or Android) is checked against the app's configured platforms.
- The artifact URL and kind are validated. Non-installable kinds (
.aab) and unrecognized formats are skipped. - If the artifact URL has expired (>30 days), the event is skipped.
- If a default test target is configured, Autonomy creates a run with the artifact as the mobile target.
The run receives the artifact as a URL source — the runner downloads it directly. Because EAS artifact URLs expire after 30 days, the download happens at trigger time.
Status reporting
Expo has no native check surface. Autonomy cannot post results directly to the Expo dashboard.
To report results, link a GitHub repository to the Expo app in Autonomy. When enabled, Autonomy posts a GitHub check run on the commit — the same mechanism used for Netlify and the GitHub App. The check appears on the pull request and can be made a required status check under branch protection.
Important: If Report checks is enabled but no GitHub repository is linked, results will only appear in the Autonomy dashboard — not on the pull request or anywhere in Expo. The dashboard shows a warning when this is the case.
EAS Workflow example
If you use EAS Workflows, add .eas/workflows/autonomy-e2e.yml to build testable artifacts. In the default webhook mode, the BUILD webhook fires automatically when each build completes — no trigger job is needed in the workflow.
name: 'Autonomy E2E — My App'
on:
push:
branches:
- 'main'
pull_request:
branches:
- '*'
jobs:
build_ios:
name: Build iOS for Autonomy
type: build
params:
platform: ios
profile: 'autonomy-e2e'
build_android:
name: Build Android for Autonomy
type: build
params:
platform: android
profile: 'autonomy-e2e'
# ─── No trigger job needed ───
# The EAS BUILD webhook fires automatically when each build completes.
# Autonomy ingests the webhook, creates QA runs, and reports back.For explicit triggering (bypassing the webhook), regenerate the workflow with dispatchMode: "explicit". This adds a trigger_autonomy job that POSTs to the Autonomy API after builds complete. The explicit mode requires three EAS secrets:
AUTONOMY_API_KEY— Autonomy programmatic API keyAUTONOMY_TEST_PLAN_ID— Convex document ID of the Test Plan to runAUTONOMY_ENVIRONMENT_SLUG— Autonomy environment slug (e.g."staging")
Set them with:
eas secret:create --name AUTONOMY_API_KEY --value <your-api-key>
eas secret:create --name AUTONOMY_TEST_PLAN_ID --value <plan-id>
eas secret:create --name AUTONOMY_ENVIRONMENT_SLUG --value <slug>The webhook integration and the workflow approach are independent — use whichever fits your pipeline. The webhook path is simpler (no shell scripts), while the explicit workflow path gives you control over exactly when the run triggers.
Monorepo and multiple apps
A single Expo account can have multiple apps. Link each app independently in Autonomy — each gets its own test target, environment, and platforms. All linked apps can share the same linked GitHub repository for status reporting.
Troubleshooting
No run starts when an EAS build finishes
Check the following:
- The Expo account is connected and showing Active in Autonomy.
- The Expo app is linked. Autonomy only watches linked apps.
- The app is enabled. A disabled app records the event but skips the run (
project disabled). - The webhook is registered. Check the Webhook section in the app's settings — it should show Registered. If not, use the manual fallback: run
eas webhook:createwith the URL and secret from the settings panel. - The build status is
finished. A build inin-progressorerroredstate does not trigger a run (deployment not ready). - The build context matches the app's configured trigger contexts. A mismatch skips with
context <x> not enabled. - A default test case or test plan is selected. Without one the event is skipped with
no default test target. - The build produced a downloadable artifact. If no artifact URL is present the event is skipped with
no build artifact.
The run fails to install the build
- iOS: confirm the EAS build profile sets
ios.simulator: true. A signed.ipafor a physical device cannot be installed on a Simulator. - Android: confirm the EAS build profile sets
android.buildType: "apk". An.aabcannot be installed on an emulator. Autonomy skips.aabartifacts withartifact kind aab is not installable.
The artifact format is not recognized
If the build produces a file with an extension Autonomy does not recognize (not .app, .apk, .ipa, or .aab), the event is skipped with artifact format not recognized: <ext>. Check the EAS build profile to ensure it produces a standard artifact.
The artifact URL is expired
EAS artifact URLs expire after 30 days. The event is skipped with build artifact expired. Trigger a new EAS build — Autonomy will receive a fresh webhook with a valid URL.
No check appears on the pull request
Expo has no native check surface. Status reporting requires:
- Report checks enabled on the linked app.
- A Linked repository selected.
- The Autonomy GitHub App installed on that repository.
If any of these are missing, the event's report status is unsupported and no check is posted. If checks are enabled but no repository is linked, results appear only in the Autonomy dashboard.