Autonomy Docs
Integrations

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 (.app archive for iOS, .apk for 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 .apk builds are testable. An .aab artifact is skipped with artifact kind aab is not installable.
  • Unrecognized artifact formats (neither .app, .apk, .ipa, nor .aab) are skipped with artifact 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.
  1. Open Settings → Integrations in the Autonomy dashboard.
  2. Click Connect on the Expo EAS card. Paste an Expo robot access token. Expo uses token-based authentication — there is no OAuth flow.
  3. 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.
  4. Choose a Test Case or Test Plan as the default run target.
  5. Choose the Environment whose configuration should apply.
  6. Select which platforms (iOS, Android, or both) should trigger runs.
  7. 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:

  1. In Autonomy, open the linked app's settings.
  2. Expand Manual fallback (eas webhook:create). Copy the Callback URL and the Webhook secret.
  3. Run the eas webhook:create command 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 simulator to true to produce a .app Simulator build instead of a signed .ipa. A device .ipa cannot be installed on a Simulator.
  • Android: set buildType to apk to produce an .apk instead of an .aab. An .aab cannot be installed on an emulator.
eas.jsonjson
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:

  1. Autonomy looks up the linked app by the Expo project ID.
  2. The build context (preview, production, or branch) is checked against the app's configured trigger contexts.
  3. Branch filters are not applied — EAS Build webhooks carry no branch.
  4. The build platform (iOS or Android) is checked against the app's configured platforms.
  5. The artifact URL and kind are validated. Non-installable kinds (.aab) and unrecognized formats are skipped.
  6. If the artifact URL has expired (>30 days), the event is skipped.
  7. 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.

.eas/workflows/autonomy-e2e.ymlyaml
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 key
  • AUTONOMY_TEST_PLAN_ID — Convex document ID of the Test Plan to run
  • AUTONOMY_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:create with the URL and secret from the settings panel.
  • The build status is finished. A build in in-progress or errored state 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 .ipa for a physical device cannot be installed on a Simulator.
  • Android: confirm the EAS build profile sets android.buildType: "apk". An .aab cannot be installed on an emulator. Autonomy skips .aab artifacts with artifact 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:

  1. Report checks enabled on the linked app.
  2. A Linked repository selected.
  3. 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.

On this page