Экспо + Детокс + CircleCI - PullRequest
2 голосов
/ 29 июня 2019

В течение последних двух дней я искал хорошую настройку для использования Expo + Detox + CircleCI, чтобы приложение могло собираться во время процесса CI.

Локально, я могу заставить Экспо + Детокс работать, загрузив Exponent.app и поместив в мусорное ведро и запустив выставочный запуск (в другом терминале). Тем не менее, в Circle CI блокируется запуск выставки, поэтому существует эффективный способ добиться этого.

Я просмотрел множество примеров и не нашел ни одного четкого ответа с обновленными примерами, что является позором, если учесть, насколько популярной становится выставка.

Если у кого-нибудь есть пример файла CircleCI, которым вы могли бы поделиться, это было бы действительно здорово! Или, действительно, некоторая помощь в объяснении того, что может быть для достижения этой цели.

Я ценю, что это также вопрос для Детокса и CircleCI, но я подумал, что добавлю его сюда, так как многие могут захотеть узнать ответ?

Мой текущий код Circle-CI, который я искал назад и вперед, пытаясь найти решение, которое работает ...

# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2

defaults: &defaults
  working_directory: ~/iynk-react-app

jobs:

  test:
    <<: *defaults

    docker:
      - image: circleci/node:10

    steps:
      - checkout

      - run:
          name: Update npm
          command: 'sudo npm install -g npm@latest'

      - run:
          name: Install Firebase Tools
          command: sudo npm install -g firebase-tools@latest

      - restore_cache:
          name: Restore Yarn Package Cache
          keys:
            - yarn-packages-{{ checksum "yarn.lock" }}

      - run:
          name: Install Dependencies
          command: yarn install --frozen-lockfile

      - save_cache:
          name: Save Yarn Package Cache
          key: yarn-packages-{{ checksum "yarn.lock" }}
          paths:
            - ~/.cache/yarn

      - run: yarn test

      - run:
          name: Install modules in functions
          command: yarn --cwd ./functions --ignore-engines

  e2e:
    <<: *defaults

    macos:
      xcode: "10.2.1"

    steps:
      - run:
          # Note: the [ character is necessary to uniquely identify the iPhone 8 simulator, as the phone + watch simulator is also present in the build image: 
          # Will show what looks like an error - Instruments Usage Error: Unknown device specified: "iPhone 8 (12.2) [") - but it launch
          name: Pre-start simulator first to ensure that it is open
          command: xcrun instruments -w "iPhone 8 (12.2) [" || true

      - checkout

      - restore_cache:
            key: yarn-v1-{{ checksum "yarn.lock" }}-{{ arch }}

      - restore_cache:
          key: node-v1-{{ checksum "package.json" }}-{{ arch }}

      - run: yarn install --ignore-engines

      - save_cache:
          key: yarn-v1-{{ checksum "yarn.lock" }}-{{ arch }}
          paths:
            - ~/.cache/yarn

      - save_cache:
          key: node-v1-{{ checksum "package.json" }}-{{ arch }}
          paths:
            - node_modules

      - run:
          name: Install applesimutils
          command: |
            brew tap wix/brew
            brew install applesimutils

      - run:
          name: Install react-native, detox CLI and expo CLI
          command: |
            npm install -g react-native-cli
            npm install -g detox-cli
            npm install -g expo-cli

      - run:
          name: Prepare detox environment
          command: |
            detox clean-framework-cache && 
            detox build-framework-cache

      - run: 
          name: Download Exponent.app into bin
          command: |
            brew install wget
            ./scripts/setup.sh

      # - run:
      #     name: Install the downloaded version of the expo iOS app on the Simulator
      #     command: |
      #       xcrun simctl install booted ./bin/Exponent.app

      # - run:
      #     name: Login into Expo and publish to staging
      #     command: |
      #       npx expo login -u $EXPO_USERNAME -p $EXPO_PASSWORD
      #       npx expo publish --non-interactive --max-workers 1 --release-channel staging

      - run: 
          name: Run expo locally using (&) Run detox tests
          # shell: /bin/sh
          command: |
            yarn test:e2e & 
            expo start -c    

workflows:
  version: 2

  build_and_test:
    jobs:
      - test
      - e2e

Мои пакеты:

"detox": "12.3.0",
"detox-expo-helpers": "^0.6.0",
"expo-detox-hook": "^1.0.10",

Местные работы

Моя локальная установка запускается и тесты проходят. Это процесс на данный момент:

Убедитесь, что локальная среда настроена:

brew update
brew tap wix/brew
brew install --HEAD applesimutils
npm install -g detox-cli

Запустите скрипт установки:

./setup.sh

Тогда начинайте выставку.

expo start -c

Запустите симулятор, который вы планируете использовать для теста (поэтому, если вы выбрали iPhone X, запустите iPhone X и т. Д.). Вам не нужно запускать i с выставки, просто откройте программу Simulator.

open -a Simulator.app

Наконец, запустите детокс-тесты с другого терминала с помощью:

yarn test:e2e

Известные проблемы

Я не думаю, что это связано с тем, что я могу заставить мою установку работать локально ...

ОБНОВЛЕНИЕ 2 июля 2019

Я смогу пройти тесты, если соберу в свой круг ci:

      - run:
          name: Login into Expo and publish to staging (could update with $CIRCLE_BRANCH)
          command: |
            npx expo login -u $EXPO_USERNAME -p $EXPO_PASSWORD --non-interactive
            npx expo publish --non-interactive --max-workers 1 --release-channel testing

А затем в файл e2e / init.js загрузить из этого канала выпуска:

beforeAll(async () => {
  await detox.init(config);

  // Run from the remote build if in CI
  if (__CI__) {
    const url = 'exp://exp.host/@alexpchin/iynk?release-channel=testing';
    await device.relaunchApp({ url, sourceApp: 'host.exp.exponent' });
    await expect(element(by.label('Got it'))).toBeVisible();
    await element(by.label('Got it')).tap();
  }
});

Однако, если я использую это, я НЕ должен использовать reloadApp от detox-expo-helpers (в e2e / init.js):

beforeEach(async () => {
  await adapter.beforeEach();
  // If not CI, use `reloadApp` from `detox-expo-helpers`
  if (!__CI__) {
    await reloadApp();
  }
});

Это, очевидно, очень медленно, потому что вам нужно создавать новую сборку каждый раз, когда вы хотите протестировать пользовательский интерфейс, а не запускать из кода ветви ...

...