GitHub Actions & Workflows ​
Overview ​
Pull Requests ​
Develop & Release ​
Scheduled ​
All workflows use EAS for builds and deployments.
Reusable Workflows ​
The following reusable workflows (prefixed with _) encapsulate common logic:
| Workflow | Purpose |
|---|---|
_build-or-update.yml | Fingerprint check, conditional build triggering, OTA publishing, report to Jira comment |
_run-e2e-tests.yml | E2E test execution on self-hosted runners |
Pull Request Workflow ​
pull-request.yml — Build and selective E2E testing for PRs targeting develop
When a PR is opened or updated, the workflow builds (or OTA-updates) the branch and runs whichever E2E tests the author selected via checkboxes in the PR description. Each test runs in parallel and results are reported as check runs and a summary comment on the PR.
Flow ​
Build Gating ​
E2E tests run on Jira ticket branches only (e.g. APY-1234-description). Non-ticket branches (e.g. chore/, docs/) automatically get the builds_disabled label and builds are skipped. Draft PRs are also skipped.
E2E Test Selection ​
Authors choose which E2E tests to run by checking boxes in the PR description. The workflow parses these checkboxes and runs each selected test as a separate parallel job. If no boxes are checked, the build still runs but E2E tests are skipped.
Re-running E2E Tests ​
Comment /e2e on the PR to re-run E2E tests without pushing a new commit. Only the PR author can trigger this. See E2E Retrigger for details.
Jira Integration ​
When a build completes, the workflow detects the Jira ticket key from the branch name and posts the build information directly to the Jira ticket as a comment.
Settings ​
| Setting | Value |
|---|---|
| APP_VARIANT | staging |
| EAS Profile | qa |
| Concurrency | Per PR (cancels in-progress on new commits) |
E2E Retrigger Workflow ​
pr-comment-e2e-trigger.yml — Re-run E2E tests via /e2e comment
Lets the PR author re-run E2E tests without pushing a new commit — useful when you've updated the test checkboxes in the PR description or want to retry after a flaky failure.
Flow ​
Only the PR author can trigger this. The workflow reacts to the comment with a rocket emoji to confirm it's been picked up. If no checkboxes are ticked, it posts a warning asking the author to select tests and try again.
Settings ​
| Setting | Value |
|---|---|
| Trigger | /e2e comment on a PR (author only) |
| Build | Reuses existing build (no new build triggered) |
Nightly Update Workflow ​
nightly-update-from-develop.yml — Keeps PR branches up to date with develop
Runs at 10pm UTC after working hours. Finds all eligible open PRs and merges develop into each one, then triggers builds/OTA updates. Posts a summary to Slack.
Eligibility ​
A PR is eligible if it is:
- Open and not a draft
- Targeting
develop - On a Jira ticket branch (e.g.
APY-1234-description)
Flow ​
Settings ​
| Setting | Value |
|---|---|
| Schedule | Daily 22:00 UTC |
| Slack | #engineer-app-nightly-e2e |
Nightly E2E Workflow ​
nightly-pull-request-e2e.yml — Full smoke suite per PR
Runs at midnight UTC, 2 hours after the nightly update, so PRs have fresh builds/OTAs. Finds the same eligible PRs and runs the full E2E smoke suite against each one. Results are reported via check runs, PR comments, and Slack.
Flow ​
Settings ​
| Setting | Value |
|---|---|
| Schedule | Daily 00:00 UTC |
| Tests | Full smoke suite |
| Slack | #engineer-app-nightly-e2e |
Develop Push Workflow ​
develop-push.yml — Continuous staging deployment
This is currently our primary method for QA testing. It is triggered whenever changes are pushed to the develop branch. It can also be triggered manually via workflow_dispatch.
The workflow uses Expo's continuous-deploy-fingerprint action which automatically detects native vs JS-only changes:
- Native changes detected — A full EAS build is triggered
- JS-only changes — An OTA update is pushed directly to existing builds
This provides a stable QA build that always represents the latest develop branch. QA and E2E tests use this build combined with channel surfing to swap between different OTA channels.
| Setting | Value |
|---|---|
| APP_VARIANT | staging |
| EAS Profile | qa |
| Branch | qa |
| Concurrency | develop (single concurrent run) |
Production Workflow ​
production.yml — Triggered by git tags
WARNING
Auto-submit to stores is currently broken due to a change in store ownership. Builds must be manually submitted for now.
Tag Formats ​
| Tag | Action | Example |
|---|---|---|
x.x.x | Full build + store submission | 1.2.3 |
x.x.x-* | OTA update only | 1.2.3-hotfix.1 |
E2E Builds Workflow ​
Deprecated
This workflow is being replaced by the Nightly Update and Nightly E2E workflows, which build and test per PR instead of producing a single nightly build.
e2e-builds.yml — Nightly test builds
| Setting | Value |
|---|---|
| Schedule | Daily 23:00 UTC |
| APP_VARIANT | staging |
| EAS Profile | qa |
VitePress Deploy Workflow ​
vitepress-deploy.yml — Documentation site deployment
This workflow builds and deploys the VitePress documentation site to GitHub Pages. It runs automatically when changes are pushed to develop, or can be triggered manually from the Actions tab.
| Setting | Value |
|---|---|
| Trigger | Push to develop / Manual |
| Concurrency | One deployment at a time, no cancellation |
| Output | GitHub Pages |
PR Labels ​
| Label | Effect |
|---|---|
builds_disabled | Auto-added on non-ticket branches; skips E2E tests |
native-changes | Auto-added when PR contains native changes |
no_ticket_found | Auto-added when no Jira key in branch name |
merge-conflict | Auto-added by nightly update when develop can't merge |
Troubleshooting ​
| Issue | Check |
|---|---|
| E2E not triggering | Branch name must have a Jira ticket prefix |
/e2e not working | Only the PR author can trigger; comment must be exactly /e2e |
| No Jira comment | Branch name has Jira key, JIRA_API_TOKEN set |
| Build taking too long | Check EAS dashboard for queue status |
| E2E flaky failures | Check self-hosted runner health, emulator state |
merge-conflict label | Resolve conflicts on your branch; label is automatically removed on the next successful nightly merge |
| Nightly skipping your PR | PR must be non-draft, target develop, and have a Jira ticket branch |