переменные среды в Expo при сборке с помощью GitLab

#react-native #continuous-integration #expo #gitlab-ci #continuous-delivery

#react-native #непрерывная интеграция #expo #gitlab-ci #непрерывная доставка

Вопрос:

Я пытаюсь создать React Native APK с помощью Expo (без извлечения). Мне удается локально получать переменные среды из файла .env, когда я делаю expo build:android это на своем локальном компьютере со всеми файлами проекта.

Когда я отправляю запрос в свой репозиторий GitLab, у меня есть этот файл .gitlab-ci.yml

 ---
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
  

У меня нет в репозитории файла .env из-за безопасности.

Где все эти переменные хранятся в каждой среде в GitLab: (работает отлично)

  1. EXPO_USERNAME = имя пользователя моей учетной записи разработчика для доступа к Expo.
  2. EXPO_PASSWORD = пароль учетной записи для доступа к Expo.

(не работает вообще при попытке сборки)

  1. EXPO_IOS_GOOGLE_API_KEY = «abcdefghijklmnopqrstuvwxyz»
  2. EXPO_ANDROID_GOOGLE_API_KEY = «abcdefghijklmnopqrstuvwxz»

Интересно, как я мог бы установить переменные среды Google Maps в приложение при запуске команды expo build: android через конвейер GitLab CI:

 - npx expo build:android
  

Сбой конвейеров GitLab CI / CD при сборке expo: android

Ответ №1:

Наконец, мне удалось заставить это работать следующим образом:

 ---
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
  

Где…

  ...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.
  

Таким образом, мне не нужно загружать мой env-файл в Gitlab. Мне нужно только определить свои переменные в настройках проекта в Gitlab.

Надеюсь, это кому-то поможет!