Expo

Get Started
Feature Preview

Triggering builds from CI

This document outlines how to trigger builds on EAS for your app from a CI environment such as GitHub Actions.
Before building with EAS on CI, we need to install and configure eas-cli. Then, we can trigger new builds with the eas build command.

Prerequisites

To trigger EAS builds from a CI environment, we first need to configure our app for EAS Build and successfully run a build from our local machine for each platform that we'd like to support on CI.
If you have run eas build -p [all|ios|android] successfully before, then you can continue.
If you haven't done this yet, please refer to the "Creating your first build" guide and return here when you're ready.

Next, we need to ensure that we can authenticate ourselves on CI as the owner of the app. This is possible by storing a personal access token in the EXPO_TOKEN environment variable in the CI settings.
See the guide for personal access tokens to learn how to create access tokens.

Now that we're authenticated with Expo CLI, we can create the build step.
To trigger new builds, we will add this script to our configuration:
npx eas-cli build --platform all --non-interactive
This will trigger a new build on EAS and print the URLs for the built files after the build completes.
Travis CI
---
language: node_js
node_js:
  - node
  - lts/*
cache:
  directories:
    - ~/.npm
before_script:
  - npm install -g npm@latest

jobs:
  include:
    - stage: build
      node_js: lts/*
      script:
        - npm ci
        - npx eas-cli build --platform all --non-interactive
Put this into .travis.yml in the root of your repository.
Gitlab CI
image: node:alpine

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - ~/.npm

stages:
  - build

before_script:
  - npm ci

eas-build:
  stage: build
  script:
    - apk add --no-cache bash
    - npx eas-cli build --platform all --non-interactive
Put this into .gitlab-ci.yml in the root of your repository.
Bitbucket Pipelines
image: node:alpine

definitions:
  caches:
    npm: ~/.npm

pipelines:
  default:
    - step:
        name: Build app
        deployment: test
        caches:
          - npm
        script:
          - apk add --no-cache bash
          - npm ci
          - npx eas-cli build --platform all --non-interactive
Put this into bitbucket-pipelines.yml in the root of your repository.
CircleCI
version: 2.1

executors:
  default:
    docker:
      - image: circleci/node:10
    working_directory: ~/my-app

commands:
  attach_project:
    steps:
      - attach_workspace:
          at: ~/my-app

jobs:
  eas_build:
    executor: default
    steps:
      - checkout
      - attach_project

      - run:
          name: Install dependencies
          command: npm ci

      - run:
          name: Trigger build
          command: npx eas-cli build --platform all --non-interactive

workflows:
  build_app:
    jobs:
      - eas_build:
          filters:
            branches:
              only: master
Put this into .circleci/config.yml in the root of your repository.
GitHub Actions
name: EAS Build
on:
  push:
    branches:
      - master
  workflow_dispatch:

jobs:
  build:
    name: Install and build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup Node.js
        uses: actions/setup-node@v1
        with:
          node-version: 10.x

      - name: Setup Expo
        uses: expo/expo-github-action@v5
        with:
          expo-version: 3.x
          expo-token: ${{ secrets.EXPO_TOKEN }}
          expo-cache: true

      - name: Install dependencies
        run: npm ci

      - name: Build on EAS
        run: npx eas-cli build --platform all --non-interactive
Put this into .github/workflows/eas-build.yml in the root of your repository.