mirror of
https://github.com/status-im/react-native.git
synced 2025-02-26 08:05:34 +00:00
Summary: Recent changes that introduced Circle 2 (thanks ide and hramos for work on this) include special step for analyzing code. It takes PR number and processes the build. Unfortunately, that breaks all non-PR builds (including ones scheduled by me as a part of release step). This PR simply checks if such env variable is set and stops executing in case it's undefined. Also, I have updated the order of the tests so that most important (unit tests) are no longer shadowed by temporary eslint and flow breakage. The reason for this change is that flow has been broken for ~20 days which shadowed breakage in unit tests (addressed in my other PR). You can see build breaking before this change: https://circleci.com/gh/facebook/react-native/22391 And being green after: https://circleci.com/gh/facebook/react-native/22530 Closes https://github.com/facebook/react-native/pull/16302 Differential Revision: D6031348 Pulled By: hramos fbshipit-source-id: f1127a87faa872f413e9fcb780bdc1d5d587de2c
378 lines
13 KiB
YAML
378 lines
13 KiB
YAML
aliases:
|
|
- &restore-cache
|
|
keys:
|
|
- v1-dependencies-{{ .Branch }}-{{ checksum "package.json" }}
|
|
# Fallback in case checksum fails
|
|
- v1-dependencies-{{ .Branch }}-
|
|
- &save-cache
|
|
paths:
|
|
- node_modules
|
|
key: v1-dependencies-{{ .Branch }}-{{ checksum "package.json" }}
|
|
|
|
- &restore-cache-website
|
|
keys:
|
|
- v1-website-dependencies-{{ .Branch }}-{{ checksum "website/package.json" }}
|
|
# Fallback in case checksum fails
|
|
- v1-website-dependencies-{{ .Branch }}-
|
|
- &save-cache-website
|
|
paths:
|
|
- website/node_modules
|
|
key: v1-website-dependencies-{{ .Branch }}-{{ checksum "website/package.json" }}
|
|
|
|
- &restore-cache-danger
|
|
keys:
|
|
- v1-danger-dependencies-{{ .Branch }}-{{ checksum "danger/package.json" }}
|
|
# Fallback in case checksum fails
|
|
- v1-danger-dependencies-{{ .Branch }}-
|
|
- &save-cache-danger
|
|
paths:
|
|
- danger/node_modules
|
|
key: v1-danger-dependencies-{{ .Branch }}-{{ checksum "danger/package.json" }}
|
|
|
|
- &restore-cache-android-packages
|
|
keys:
|
|
- v1-android-sdkmanager-packages-{{ checksum "scripts/circle-ci-android-setup.sh" }}
|
|
# Fallback in case checksum fails
|
|
- v1-android-sdkmanager-packages-
|
|
- &save-cache-android-packages
|
|
paths:
|
|
- /opt/android/sdk/system-images/android-23
|
|
- /opt/android/sdk/system-images/android-19
|
|
- /opt/android/sdk/platforms/android-26
|
|
- /opt/android/sdk/platforms/android-23
|
|
- /opt/android/sdk/platforms/android-19
|
|
- /opt/android/sdk/build-tools/23.0.1
|
|
- /opt/android/sdk/add-ons/addon-google_apis-google-23
|
|
key: v1-android-sdkmanager-packages-{{ checksum "scripts/circle-ci-android-setup.sh" }}
|
|
|
|
- &restore-cache-ndk
|
|
keys:
|
|
- v1-android-ndk-r10e-32-64
|
|
- &save-cache-ndk
|
|
paths:
|
|
- /opt/ndk
|
|
key: v1-android-ndk-r10e-32-64
|
|
|
|
- &restore-cache-buck-downloads
|
|
keys:
|
|
- v1-buck-downloads-{{ .Branch }}-{{ checksum "ReactAndroid/build.gradle" }}
|
|
# Fallback in case checksum fails
|
|
- v1-buck-downloads-{{ .Branch }}-
|
|
- &save-cache-buck-downloads
|
|
paths:
|
|
- "ReactAndroid/build/downloads"
|
|
key: v1-buck-downloads-{{ .Branch }}-{{ checksum "ReactAndroid/build.gradle" }}
|
|
|
|
- &restore-cache-buck
|
|
keys:
|
|
- v1-buck-v2017.09.04.02
|
|
- &save-cache-buck
|
|
paths:
|
|
- ~/buck
|
|
key: v1-buck-v2017.09.04.02
|
|
|
|
- &restore-cache-watchman
|
|
keys:
|
|
- v1-watchman-v4.9.0
|
|
- &save-cache-watchman
|
|
paths:
|
|
- ~/watchman
|
|
key: v1-watchman-v4.9.0
|
|
|
|
defaults: &defaults
|
|
working_directory: ~/react-native
|
|
|
|
version: 2
|
|
jobs:
|
|
test-node-8:
|
|
<<: *defaults
|
|
docker:
|
|
- image: circleci/node:8
|
|
steps:
|
|
- checkout
|
|
- run: npm install --no-package-lock
|
|
- run: |
|
|
npm test -- --maxWorkers=2
|
|
npm run lint
|
|
npm run flow -- check
|
|
# eslint - doesn't run on non-PR builds
|
|
- run:
|
|
name: Analyze Code
|
|
command: |
|
|
if [ -n "$CIRCLE_PR_NUMBER" ]; then
|
|
npm install github@0.2.4
|
|
cat <(echo eslint; npm run lint --silent -- --format=json; echo flow; npm run flow --silent -- check --json) | GITHUB_TOKEN="af6ef0d15709bc91d""06a6217a5a826a226fb57b7" CI_USER=$CIRCLE_PROJECT_USERNAME CI_REPO=$CIRCLE_PROJECT_REPONAME PULL_REQUEST_NUMBER=$CIRCLE_PR_NUMBER node bots/code-analysis-bot.js
|
|
else
|
|
echo "Skipping code analysis."
|
|
fi
|
|
|
|
test-node-6:
|
|
<<: *defaults
|
|
docker:
|
|
- image: circleci/node:6.11.0
|
|
steps:
|
|
- checkout
|
|
- run: npm install
|
|
- run: |
|
|
npm test -- --maxWorkers=2
|
|
npm run lint
|
|
npm run flow -- check
|
|
|
|
test-node-4:
|
|
<<: *defaults
|
|
docker:
|
|
- image: circleci/node:4.8.4
|
|
steps:
|
|
- checkout
|
|
- run: npm install
|
|
- run: |
|
|
npm test -- --maxWorkers=2
|
|
npm run lint
|
|
npm run flow -- check
|
|
|
|
test-website:
|
|
<<: *defaults
|
|
docker:
|
|
- image: circleci/node:8
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: Install Dependencies
|
|
command: |
|
|
cd website
|
|
npm install --no-package-lock
|
|
- run:
|
|
name: Test Website
|
|
command: |
|
|
cd website
|
|
npm test
|
|
- run:
|
|
name: Test Build Static Website
|
|
command: cd website && node ./server/generate.js
|
|
|
|
deploy-website:
|
|
<<: *defaults
|
|
docker:
|
|
- image: circleci/node:8
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: Install Dependencies
|
|
command: |
|
|
cd website
|
|
npm install --no-package-lock
|
|
- run:
|
|
name: Build and Deploy Static Website
|
|
command: |
|
|
if [[ $CIRCLE_PROJECT_USERNAME == "facebook" && -z $CI_PULL_REQUEST && -z $CIRCLE_PR_USERNAME ]]; then
|
|
git config --global user.email "reactjs-bot@users.noreply.github.com"
|
|
git config --global user.name "Website Deployment Script"
|
|
echo "machine github.com login reactjs-bot password $GITHUB_TOKEN" > ~/.netrc
|
|
|
|
echo "Deploying website..."
|
|
cd website && GIT_USER=reactjs-bot npm run gh-pages
|
|
else
|
|
echo "Skipping deploy."
|
|
fi
|
|
|
|
build-js-bundle:
|
|
<<: *defaults
|
|
docker:
|
|
- image: circleci/node:8
|
|
steps:
|
|
- checkout
|
|
- run: npm install --no-package-lock
|
|
- run:
|
|
name: Build JavaScript Bundle
|
|
command: node local-cli/cli.js bundle --max-workers 2 --platform android --dev true --entry-file ReactAndroid/src/androidTest/js/TestBundle.js --bundle-output ReactAndroid/src/androidTest/assets/AndroidTestBundle.js
|
|
- persist_to_workspace:
|
|
root: ReactAndroid/src/androidTest/assets/
|
|
paths:
|
|
- AndroidTestBundle.js
|
|
- store_artifacts:
|
|
path: ReactAndroid/src/androidTest/assets/AndroidTestBundle.js
|
|
|
|
test-android:
|
|
<<: *defaults
|
|
docker:
|
|
- image: circleci/android:api-26-alpha
|
|
environment:
|
|
- TERM: "dumb"
|
|
- ADB_INSTALL_TIMEOUT: 10
|
|
- GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError"'
|
|
- ANDROID_NDK: '/opt/ndk/android-ndk-r10e'
|
|
- BUILD_THREADS: 2
|
|
steps:
|
|
- checkout
|
|
# CircleCI does not support interpolating env variables in the environment: step above.
|
|
# https://circleci.com/docs/2.0/env-vars/#interpolating-environment-variables-to-set-other-environment-variables
|
|
- run:
|
|
name: Configure PATH
|
|
command: |
|
|
echo 'export PATH=${ANDROID_NDK}:~/react-native/gradle-2.9/bin:~/buck/bin:$PATH' >> $BASH_ENV
|
|
source $BASH_ENV
|
|
# Configure dependencies
|
|
- run:
|
|
name: Install Build Dependencies
|
|
command: |
|
|
sudo apt-get update -y
|
|
sudo apt-get install ant autoconf automake g++ gcc libqt5widgets5 lib32z1 lib32stdc++6 make maven python-dev python3-dev qml-module-qtquick-controls qtdeclarative5-dev -y
|
|
- restore-cache: *restore-cache-android-packages
|
|
- run:
|
|
name: Install Android Packages
|
|
command: source scripts/circle-ci-android-setup.sh && getAndroidSDK
|
|
- save-cache: *save-cache-android-packages
|
|
- run:
|
|
name: Create Android Virtual Device
|
|
command: source scripts/circle-ci-android-setup.sh && createAVD
|
|
# Starting emulator in advance as it takes some time to boot.
|
|
- run:
|
|
name: Launch Android Virtual Device in Background
|
|
command: source scripts/circle-ci-android-setup.sh && launchAVD
|
|
background: true
|
|
# Continue configuring dependencies while AVD boots.
|
|
- run:
|
|
name: Create Android NDK Directory
|
|
command: |
|
|
if [[ ! -e /opt/ndk ]]; then
|
|
sudo mkdir /opt/ndk
|
|
fi
|
|
sudo chown ${USER:=$(/usr/bin/id -run)}:$USER /opt/ndk
|
|
- restore-cache: *restore-cache-ndk
|
|
- run:
|
|
name: Install Android NDK
|
|
command: source scripts/circle-ci-android-setup.sh && getAndroidNDK
|
|
- save-cache: *save-cache-ndk
|
|
- restore-cache: *restore-cache-buck
|
|
- run:
|
|
name: Install Buck
|
|
command: |
|
|
if [[ ! -e ~/buck ]]; then
|
|
git clone https://github.com/facebook/buck.git ~/buck --branch v2017.09.04.02 --depth=1
|
|
fi
|
|
cd ~/buck && ant
|
|
buck --version
|
|
- save-cache: *save-cache-buck
|
|
- run:
|
|
name: Install Node
|
|
command: |
|
|
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
|
|
sudo apt-get install -y nodejs
|
|
- run: npm install
|
|
# - restore-cache: *restore-cache-watchman
|
|
# - run:
|
|
# name: Install Watchman Dependencies
|
|
# command: |
|
|
# sudo apt-get update -y
|
|
# sudo apt-get install libtool pkg-config -y
|
|
# - run:
|
|
# name: Install Watchman
|
|
# command: |
|
|
# if [[ ! -e ~/watchman ]]; then
|
|
# mkdir ~/watchman
|
|
# git clone https://github.com/facebook/watchman.git ~/watchman --branch v4.9.0 --depth=1
|
|
# cd ~/watchman
|
|
# ./autogen.sh
|
|
# ./configure
|
|
# make
|
|
# fi
|
|
# cd ~/watchman
|
|
# sudo make install
|
|
# - save-cache: *save-cache-watchman
|
|
- restore-cache: *restore-cache-buck-downloads
|
|
- run:
|
|
name: Download Android App Dependencies
|
|
command: |
|
|
buck fetch ReactAndroid/src/test/java/com/facebook/react/modules
|
|
buck fetch ReactAndroid/src/main/java/com/facebook/react
|
|
buck fetch ReactAndroid/src/main/java/com/facebook/react/shell
|
|
buck fetch ReactAndroid/src/test/...
|
|
buck fetch ReactAndroid/src/androidTest/...
|
|
./gradlew :ReactAndroid:downloadBoost :ReactAndroid:downloadDoubleConversion :ReactAndroid:downloadFolly :ReactAndroid:downloadGlog :ReactAndroid:downloadJSCHeaders
|
|
- save-cache: *save-cache-buck-downloads
|
|
- run:
|
|
name: Build Android App
|
|
command: |
|
|
buck build ReactAndroid/src/main/java/com/facebook/react
|
|
buck build ReactAndroid/src/main/java/com/facebook/react/shell
|
|
# Wait for AVD to finish booting before running tests
|
|
- run:
|
|
name: Wait for Android Virtual Device
|
|
command: source scripts/circle-ci-android-setup.sh && waitForAVD
|
|
# The JavaScript Bundle is built as part of the build-js-bundle workflow, and is required for instrumentation tests.
|
|
- attach_workspace:
|
|
at: ReactAndroid/src/androidTest/assets/
|
|
- run:
|
|
name: Check for JavaScript Bundle
|
|
command: |
|
|
if [[ ! -e ReactAndroid/src/androidTest/assets/AndroidTestBundle.js ]]; then
|
|
echo "JavaScript bundle missing, verify build-js-bundle step"; exit 1;
|
|
else
|
|
echo "JavaScript bundle found.";
|
|
fi
|
|
# Tests
|
|
- run:
|
|
name: Compile Native Libs for Unit and Integration Tests
|
|
command: ./gradlew :ReactAndroid:packageReactNdkLibsForBuck -Pjobs=$BUILD_THREADS -Pcom.android.build.threadPoolSize=1
|
|
no_output_timeout: 6m
|
|
- run:
|
|
name: Unit Tests
|
|
command: buck test ReactAndroid/src/test/... --config build.threads=$BUILD_THREADS
|
|
# Integration Tests
|
|
- run:
|
|
name: Build and Install Test APK
|
|
command: source scripts/circle-ci-android-setup.sh && NO_BUCKD=1 retry3 buck install ReactAndroid/src/androidTest/buck-runner:instrumentation-tests --config build.threads=$BUILD_THREADS
|
|
# Failing test is expected
|
|
# - run:
|
|
# name: Run Installed APK with Tests
|
|
# command: node ./scripts/run-android-ci-instrumentation-tests.js --retries 3 --path ./ReactAndroid/src/androidTest/java/com/facebook/react/tests --package com.facebook.react.tests
|
|
# Should be disabled pending on https://our.intern.facebook.com/intern/tasks?t=16912142
|
|
# - run:
|
|
# name: Run Android End to End Tests
|
|
# command: source scripts/circle-ci-android-setup.sh && retry3 node ./scripts/run-ci-e2e-tests.js --android --js --retries 2
|
|
|
|
# post (always runs)
|
|
- run:
|
|
name: Collect Test Results
|
|
command: |
|
|
mkdir -p ~/junit/
|
|
find . -type f -regex ".*/build/test-results/debug/.*xml" -exec cp {} ~/junit/ \;
|
|
find . -type f -regex ".*/outputs/androidTest-results/connected/.*xml" -exec cp {} ~/junit/ \;
|
|
# TODO circle does not understand Buck's report, maybe need to transform xml slightly
|
|
# find . -type f -regex ".*/buck-out/gen/ReactAndroid/src/test/.*/.*xml" -exec cp {} ~/junit/ \;
|
|
when: always
|
|
- store_test_results:
|
|
path: ~/junit
|
|
- store_artifacts:
|
|
path: ~/junit
|
|
|
|
# Workflows enables us to run multiple jobs in parallel
|
|
workflows:
|
|
version: 2
|
|
test_node:
|
|
jobs:
|
|
- test-node-8
|
|
- test-node-6
|
|
# Node 4 tests are already failing on Circle 1.0
|
|
# - test-node-4
|
|
website:
|
|
jobs:
|
|
- test-website
|
|
- deploy-website:
|
|
requires:
|
|
- test-website
|
|
filters:
|
|
branches:
|
|
only:
|
|
- /.*-stable/
|
|
- master
|
|
test_android:
|
|
jobs:
|
|
- build-js-bundle:
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
- test-android:
|
|
requires:
|
|
- build-js-bundle
|