Skip to content

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:

WorkflowPurpose
_build-or-update.ymlFingerprint check, conditional build triggering, OTA publishing, report to Jira comment
_run-e2e-tests.ymlE2E 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 ​

SettingValue
APP_VARIANTstaging
EAS Profileqa
ConcurrencyPer 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 ​

SettingValue
Trigger/e2e comment on a PR (author only)
BuildReuses 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 ​

SettingValue
ScheduleDaily 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 ​

SettingValue
ScheduleDaily 00:00 UTC
TestsFull 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.

SettingValue
APP_VARIANTstaging
EAS Profileqa
Branchqa
Concurrencydevelop (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 ​

TagActionExample
x.x.xFull build + store submission1.2.3
x.x.x-*OTA update only1.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

SettingValue
ScheduleDaily 23:00 UTC
APP_VARIANTstaging
EAS Profileqa

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.

SettingValue
TriggerPush to develop / Manual
ConcurrencyOne deployment at a time, no cancellation
OutputGitHub Pages

PR Labels ​

LabelEffect
builds_disabledAuto-added on non-ticket branches; skips E2E tests
native-changesAuto-added when PR contains native changes
no_ticket_foundAuto-added when no Jira key in branch name
merge-conflictAuto-added by nightly update when develop can't merge

Troubleshooting ​

IssueCheck
E2E not triggeringBranch name must have a Jira ticket prefix
/e2e not workingOnly the PR author can trigger; comment must be exactly /e2e
No Jira commentBranch name has Jira key, JIRA_API_TOKEN set
Build taking too longCheck EAS dashboard for queue status
E2E flaky failuresCheck self-hosted runner health, emulator state
merge-conflict labelResolve conflicts on your branch; label is automatically removed on the next successful nightly merge
Nightly skipping your PRPR must be non-draft, target develop, and have a Jira ticket branch