Giter Club home page Giter Club logo

expo-github-action's Introduction

expo github action

Publish, build or manage your Expo app with Github Actions!

releases builds license

Usage   —   Examples   —   Caveats   —   Changelog


What's inside?

With this Expo action, you have full access to Expo CLI and EAS CLI itself. It allows you to fully automate the expo publish or expo build process, leaving you with more time available for your project. There are some additional features included to make the usage of this action as simple as possible, like caching and authentication.

Configuration options

This action is customizable through variables; they are defined in the action.yml. Here is a summary of all the variables that you can use and their purpose.

variable default description
expo-version - Expo CLI version to install, skips when omitted.
expo-cache false If it should use the GitHub actions (remote) cache.
expo-cache-key - An optional custom (remote) cache key. (use with caution)
eas-version - EAS CLI version to install, skips when omitted. (latest is recommended)
eas-cache false If it should use the GitHub actions (remote) cache.
eas-cache-key - An optional custom (remote) cache key. (use with caution)
packager yarn The package manager to use. (e.g. npm)
token - The token of your Expo account (e.g. ${{ secrets.EXPO_TOKEN }})
username - The username of your Expo account (e.g. bycedric)
password - The password of your Expo account (e.g. ${{ secrets.EXPO_CLI_PASSWORD }})
patch-watchers true If it should patch the fs.inotify. limits.

Never hardcode expo-token or expo-password in your workflow, use secrets to store them.

Using latest for eas-version is recommened, you should always have the latest version of this CLI installed.

Example workflows

Before you dive into the workflow examples, you should know the basics of GitHub Actions. You can read more about this in the GitHub Actions documentation.

  1. Publish on any push to main
  2. Cache Expo CLI for other jobs
  3. Creating a new EAS build
  4. Test PRs and publish a review version
  5. Test PRs on multiple nodes and systems
  6. Test and build web every day at 08:00
  7. Authenticate using credentials

Publish on any push to main

Below you can see the example configuration to publish whenever the main branch is updated. The workflow listens to the push event and sets up Node 14 using the Setup Node Action. It also auto-authenticates when the token is provided.

name: Expo Publish
on:
  push:
    branches:
      - main
jobs:
  publish:
    name: Install and publish
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: 14.x
      - uses: expo/expo-github-action@v6
        with:
          expo-version: 4.x
          token: ${{ secrets.EXPO_TOKEN }}
      - run: yarn install
      - run: expo publish

Cache Expo CLI for other jobs

Below you can see a slightly modified version of the example above. In this one, we enabled the built-in cache that will reuse a previously installed Expo CLI. It skips the installation part and extracts the files directly, boosting the performance of your workflow.

You can read more about the cache here

name: Expo Publish
on:
  push:
    branches:
      - main
jobs:
  publish:
    name: Install and publish
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: 14.x
      - uses: expo/expo-github-action@v6
        with:
          expo-version: 4.x
          expo-cache: true
          token: ${{ secrets.EXPO_TOKEN }}
      - run: yarn install
      - run: expo publish

Creating a new EAS build

You can also install EAS CLI with this Github Action. Below we've swapped expo-version with eas-version, but you can also use them together. Both the token and username/password is shared between both Expo and EAS CLI.

We recommend using latest for eas-version to always have the most up-to-date version.

name: EAS build
on:
  push:
    branches:
      - main
jobs:
  build:
    name: Create new build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: 14.x
      - uses: expo/expo-github-action@v6
        with:
          eas-version: latest
          token: ${{ secrets.EXPO_TOKEN }}
      - run: yarn install
      - run: eas build

Test PRs and publish a review version

Reviewing pull requests can take some time if you have to read every line of code. To make this easier, you can publish the edited version of the PR using a release channel. Below you can see an example of a workflow that publishes and comments on te PR when the app is published.

name: Expo Review
on: [pull_request]
jobs:
  publish:
    name: Install and publish
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: 14.x
      - uses: expo/expo-github-action@v6
        with:
          expo-version: 4.x
          token: ${{ secrets.EXPO_TOKEN }}
      - run: yarn install
      - run: expo publish --release-channel=pr-${{ github.event.number }}
      - uses: unsplash/comment-on-pr@master
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          msg: App is ready for review, you can [see it here](https://expo.dev/@bycedric/use-expo?release-channel=pr-${{ github.event.number }}).

Test PRs on multiple nodes and systems

With GitHub Actions, it's reasonably easy to set up a matrix build and test the app on multiple environments. These matrixes can help to make sure your app runs smoothly on a broad set of different development machines.

If you don't need automatic authentication, you can omit the token variables.

name: Expo CI
on: [pull_request]
jobs:
  ci:
    name: Continuous Integration
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macOS-latest, windows-latest]
        node: [10, 12, 13]
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node }}
      - uses: expo/expo-github-action@v6
        with:
          expo-version: 4.x
      - run: yarn install
      - run: yarn test
      - run: expo doctor

Test and build web every day at 08:00

You can also schedule jobs by using the cron syntax. It can help to minimize the number of updates your users have to install.

name: Expo Daily CI
on:
  schedule:
    - cron: 0 8 * * *
jobs:
  ci:
    name: Daily Continuous Integration
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: 14.x
      - uses: expo/expo-github-action@v6
        with:
          expo-version: 4.x
      - run: yarn install
      - run: yarn test
      - run: expo build:web

Authenticate using credentials

Instead of using an access token, you can also authenticate using credentials. This is only possible when Expo CLI is installed.

name: Expo Publish
on:
  push:
    branches:
      - main
jobs:
  publish:
    name: Install and publish
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: 14.x
      - uses: expo/expo-github-action@v6
        with:
          expo-version: 4.x
          username: ${{ secrets.EXPO_CLI_USERNAME }}
          password: ${{ secrets.EXPO_CLI_PASSWORD }}
      - run: yarn install
      - run: expo publish

Things to know

Automatic Expo login

You need to authenticate for some Expo commands like expo publish and expo build. This action gives you configuration options to keep your workflow simple. You can choose if you want to authenticate using an EXPO_TOKEN or account credentials. Under the hood, it uses the EXPO_CLI_PASSWORD environment variable to make credentials authentication as secure as possible.

Note, this action only uses your token or credentials to authenticate with Expo. It doesn't store these anywhere.

Using the built-in cache

You can opt-in to caching the installation, making it a lot faster. Under the hood, it uses the @action/cache package to restore the Expo CLI installation. This action generates a unique cache key for the OS, used packager, and exact version of the Expo CLI. If you need more control over this cache, you can define a custom cache key with expo-cache-key.

Note, this cache will count towards your repo cache limit. The Expo and EAS CLI are stored in different caches.

ENOSPC errors on Linux

When you run expo publish or expo build, a new bundle is created. Creating these bundles require quite some resources. As of writing, GitHub actions has some small default values for the fs.inotify settings. Inside this action, we included a patch that increases these limits for the current workflow. It increases the max_user_instances, max_user_watches and max_queued_events to 524288. You can disable this patch by setting the patch-watchers to false.


with ❤️ byCedric

expo-github-action's People

Contributors

bycedric avatar dependabot[bot] avatar semantic-release-bot avatar mondash avatar bradbumbalough avatar daniel avatar iamdarshshah avatar greg-hamel avatar fiberjw avatar nicholascm avatar pcowgill avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.