From 72ec569029be0a3252ec800aa0b6529cfbe5c860 Mon Sep 17 00:00:00 2001 From: Dan Caseley Date: Mon, 27 Jul 2020 21:51:35 +0100 Subject: [PATCH] [CHORE] Move Detox to Github Actions (#2340) * Initial workflow for iOS detox tests * Increase timeout * Parallelise tests and optimise when to build * Refine GH Actions logic * Improve Detox App caching * Upload failed test artifacts * Rate limiting aware data setup * Remove detox tests from Circle CI * Revert "Rate limiting aware data setup" This reverts commit d115604270f719de775018b9b06e89f2bfdc2dc7. Co-authored-by: Diego Mello --- .circleci/config.yml | 124 ------------------ .github/workflows/ios_detox.yml | 221 ++++++++++++++++++++++++++++++++ 2 files changed, 221 insertions(+), 124 deletions(-) create mode 100644 .github/workflows/ios_detox.yml diff --git a/.circleci/config.yml b/.circleci/config.yml index 899f6808e..73b81fb16 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -75,29 +75,6 @@ restore_cache: &restore-gradle-cache name: Restore gradle cache key: android-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }} -restore-brew-cache: &restore-brew-cache - name: Restore Brew cache - key: brew-{{ checksum "yarn.lock" }}-{{ checksum ".circleci/config.yml" }} - -save-brew-cache: &save-brew-cache - name: Save brew cache - key: brew-{{ checksum "yarn.lock" }}-{{ checksum ".circleci/config.yml" }} - paths: - - /usr/local/Homebrew - -install-apple-sim-utils: &install-apple-sim-utils - name: Install appleSimUtils - command: | - brew update - brew tap wix/brew - brew install wix/brew/applesimutils - -rebuild-detox: &rebuild-detox - name: Rebuild Detox framework cache - command: | - npx detox clean-framework-cache - npx detox build-framework-cache - version: 2.1 # EXECUTORS @@ -107,39 +84,6 @@ executors: environment: <<: *bash-env -# COMMANDS -commands: - detox-test: - parameters: - folder: - type: string - steps: - - checkout - - - attach_workspace: - at: . - - - restore_cache: *restore-npm-cache-mac - - - restore_cache: *restore-brew-cache - - - run: *install-node - - - run: *install-apple-sim-utils - - - run: *install-npm-modules - - - run: *rebuild-detox - - - run: - name: Test - command: | - npx detox test << parameters.folder >> --configuration ios.sim.release --cleanup - when: always - - - store_artifacts: - path: ./artifacts - # JOBS jobs: lint-testunit: @@ -174,57 +118,6 @@ jobs: - save_cache: *save-npm-cache-linux - # E2E - e2e-build: - executor: mac-env - - steps: - - checkout - - - restore_cache: *restore-npm-cache-mac - - - restore_cache: *restore-brew-cache - - - run: *install-node - - - run: *install-apple-sim-utils - - - run: *install-npm-modules - - - run: *rebuild-detox - - - run: - name: Build - command: | - npx detox build --configuration ios.sim.release - - - persist_to_workspace: - root: . - paths: - - ios/build/Build/Products/Release-iphonesimulator/RocketChatRN.app - - - save_cache: *save-npm-cache-mac - - - save_cache: *save-brew-cache - - e2e-test-onboarding: - executor: mac-env - steps: - - detox-test: - folder: "./e2e/tests/onboarding" - - e2e-test-room: - executor: mac-env - steps: - - detox-test: - folder: "./e2e/tests/room" - - e2e-test-assorted: - executor: mac-env - steps: - - detox-test: - folder: "./e2e/tests/assorted" - # Android builds android-build: <<: *defaults @@ -433,23 +326,6 @@ workflows: jobs: - lint-testunit - - e2e-hold: - type: approval - requires: - - lint-testunit - - e2e-build: - requires: - - e2e-hold - - e2e-test-onboarding: - requires: - - e2e-build - - e2e-test-room: - requires: - - e2e-build - - e2e-test-assorted: - requires: - - e2e-build - - ios-build: requires: - lint-testunit diff --git a/.github/workflows/ios_detox.yml b/.github/workflows/ios_detox.yml new file mode 100644 index 000000000..c8c33c583 --- /dev/null +++ b/.github/workflows/ios_detox.yml @@ -0,0 +1,221 @@ +name: iOS Detox + +on: [pull_request] + +jobs: + detox-build: + runs-on: macos-latest + timeout-minutes: 60 + + env: + DEVELOPER_DIR: /Applications/Xcode_11.5.app + + steps: + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: Generate Detox app cache key + run: echo $(git rev-parse HEAD:app) > "./app-git-revision.txt" + + - name: Cache Detox app + uses: actions/cache@v1 + id: detoxappcache + with: + path: ios/build/Build/Products/Release-iphonesimulator + key: iOSDetoxRelease-v4-${{ hashFiles('yarn.lock') }}-${{ hashFiles('ios/Podfile.lock') }}-${{ hashFiles('./app-git-revision.txt') }} + + - name: Node + if: steps.detoxappcache.outputs.cache-hit != 'true' + uses: actions/setup-node@v1 + + - name: Cache node modules + if: steps.detoxappcache.outputs.cache-hit != 'true' + uses: actions/cache@v1 + id: npmcache + with: + path: node_modules + key: node-modules-${{ hashFiles('**/yarn.lock') }} + + - name: Rebuild detox + if: steps.detoxappcache.outputs.cache-hit != 'true' && steps.npmcache.outputs.cache-hit == 'true' + run: yarn detox clean-framework-cache && yarn detox build-framework-cache + + - name: Install Dependencies + if: steps.detoxappcache.outputs.cache-hit != 'true' && steps.npmcache.outputs.cache-hit != 'true' + run: yarn install + + - run: yarn detox build e2e --configuration ios.sim.release + if: steps.detoxappcache.outputs.cache-hit != 'true' + + detox-test-rooms: + needs: detox-build + runs-on: macos-latest + timeout-minutes: 60 + + env: + DEVELOPER_DIR: /Applications/Xcode_11.5.app + + steps: + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: Generate Detox app cache key + run: echo $(git rev-parse HEAD:app) > "./app-git-revision.txt" + + - name: Cache Detox app + uses: actions/cache@v1 + id: detoxappcache + with: + path: ios/build/Build/Products/Release-iphonesimulator + key: iOSDetoxRelease-v4-${{ hashFiles('yarn.lock') }}-${{ hashFiles('ios/Podfile.lock') }}-${{ hashFiles('./app-git-revision.txt') }} + + - name: Check for Detox app + if: steps.detoxappcache.outputs.cache-hit != 'true' + run: exit 1 + + - name: Node + uses: actions/setup-node@v1 + + - name: Cache node modules + uses: actions/cache@v1 + id: npmcache + with: + path: node_modules + key: node-modules-${{ hashFiles('**/yarn.lock') }} + + - name: Rebuild detox + if: steps.npmcache.outputs.cache-hit == 'true' + run: yarn detox clean-framework-cache && yarn detox build-framework-cache + + - name: Install Dependencies + if: steps.npmcache.outputs.cache-hit != 'true' + run: yarn install + + - run: brew tap wix/brew + - run: brew install applesimutils + - run: yarn detox test e2e/tests/room --configuration ios.sim.release --cleanup + + - name: Upload test artifacts + if: ${{ failure() }} + uses: actions/upload-artifact@v2 + with: + name: artifacts + path: artifacts + + detox-test-assorted: + needs: detox-build + runs-on: macos-latest + timeout-minutes: 60 + + env: + DEVELOPER_DIR: /Applications/Xcode_11.5.app + + steps: + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: Generate Detox app cache key + run: echo $(git rev-parse HEAD:app) > "./app-git-revision.txt" + + - name: Cache Detox app + uses: actions/cache@v1 + id: detoxappcache + with: + path: ios/build/Build/Products/Release-iphonesimulator + key: iOSDetoxRelease-v4-${{ hashFiles('yarn.lock') }}-${{ hashFiles('ios/Podfile.lock') }}-${{ hashFiles('./app-git-revision.txt') }} + + - name: Check for Detox app + if: steps.detoxappcache.outputs.cache-hit != 'true' + run: exit 1 + + - name: Node + uses: actions/setup-node@v1 + + - name: Cache node modules + uses: actions/cache@v1 + id: npmcache + with: + path: node_modules + key: node-modules-${{ hashFiles('**/yarn.lock') }} + + - name: Rebuild detox + if: steps.npmcache.outputs.cache-hit == 'true' + run: yarn detox clean-framework-cache && yarn detox build-framework-cache + + - name: Install Dependencies + if: steps.npmcache.outputs.cache-hit != 'true' + run: yarn install + + - run: brew tap wix/brew + - run: brew install applesimutils + - run: yarn detox test e2e/tests/assorted --configuration ios.sim.release --cleanup + + - name: Upload test artifacts + if: ${{ failure() }} + uses: actions/upload-artifact@v2 + with: + name: artifacts + path: artifacts + + detox-test-onboarding: + needs: detox-build + runs-on: macos-latest + timeout-minutes: 60 + + env: + DEVELOPER_DIR: /Applications/Xcode_11.5.app + + steps: + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: Generate Detox app cache key + run: echo $(git rev-parse HEAD:app) > "./app-git-revision.txt" + + - name: Cache Detox app + uses: actions/cache@v1 + id: detoxappcache + with: + path: ios/build/Build/Products/Release-iphonesimulator + key: iOSDetoxRelease-v4-${{ hashFiles('yarn.lock') }}-${{ hashFiles('ios/Podfile.lock') }}-${{ hashFiles('./app-git-revision.txt') }} + + - name: Check for Detox app + if: steps.detoxappcache.outputs.cache-hit != 'true' + run: exit 1 + + - name: Node + uses: actions/setup-node@v1 + + - name: Cache node modules + uses: actions/cache@v1 + id: npmcache + with: + path: node_modules + key: node-modules-${{ hashFiles('**/yarn.lock') }} + + - name: Rebuild detox + if: steps.npmcache.outputs.cache-hit == 'true' + run: yarn detox clean-framework-cache && yarn detox build-framework-cache + + - name: Install Dependencies + if: steps.npmcache.outputs.cache-hit != 'true' + run: yarn install + + - run: brew tap wix/brew + - run: brew install applesimutils + - run: yarn detox test e2e/tests/onboarding --configuration ios.sim.release --cleanup + + - name: Upload test artifacts + if: ${{ failure() }} + uses: actions/upload-artifact@v2 + with: + name: artifacts + path: artifacts