Warm tip: This article is reproduced from serverfault.com, please click

environment variables in Expo when building with GitLab

发布于 2020-11-13 12:53:05

I'm trying to build a React Native APK with Expo (without ejecting). I can manage to locally get my environment variables from .env file when I do expo build:android in my local machine with all the project files.

When I do a push to my GitLab repository, I have this .gitlab-ci.yml file

---
image: node:alpine
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - ~/.npm
    - .jest
stages:
  - test
  - deploy
before_script:
  - npm ci
jest-tests:
  stage: test
  script:
    - npx jest --ci --passWithNoTests
expo-deployments:
  stage: deploy
  script:
    - apk add --no-cache bash
    - npx expo login -u $EXPO_USERNAME -p $EXPO_PASSWORD
    - npx expo build:android --EXPO_ANDROID_GOOGLE_API_KEY $EXPO_ANDROID_GOOGLE_API_KEY --EXPO_IOS_GOOGLE_API_KEY $EXPO_IOS_GOOGLE_API_KEY --release-channel staging --non-interactive
    - EXPO_ANDROID_GOOGLE_API_KEY=$EXPO_ANDROID_GOOGLE_API_KEY; EXPO_IOS_GOOGLE_API_KEY=$EXPO_IOS_GOOGLE_API_KEY; expo build:android --release-channel staging --non-interactive

I don't have in the repo the .env file, because of security.

Where all this variables are stored within each environment in GitLab: (working perfectly)

  1. EXPO_USERNAME = the username of my development account to access Expo.
  2. EXPO_PASSWORD = the password of the account to access Expo.

(not working at all when trying to build)

  1. EXPO_IOS_GOOGLE_API_KEY = "abcdefghijklmnopqrstuvwxyz"
  2. EXPO_ANDROID_GOOGLE_API_KEY = "abcdefghijklmnopqrstuvwxz"

I wonder how could I set the Google Maps environment variables into the app when running the expo build:android command via GitLab CI pipeline:

- npx expo build:android

GitLab CI/CD pipelines failed at expo build:android

Questioner
Gonxis
Viewed
0
Gonxis 2020-11-30 15:34:02

Finally I could manage to make this work the following way:

---
image: node:alpine
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - ~/.npm
    - .jest
stages:
  - test
  - deploy
before_script:
  - npm ci
  - ANDROID_GOOGLE_MAPS_API_KEY=${CI_COMMIT_BRANCH}_EXPO_ANDROID_GOOGLE_API_KEY
  - IOS_GOOGLE_MAPS_API_KEY=${CI_COMMIT_BRANCH}_EXPO_IOS_GOOGLE_API_KEY
  - export android=$( eval echo \$$ANDROID_GOOGLE_MAPS_API_KEY )
  - export ios=$( eval echo \$$IOS_GOOGLE_MAPS_API_KEY )
jest-tests:
  stage: test
  script:
    - npx jest --ci --passWithNoTests
expo-deployments:
  stage: deploy
  script:
    - echo "EXPO_ANDROID_GOOGLE_API_KEY=$android" >> .env
    - echo "EXPO_IOS_GOOGLE_API_KEY=$ios" >> .env
    - apk add --no-cache bash
    - npx expo login -u $EXPO_USERNAME -p $EXPO_PASSWORD
    - npx expo build:android --release-channel staging --non-interactive

Where...

 ...CI_COMMIT_BRANCH is development|staging|production depending which branch in gitlab I am using.
 ...development_EXPO_ANDROID_GOOGLE_API_KEY | staging_EXPO_ANDROID_GOOGLE_API_KEY | production_EXPO_ANDROID_GOOGLE_API_KEY are variables that are stored at the Gitlab project.
 ... I am generating the .env file every time I run the script and saving there my variables with the respective value with: echo "EXPO_ANDROID_GOOGLE_API_KEY=$android" >> .env.

This way I don't need to push my .env file into Gitlab. I only need to define my variables in the settings of the project at Gitlab.

Hope this help to someone!