mirror of
https://github.com/facebook/react-native.git
synced 2024-11-22 06:29:46 +00:00
fc9dec9a35
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/33209 Downloads Kotlin compiler JARs with Buck before starting docker build. This solution is slower than checking in JARs directly, but it allows to keep lighter size of the repo for people who want a complete checkout. Changelog: [Internal] - Update CI build to download Kotlin jars for buck Reviewed By: cortinico Differential Revision: D34582932 fbshipit-source-id: 290398579ce2a4d57c7af318c66526689db6073c
1055 lines
34 KiB
YAML
1055 lines
34 KiB
YAML
version: 2.1
|
|
|
|
# -------------------------
|
|
# ORBS
|
|
# -------------------------
|
|
|
|
orbs:
|
|
win: circleci/windows@2.4.0
|
|
|
|
# -------------------------
|
|
# DEFAULTS
|
|
# -------------------------
|
|
defaults: &defaults
|
|
working_directory: ~/react-native
|
|
environment:
|
|
- GIT_COMMIT_DESC: git log --format=oneline -n 1 $CIRCLE_SHA1
|
|
# The public github tokens are publicly visible by design
|
|
- PUBLIC_PULLBOT_GITHUB_TOKEN_A: &github_pullbot_token_a "a6edf8e8d40ce4e8b11a"
|
|
- PUBLIC_PULLBOT_GITHUB_TOKEN_B: &github_pullbot_token_b "150e1341f4dd9c944d2a"
|
|
- PUBLIC_ANALYSISBOT_GITHUB_TOKEN_A: &github_analysisbot_token_a "312d354b5c36f082cfe9"
|
|
- PUBLIC_ANALYSISBOT_GITHUB_TOKEN_B: &github_analysisbot_token_b "07973d757026bdd9f196"
|
|
|
|
# -------------------------
|
|
# EXECUTORS
|
|
# -------------------------
|
|
executors:
|
|
nodelts:
|
|
<<: *defaults
|
|
docker:
|
|
# Note: Version set separately for Windows builds, see below.
|
|
- image: circleci/node:16
|
|
nodeprevlts:
|
|
<<: *defaults
|
|
docker:
|
|
- image: circleci/node:14
|
|
reactnativeandroid:
|
|
<<: *defaults
|
|
docker:
|
|
- image: reactnativecommunity/react-native-android:5.2
|
|
resource_class: "large"
|
|
environment:
|
|
- TERM: "dumb"
|
|
- ADB_INSTALL_TIMEOUT: 10
|
|
- GRADLE_OPTS: '-Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-XX:+HeapDumpOnOutOfMemoryError"'
|
|
- BUILD_THREADS: 2
|
|
# Repeated here, as the environment key in this executor will overwrite the one in defaults
|
|
- PUBLIC_ANALYSISBOT_GITHUB_TOKEN_A: *github_analysisbot_token_a
|
|
- PUBLIC_ANALYSISBOT_GITHUB_TOKEN_B: *github_analysisbot_token_b
|
|
- PUBLIC_PULLBOT_GITHUB_TOKEN_A: *github_pullbot_token_a
|
|
- PUBLIC_PULLBOT_GITHUB_TOKEN_B: *github_pullbot_token_b
|
|
reactnativeios:
|
|
<<: *defaults
|
|
macos:
|
|
xcode: &_XCODE_VERSION "13.0.0"
|
|
|
|
# -------------------------
|
|
# COMMANDS
|
|
# -------------------------
|
|
commands:
|
|
|
|
setup_artifacts:
|
|
steps:
|
|
- run:
|
|
name: Initial Setup
|
|
command: mkdir -p ./reports/{buck,build,junit,outputs}
|
|
|
|
setup_ruby:
|
|
steps:
|
|
- restore_cache:
|
|
key: 1-gems-{{ checksum "Gemfile.lock" }}
|
|
- run: bundle check || bundle install --path vendor/bundle --clean
|
|
- save_cache:
|
|
key: 1-gems-{{ checksum "Gemfile.lock" }}
|
|
paths:
|
|
- vendor/bundle
|
|
|
|
run_yarn:
|
|
steps:
|
|
- restore_cache:
|
|
keys:
|
|
- v5-yarn-cache-{{ .Environment.CIRCLE_JOB }}-{{ arch }}-{{ checksum "yarn.lock" }}
|
|
- v5-yarn-cache-{{ .Environment.CIRCLE_JOB }}-{{ arch }}
|
|
- v5-yarn-cache-{{ .Environment.CIRCLE_JOB }}
|
|
- run:
|
|
name: "Yarn: Install Dependencies"
|
|
command: |
|
|
# Skip yarn install on metro bump commits as the package is not yet
|
|
# available on npm
|
|
if [[ $(echo "$GIT_COMMIT_DESC" | grep -c "Bump metro@") -eq 0 ]]; then
|
|
yarn install --non-interactive --cache-folder ~/.cache/yarn
|
|
fi
|
|
- save_cache:
|
|
paths:
|
|
- ~/.cache/yarn
|
|
key: v5-yarn-cache-{{ .Environment.CIRCLE_JOB }}-{{ arch }}-{{ checksum "yarn.lock" }}
|
|
|
|
install_buck_tooling:
|
|
steps:
|
|
- restore_cache:
|
|
keys:
|
|
- v3-buck-v2019.01.10.01-{{ checksum "scripts/circleci/buck_fetch.sh" }}}
|
|
- run:
|
|
name: Install BUCK
|
|
command: |
|
|
buck --version
|
|
# Install related tooling
|
|
if [[ ! -e ~/okbuck ]]; then
|
|
git clone https://github.com/uber/okbuck.git ~/okbuck --depth=1
|
|
fi
|
|
- save_cache:
|
|
paths:
|
|
- ~/buck
|
|
- ~/okbuck
|
|
key: v3-buck-v2019.01.10.01-{{ checksum "scripts/circleci/buck_fetch.sh" }}
|
|
|
|
install_github_bot_deps:
|
|
steps:
|
|
- run:
|
|
name: "Yarn: Install dependencies (GitHub bots)"
|
|
command: cd bots && yarn install --non-interactive --cache-folder ~/.cache/yarn
|
|
|
|
brew_install:
|
|
parameters:
|
|
package:
|
|
description: Homebrew package to install
|
|
type: string
|
|
steps:
|
|
- run:
|
|
name: "Brew: Install << parameters.package >>"
|
|
command: HOMEBREW_NO_AUTO_UPDATE=1 brew install << parameters.package >> >/dev/null
|
|
|
|
with_brew_cache_span:
|
|
parameters:
|
|
steps:
|
|
type: steps
|
|
steps:
|
|
- restore_cache:
|
|
keys:
|
|
- v4-brew
|
|
- steps: << parameters.steps >>
|
|
- save_cache:
|
|
paths:
|
|
- /usr/local/Homebrew
|
|
- ~/Library/Caches/Homebrew
|
|
key: v4-brew
|
|
|
|
with_rntester_pods_cache_span:
|
|
parameters:
|
|
steps:
|
|
type: steps
|
|
steps:
|
|
- run:
|
|
name: Setup CocoaPods cache
|
|
# Copy packages/rn-tester/Podfile.lock since it can be changed by pod install
|
|
command: cp packages/rn-tester/Podfile.lock packages/rn-tester/Podfile.lock.bak
|
|
- restore_cache:
|
|
keys:
|
|
# The committed lockfile is generated using USE_FRAMEWORKS=0 and USE_HERMES=0 so it could load an outdated cache if a change
|
|
# only affects the frameworks or hermes config. To help prevent this also cache based on the content of Podfile.
|
|
- v3-pods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile.lock.bak" }}-{{ checksum "packages/rn-tester/Podfile" }}
|
|
- steps: << parameters.steps >>
|
|
- save_cache:
|
|
paths:
|
|
- packages/rn-tester/Pods
|
|
key: v3-pods-{{ .Environment.CIRCLE_JOB }}-{{ checksum "packages/rn-tester/Podfile.lock.bak" }}-{{ checksum "packages/rn-tester/Podfile" }}
|
|
|
|
download_gradle_dependencies:
|
|
steps:
|
|
- restore_cache:
|
|
keys:
|
|
- v1-gradle-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "ReactAndroid/gradle.properties" }}
|
|
- run:
|
|
name: Download Dependencies Using Gradle
|
|
command: ./scripts/circleci/gradle_download_deps.sh
|
|
- save_cache:
|
|
paths:
|
|
- ~/.gradle
|
|
- ReactAndroid/build/downloads
|
|
- ReactAndroid/build/third-party-ndk
|
|
key: v1-gradle-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "ReactAndroid/gradle.properties" }}
|
|
|
|
download_buck_dependencies:
|
|
steps:
|
|
- run:
|
|
name: Download Dependencies Using Buck
|
|
command: ./scripts/circleci/buck_fetch.sh
|
|
|
|
run_e2e:
|
|
parameters:
|
|
platform:
|
|
description: Target platform
|
|
type: enum
|
|
enum: ["android", "ios", "js"]
|
|
default: "js"
|
|
retries:
|
|
description: How many times the job should try to run these tests
|
|
type: integer
|
|
default: 3
|
|
steps:
|
|
- run:
|
|
name: "Run Tests: << parameters.platform >> End-to-End Tests"
|
|
command: node ./scripts/run-ci-e2e-tests.js --<< parameters.platform >> --retries << parameters.retries >>
|
|
|
|
report_bundle_size:
|
|
parameters:
|
|
platform:
|
|
description: Target platform
|
|
type: enum
|
|
enum: ["android", "ios"]
|
|
steps:
|
|
- install_github_bot_deps
|
|
- run:
|
|
name: Report size of RNTester.app (analysis-bot)
|
|
command: GITHUB_TOKEN="$PUBLIC_ANALYSISBOT_GITHUB_TOKEN_A""$PUBLIC_ANALYSISBOT_GITHUB_TOKEN_B" scripts/circleci/report-bundle-size.sh << parameters.platform >> || true
|
|
|
|
# -------------------------
|
|
# JOBS
|
|
# -------------------------
|
|
jobs:
|
|
# -------------------------
|
|
# JOBS: Analyze PR
|
|
# -------------------------
|
|
# Analyze pull request and raise any lint/flow issues.
|
|
# Issues will be posted to the PR itself via GitHub bots.
|
|
# This workflow should only fail if the bots fail to run.
|
|
analyze_pr:
|
|
executor: reactnativeandroid
|
|
steps:
|
|
- checkout
|
|
- run_yarn
|
|
|
|
- install_github_bot_deps
|
|
|
|
# Note: The yarn gpg key needs to be refreshed to work around https://github.com/yarnpkg/yarn/issues/7866
|
|
- run:
|
|
name: Install additional GitHub bot dependencies
|
|
# TEMP: Added workaround from https://github.com/nodesource/distributions/issues/1266#issuecomment-932583579
|
|
command: |
|
|
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
|
apt update && apt install -y shellcheck jq
|
|
apt-get -y install openssl ca-certificates
|
|
update-ca-certificates
|
|
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
|
|
apt update && apt install -y shellcheck jq
|
|
|
|
- run:
|
|
name: Run linters against modified files (analysis-bot)
|
|
command: GITHUB_TOKEN="$PUBLIC_ANALYSISBOT_GITHUB_TOKEN_A""$PUBLIC_ANALYSISBOT_GITHUB_TOKEN_B" yarn lint-ci
|
|
when: always
|
|
|
|
- run:
|
|
name: Analyze Pull Request (pull-bot)
|
|
command: |
|
|
cd bots
|
|
DANGER_GITHUB_API_TOKEN="$PUBLIC_PULLBOT_GITHUB_TOKEN_A""$PUBLIC_PULLBOT_GITHUB_TOKEN_B" yarn danger ci --use-github-checks
|
|
when: always
|
|
|
|
# -------------------------
|
|
# JOBS: Analyze Code
|
|
# -------------------------
|
|
analyze_code:
|
|
executor: reactnativeandroid
|
|
steps:
|
|
- checkout
|
|
- setup_artifacts
|
|
- run_yarn
|
|
|
|
- run:
|
|
name: Lint code
|
|
command: scripts/circleci/exec_swallow_error.sh yarn lint --format junit -o ./reports/junit/eslint/results.xml
|
|
when: always
|
|
|
|
- run:
|
|
name: Lint Java
|
|
command: scripts/circleci/exec_swallow_error.sh yarn lint-java --check
|
|
when: always
|
|
|
|
- run:
|
|
name: Check for errors in code using Flow (iOS)
|
|
command: yarn flow-check-ios
|
|
when: always
|
|
|
|
- run:
|
|
name: Check for errors in code using Flow (Android)
|
|
command: yarn flow-check-android
|
|
when: always
|
|
|
|
- run:
|
|
name: Sanity checks
|
|
command: |
|
|
./scripts/circleci/check_license.sh
|
|
./scripts/circleci/validate_yarn_lockfile.sh
|
|
when: always
|
|
|
|
- run:
|
|
name: Check formatting
|
|
command: yarn run format-check
|
|
when: always
|
|
|
|
- store_test_results:
|
|
path: ./reports/junit
|
|
|
|
# -------------------------
|
|
# JOBS: Test JavaScript
|
|
# -------------------------
|
|
test_js:
|
|
parameters:
|
|
executor:
|
|
type: executor
|
|
default: nodelts
|
|
run_disabled_tests:
|
|
type: boolean
|
|
default: false
|
|
executor: << parameters.executor >>
|
|
steps:
|
|
- checkout
|
|
- setup_artifacts
|
|
- run_yarn
|
|
- run:
|
|
name: Install rsync
|
|
command: sudo apt-get install rsync
|
|
|
|
# -------------------------
|
|
# Run JavaScript tests
|
|
- run:
|
|
name: "Run Tests: JavaScript Tests"
|
|
command: node ./scripts/run-ci-javascript-tests.js --maxWorkers 2
|
|
- run_e2e:
|
|
platform: js
|
|
|
|
# Optionally, run disabled tests
|
|
- when:
|
|
condition: << parameters.run_disabled_tests >>
|
|
steps:
|
|
- run: echo "Failing tests may be moved here temporarily."
|
|
# -------------------------
|
|
|
|
- store_test_results:
|
|
path: ./reports/junit
|
|
|
|
# -------------------------
|
|
# JOBS: Test iOS
|
|
# -------------------------
|
|
test_ios:
|
|
executor: reactnativeios
|
|
parameters:
|
|
use_frameworks:
|
|
type: boolean
|
|
default: false
|
|
use_hermes:
|
|
type: boolean
|
|
default: false
|
|
run_unit_tests:
|
|
description: Specifies whether unit tests should run.
|
|
type: boolean
|
|
default: false
|
|
run_disabled_tests:
|
|
description: Specifies whether disabled tests should run. Set this to true to debug failing tests.
|
|
type: boolean
|
|
default: false
|
|
environment:
|
|
- REPORTS_DIR: "./reports/junit"
|
|
steps:
|
|
- checkout
|
|
- setup_artifacts
|
|
- setup_ruby
|
|
- run_yarn
|
|
|
|
- run: |
|
|
cd packages/rn-tester
|
|
bundle check || bundle install
|
|
- run:
|
|
name: Boot iPhone Simulator
|
|
command: source scripts/.tests.env && xcrun simctl boot "$IOS_DEVICE" || true
|
|
|
|
- run:
|
|
name: Configure Environment Variables
|
|
command: |
|
|
echo 'export PATH=/usr/local/opt/node@16/bin:$PATH' >> $BASH_ENV
|
|
source $BASH_ENV
|
|
|
|
- with_brew_cache_span:
|
|
steps:
|
|
- brew_install:
|
|
package: watchman
|
|
- run:
|
|
name: "Brew: Tap wix/brew"
|
|
command: HOMEBREW_NO_AUTO_UPDATE=1 brew tap wix/brew >/dev/null
|
|
- brew_install:
|
|
package: applesimutils
|
|
|
|
- run:
|
|
name: Configure Watchman
|
|
command: echo "{}" > .watchmanconfig
|
|
|
|
- when:
|
|
condition: << parameters.use_frameworks >>
|
|
steps:
|
|
- run:
|
|
name: Set USE_FRAMEWORKS=1
|
|
command: echo "export USE_FRAMEWORKS=1" >> $BASH_ENV
|
|
|
|
- when:
|
|
condition: << parameters.use_hermes >>
|
|
steps:
|
|
- run:
|
|
name: Set USE_HERMES=1
|
|
command: echo "export USE_HERMES=1" >> $BASH_ENV
|
|
|
|
- run:
|
|
name: Setup the CocoaPods environment
|
|
command: bundle exec pod setup
|
|
|
|
- with_rntester_pods_cache_span:
|
|
steps:
|
|
- run:
|
|
name: Generate RNTesterPods Workspace
|
|
command: cd packages/rn-tester && bundle exec pod install --verbose
|
|
|
|
# -------------------------
|
|
# Runs iOS unit tests
|
|
- when:
|
|
condition: << parameters.run_unit_tests >>
|
|
steps:
|
|
- run:
|
|
name: "Run Tests: iOS Unit and Integration Tests"
|
|
command: yarn test-ios
|
|
|
|
# Optionally, run disabled tests
|
|
- when:
|
|
condition: << parameters.run_disabled_tests >>
|
|
steps:
|
|
- run: echo "Failing tests may be moved here temporarily."
|
|
- run:
|
|
name: "Run Tests: CocoaPods"
|
|
command: ./scripts/process-podspecs.sh
|
|
- run:
|
|
name: Free up port 8081 for iOS End-to-End Tests
|
|
command: |
|
|
# free up port 8081 for the packager before running tests
|
|
set +eo pipefail
|
|
lsof -i tcp:8081 | awk 'NR!=1 {print $2}' | xargs kill
|
|
set -eo pipefail
|
|
- run_e2e:
|
|
platform: ios
|
|
# -------------------------
|
|
|
|
# Collect Results
|
|
- report_bundle_size:
|
|
platform: ios
|
|
- store_test_results:
|
|
path: ./reports/junit
|
|
|
|
# -------------------------
|
|
# JOBS: Test Android
|
|
# -------------------------
|
|
test_android:
|
|
executor: reactnativeandroid
|
|
parameters:
|
|
run_disabled_tests:
|
|
type: boolean
|
|
default: false
|
|
environment:
|
|
KOTLIN_HOME=third-party/kotlin
|
|
steps:
|
|
- checkout
|
|
- setup_artifacts
|
|
- run_yarn
|
|
|
|
# Validate Android SDK installation and packages
|
|
- run:
|
|
name: Validate Android SDK Install
|
|
command: ./scripts/validate-android-sdk.sh
|
|
|
|
# Starting emulator in advance as it takes some time to boot.
|
|
- run:
|
|
name: Create Android Virtual Device
|
|
command: source scripts/android-setup.sh && createAVD
|
|
- run:
|
|
name: Launch Android Virtual Device in Background
|
|
command: source scripts/android-setup.sh && launchAVD
|
|
background: true
|
|
|
|
# Install Buck
|
|
- install_buck_tooling
|
|
|
|
# Validate Android test environment (including Buck)
|
|
- run:
|
|
name: Validate Android Test Environment
|
|
command: ./scripts/validate-android-test-env.sh
|
|
|
|
- download_buck_dependencies
|
|
- download_gradle_dependencies
|
|
|
|
# Build and compile
|
|
- 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
|
|
- run:
|
|
name: Compile Native Libs for Unit and Integration Tests
|
|
command: ./gradlew :ReactAndroid:packageReactNdkLibsForBuck -Pjobs=$BUILD_THREADS
|
|
no_output_timeout: 30m
|
|
|
|
# Build JavaScript Bundle for instrumentation tests
|
|
- run:
|
|
name: Build JavaScript Bundle
|
|
command: node 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
|
|
|
|
# Wait for AVD to finish booting before running tests
|
|
- run:
|
|
name: Wait for Android Virtual Device
|
|
command: source scripts/android-setup.sh && waitForAVD
|
|
|
|
- run:
|
|
name: Assemble RNTester App
|
|
command: ./gradlew packages:rn-tester:android:app:assembleRelease
|
|
|
|
# -------------------------
|
|
# Run Android tests
|
|
- run:
|
|
name: "Run Tests: Android Unit Tests"
|
|
command: buck test ReactAndroid/src/test/... --config build.threads=$BUILD_THREADS --xml ./reports/buck/all-results-raw.xml
|
|
- run:
|
|
name: "Build Tests: Android Instrumentation Tests"
|
|
# Here, just build the instrumentation tests. There is a known issue with installing the APK to android-21+ emulator.
|
|
command: |
|
|
if [[ ! -e ReactAndroid/src/androidTest/assets/AndroidTestBundle.js ]]; then
|
|
echo "JavaScript bundle missing, cannot run instrumentation tests. Verify Build JavaScript Bundle step completed successfully."; exit 1;
|
|
fi
|
|
source scripts/android-setup.sh && NO_BUCKD=1 retry3 timeout 300 buck build ReactAndroid/src/androidTest/buck-runner:instrumentation-tests --config build.threads=$BUILD_THREADS
|
|
|
|
# Optionally, run disabled tests
|
|
- when:
|
|
condition: << parameters.run_disabled_tests >>
|
|
steps:
|
|
- run: echo "Failing tests may be moved here temporarily."
|
|
- run_e2e:
|
|
platform: android
|
|
# -------------------------
|
|
|
|
# Collect Results
|
|
- report_bundle_size:
|
|
platform: android
|
|
- run:
|
|
name: Collect Test Results
|
|
command: |
|
|
find . -type f -regex ".*/build/test-results/debug/.*xml" -exec cp {} ./reports/build/ \;
|
|
find . -type f -regex ".*/outputs/androidTest-results/connected/.*xml" -exec cp {} ./reports/outputs/ \;
|
|
find . -type f -regex ".*/buck-out/gen/ReactAndroid/src/test/.*/.*xml" -exec cp {} ./reports/buck/ \;
|
|
if [ -f ~/react-native/reports/buck/all-results-raw.xml ]; then
|
|
cd ~/okbuck
|
|
./tooling/junit/buck_to_junit.sh ~/react-native/reports/buck/all-results-raw.xml ~/react-native/reports/junit/results.xml
|
|
fi
|
|
when: always
|
|
- store_test_results:
|
|
path: ./reports/junit
|
|
|
|
# -------------------------
|
|
# JOBS: Test Android Template
|
|
# -------------------------
|
|
test_android_template:
|
|
executor: reactnativeandroid
|
|
steps:
|
|
- checkout
|
|
- run_yarn
|
|
- attach_workspace:
|
|
at: .
|
|
|
|
- run:
|
|
name: Create Android template project
|
|
command: |
|
|
REPO_ROOT=$(pwd)
|
|
PACKAGE=$(cat build/react-native-package-version)
|
|
PATH_TO_PACKAGE="$REPO_ROOT/build/$PACKAGE"
|
|
cd template
|
|
npm add $PATH_TO_PACKAGE
|
|
npm install
|
|
|
|
- run:
|
|
name: Build the template application
|
|
command: cd template/android/ && ./gradlew assembleDebug
|
|
|
|
# -------------------------
|
|
# JOBS: Test Android RNTester
|
|
# -------------------------
|
|
test_android_rntester:
|
|
executor: reactnativeandroid
|
|
steps:
|
|
- checkout
|
|
- run_yarn
|
|
|
|
- run:
|
|
name: Generate artifacts for Maven
|
|
command: ./gradlew :ReactAndroid:installArchives
|
|
|
|
- run:
|
|
name: Assemble RNTester
|
|
command: ./gradlew :packages:rn-tester:android:app:assembleDebug
|
|
|
|
# -------------------------
|
|
# JOBS: Test iOS Template
|
|
# -------------------------
|
|
test_ios_template:
|
|
executor: reactnativeios
|
|
environment:
|
|
- PROJECT_NAME: "iOSTemplateProject"
|
|
|
|
steps:
|
|
- checkout
|
|
- run_yarn
|
|
- attach_workspace:
|
|
at: .
|
|
|
|
- run:
|
|
name: Create iOS template project
|
|
command: |
|
|
REPO_ROOT=$(pwd)
|
|
PACKAGE=$(cat build/react-native-package-version)
|
|
PATH_TO_PACKAGE="$REPO_ROOT/build/$PACKAGE"
|
|
node ./scripts/set-rn-template-version.js "file:$PATH_TO_PACKAGE"
|
|
mkdir -p ~/tmp
|
|
cd ~/tmp
|
|
node "$REPO_ROOT/cli.js" init "$PROJECT_NAME" --template "$REPO_ROOT"
|
|
|
|
- run:
|
|
name: Build template project
|
|
command: |
|
|
xcodebuild build \
|
|
-workspace ~/tmp/$PROJECT_NAME/ios/$PROJECT_NAME.xcworkspace \
|
|
-scheme $PROJECT_NAME \
|
|
-sdk iphonesimulator
|
|
|
|
# -------------------------
|
|
# JOBS: Test iOS RNTester
|
|
# -------------------------
|
|
test_ios_rntester:
|
|
executor: reactnativeios
|
|
parameters:
|
|
use_hermes:
|
|
type: boolean
|
|
default: false
|
|
steps:
|
|
- checkout
|
|
- run_yarn
|
|
|
|
- when:
|
|
condition: << parameters.use_hermes >>
|
|
steps:
|
|
- run:
|
|
name: Set USE_HERMES=1
|
|
command: echo "export USE_HERMES=1" >> $BASH_ENV
|
|
|
|
- run:
|
|
name: Install CocoaPods dependencies
|
|
command: |
|
|
rm -rf packages/rn-tester/Pods
|
|
cd packages/rn-tester && bundle exec pod install
|
|
|
|
- run:
|
|
name: Build RNTester
|
|
command: |
|
|
xcodebuild build \
|
|
-workspace packages/rn-tester/RNTesterPods.xcworkspace \
|
|
-scheme RNTester \
|
|
-sdk iphonesimulator
|
|
|
|
# -------------------------
|
|
# JOBS: Windows
|
|
# -------------------------
|
|
test_windows:
|
|
executor:
|
|
name: win/default
|
|
parameters:
|
|
run_disabled_tests:
|
|
type: boolean
|
|
default: false
|
|
environment:
|
|
- ANDROID_HOME: "C:\\Android\\android-sdk"
|
|
- ANDROID_NDK: "C:\\Android\\android-sdk\\ndk\\20.1.5948944"
|
|
- ANDROID_BUILD_VERSION: 31
|
|
- ANDROID_TOOLS_VERSION: 31.0.0
|
|
- GRADLE_OPTS: -Dorg.gradle.daemon=false
|
|
steps:
|
|
- checkout
|
|
|
|
- run:
|
|
name: Install Node
|
|
# Note: Version set separately for non-Windows builds, see above.
|
|
command: |
|
|
nvm install 16
|
|
nvm use 16
|
|
|
|
# Setup Dependencies
|
|
- run:
|
|
name: Install Yarn
|
|
command: choco install yarn
|
|
|
|
- run:
|
|
name: Display Environment info
|
|
command: npx envinfo@latest
|
|
|
|
- restore_cache:
|
|
keys:
|
|
- v1-win-yarn-cache-{{ arch }}-{{ checksum "yarn.lock" }}
|
|
- run:
|
|
name: "Yarn: Install Dependencies"
|
|
command: yarn install --frozen-lockfile --non-interactive
|
|
- save_cache:
|
|
key: v1-win-yarn-cache-{{ arch }}-{{ checksum "yarn.lock" }}
|
|
paths:
|
|
- C:\Users\circleci\AppData\Local\Yarn
|
|
|
|
# Try to install the SDK up to 3 times, since network flakiness can cause install failures
|
|
# Using a timeout of 9 mins, as circle ci will timeout if there is no output for 10 mins
|
|
- run:
|
|
name: Install Android SDK Tools
|
|
command: choco install android-sdk --timeout 540; if (!$?) { choco install android-sdk --timeout 540 --force --forcedependencies}; if (!$?) { choco install android-sdk --force --forcedependencies}
|
|
|
|
- run:
|
|
name: Setup Android SDKs
|
|
command: |
|
|
sdkmanager --licenses
|
|
sdkmanager "system-images;android-21;google_apis;armeabi-v7a"
|
|
sdkmanager "platforms;android-%ANDROID_BUILD_VERSION%"
|
|
sdkmanager "build-tools;%ANDROID_TOOLS_VERSION%"
|
|
sdkmanager "add-ons;addon-google_apis-google-23"
|
|
sdkmanager "extras;android;m2repository"
|
|
|
|
# -------------------------
|
|
# Run Tests
|
|
- run:
|
|
name: "Flow: Check Android"
|
|
command: yarn flow-check-android
|
|
- run:
|
|
name: "Flow: Check iOS"
|
|
command: yarn flow-check-ios
|
|
- run:
|
|
name: "Run Tests: JavaScript Tests"
|
|
command: yarn test
|
|
|
|
# Optionally, run disabled tests
|
|
- when:
|
|
condition: << parameters.run_disabled_tests >>
|
|
steps:
|
|
- run: echo "Failing tests may be moved here temporarily."
|
|
- run:
|
|
name: Android Build
|
|
command: ./gradlew.bat packages:rn-tester:android:app:assembleRelease
|
|
|
|
# -------------------------
|
|
# JOBS: Coverage
|
|
# -------------------------
|
|
# Collect JavaScript test coverage
|
|
js_coverage:
|
|
executor: nodelts
|
|
environment:
|
|
- CI_BRANCH: $CIRCLE_BRANCH
|
|
- CI_PULL_REQUEST: $CIRCLE_PULL_REQUEST
|
|
- CI_BUILD_NUMBER: $CIRCLE_BUILD_NUM
|
|
- CI_BUILD_URL: $CIRCLE_BUILD_URL
|
|
steps:
|
|
- checkout
|
|
- setup_artifacts
|
|
- run_yarn
|
|
- run:
|
|
name: Collect test coverage information
|
|
command: |
|
|
scripts/circleci/exec_swallow_error.sh yarn test --coverage --maxWorkers=2
|
|
if [[ -e ./coverage/lcov.info ]]; then
|
|
cat ./coverage/lcov.info | scripts/circleci/exec_swallow_error.sh ./node_modules/.bin/coveralls
|
|
fi
|
|
- store_artifacts:
|
|
path: ~/react-native/coverage/
|
|
|
|
# -------------------------
|
|
# JOBS: Releases
|
|
# -------------------------
|
|
prepare_package_for_release:
|
|
parameters:
|
|
version:
|
|
type: string
|
|
latest:
|
|
type: boolean
|
|
default: false
|
|
executor: reactnativeios
|
|
steps:
|
|
- checkout
|
|
- run_yarn
|
|
- add_ssh_keys:
|
|
fingerprints:
|
|
- "1c:98:e0:3a:52:79:95:29:12:cd:b4:87:5b:41:e2:bb"
|
|
- run:
|
|
name: "Set new react-native version and commit changes"
|
|
command: |
|
|
node ./scripts/prepare-package-for-release.js -v << parameters.version >> -l << parameters.latest >>
|
|
|
|
build_npm_package:
|
|
parameters:
|
|
publish_npm_args:
|
|
type: string
|
|
default: --dry-run
|
|
executor: reactnativeandroid
|
|
steps:
|
|
- run:
|
|
name: Add github.com to SSH known hosts
|
|
command: |
|
|
mkdir -p ~/.ssh
|
|
echo '|1|If6MU203eXTaaWL678YEfWkVMrw=|kqLeIAyTy8pzpj8x8Ae4Fr8Mtlc= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==' >> ~/.ssh/known_hosts
|
|
- checkout
|
|
- run_yarn
|
|
- install_buck_tooling
|
|
- download_buck_dependencies
|
|
- download_gradle_dependencies
|
|
# Only tagged releases and nightlies should be able to publish to npm
|
|
- when:
|
|
condition:
|
|
or:
|
|
- equal: [ --release, << parameters.publish_npm_args >> ]
|
|
- equal: [ --nightly, << parameters.publish_npm_args >> ]
|
|
steps:
|
|
- run: echo "//registry.npmjs.org/:_authToken=${CIRCLE_NPM_TOKEN}" > ~/.npmrc
|
|
- run: |
|
|
git config --global user.email "react-native-bot@users.noreply.github.com"
|
|
git config --global user.name "npm Deployment Script"
|
|
echo "machine github.com login react-native-bot password $GITHUB_TOKEN" > ~/.netrc
|
|
- run: node ./scripts/publish-npm.js << parameters.publish_npm_args >>
|
|
- when:
|
|
condition:
|
|
equal: [ --dry-run, << parameters.publish_npm_args >> ]
|
|
steps:
|
|
- run:
|
|
name: Build release package as a job artifact
|
|
command: |
|
|
mkdir -p build
|
|
FILENAME=$(npm pack)
|
|
mv $FILENAME build/
|
|
echo $FILENAME > build/react-native-package-version
|
|
- store_artifacts:
|
|
path: ~/react-native/build/
|
|
destination: build
|
|
- persist_to_workspace:
|
|
root: .
|
|
paths:
|
|
- build/*
|
|
|
|
- when:
|
|
condition:
|
|
matches: { pattern: '^pull\/.*$', value: << pipeline.git.branch >> }
|
|
steps:
|
|
- install_github_bot_deps
|
|
- run:
|
|
name: Post link to PR build artifacts (pull-bot)
|
|
command: GITHUB_TOKEN="$PUBLIC_PULLBOT_GITHUB_TOKEN_A""$PUBLIC_PULLBOT_GITHUB_TOKEN_B" scripts/circleci/post-artifacts-link.sh || true
|
|
|
|
- when:
|
|
condition:
|
|
equal: [ --release, << parameters.publish_npm_args >> ]
|
|
steps:
|
|
- run:
|
|
name: Update rn-diff-purge to generate upgrade-support diff
|
|
command: |
|
|
curl -X POST https://api.github.com/repos/react-native-community/rn-diff-purge/dispatches \
|
|
-H "Accept: application/vnd.github.v3+json" \
|
|
-u "$PAT_USERNAME:$PAT_TOKEN" \
|
|
-d "{\"event_type\": \"publish\", \"client_payload\": { \"version\": \"${CIRCLE_TAG:1}\" }}"
|
|
|
|
# -------------------------
|
|
# JOBS: Nightly
|
|
# -------------------------
|
|
nightly_job:
|
|
machine:
|
|
image: ubuntu-2004:202010-01
|
|
steps:
|
|
- run:
|
|
name: Nightly
|
|
command: |
|
|
echo "Nightly build run"
|
|
|
|
|
|
# -------------------------
|
|
# PIPELINE PARAMETERS
|
|
# -------------------------
|
|
parameters:
|
|
run_package_release_workflow_only:
|
|
default: false
|
|
type: boolean
|
|
|
|
release_latest:
|
|
default: false
|
|
type: boolean
|
|
|
|
release_version:
|
|
default: "9999"
|
|
type: string
|
|
|
|
# -------------------------
|
|
# WORK FLOWS
|
|
#
|
|
# When creating a new workflow, make sure to include condition `unless: << pipeline.parameters.run_package_release_workflow_only >>`
|
|
# It's setup this way so we can trigger a release via a POST
|
|
# See limitations: https://support.circleci.com/hc/en-us/articles/360050351292-How-to-trigger-a-workflow-via-CircleCI-API-v2
|
|
# -------------------------
|
|
workflows:
|
|
version: 2
|
|
|
|
tests:
|
|
unless: << pipeline.parameters.run_package_release_workflow_only >>
|
|
jobs:
|
|
- build_npm_package:
|
|
# Build a release package on every untagged commit, but do not publish to npm.
|
|
publish_npm_args: --dry-run
|
|
- test_js:
|
|
run_disabled_tests: false
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
- test_android:
|
|
run_disabled_tests: false
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
- test_android_template:
|
|
requires:
|
|
- build_npm_package
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
- test_android_rntester:
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
- test_ios_template:
|
|
requires:
|
|
- build_npm_package
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
- test_ios_rntester:
|
|
name: test_ios_rntester_hermes
|
|
use_hermes: true
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
- test_ios_rntester:
|
|
name: test_ios_rntester_jsc
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
- test_ios:
|
|
name: test_ios_unit_jsc
|
|
run_unit_tests: true
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
# DISABLED: USE_FRAMEWORKS=1 not supported by Flipper
|
|
# - test_ios:
|
|
# name: test_ios_unit_frameworks_jsc
|
|
# use_frameworks: true
|
|
# run_unit_tests: true
|
|
- test_ios:
|
|
name: test_ios_unit_hermes
|
|
use_hermes: true
|
|
# TODO(ncor, neildhar) Integration tests for iOS + Hermes are currently
|
|
# disabled due to an ABI incompatibility introduced by D33830544.
|
|
# They can be re-enabled as soon as Hermes 0.12.0 is released.
|
|
run_unit_tests: false
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
# DISABLED: USE_FRAMEWORKS=1 not supported by Flipper
|
|
# - test_ios:
|
|
# name: test_ios_unit_frameworks_hermes
|
|
# use_hermes: true
|
|
# use_frameworks: true
|
|
# run_unit_tests: true
|
|
- test_js:
|
|
name: test_js_prev_lts
|
|
executor: nodeprevlts
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
- test_windows:
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
run_disabled_tests: false
|
|
|
|
# This workflow should only be triggered by release script
|
|
package_release:
|
|
when: << pipeline.parameters.run_package_release_workflow_only >>
|
|
jobs:
|
|
# This job will trigger publish_release workflow
|
|
- prepare_package_for_release:
|
|
name: prepare_package_for_release
|
|
version: << pipeline.parameters.release_version >>
|
|
latest : << pipeline.parameters.release_latest >>
|
|
|
|
publish_release:
|
|
unless: << pipeline.parameters.run_package_release_workflow_only >>
|
|
jobs:
|
|
# This job will trigger when a version tag is pushed (by package_release)
|
|
- build_npm_package:
|
|
name: build_and_publish_npm_package
|
|
context: react-native-bot
|
|
publish_npm_args: --release
|
|
# CircleCI filters are OR-ed, with all branches triggering by default and tags excluded by default
|
|
# CircleCI env-vars are only set with the branch OR tag that triggered the job, not both.
|
|
# In this case, CIRCLE_BRANCH is unset, but CIRCLE_TAG is set
|
|
filters:
|
|
# Both of the following conditions must be included!
|
|
# Ignore any commit on any branch by default.
|
|
branches:
|
|
ignore: /.*/
|
|
# Only act on version tags.
|
|
tags:
|
|
only: /v[0-9]+(\.[0-9]+)*(\-rc(\.[0-9]+)?)?/
|
|
|
|
analysis:
|
|
unless: << pipeline.parameters.run_package_release_workflow_only >>
|
|
jobs:
|
|
# Run lints on every commit other than those to the gh-pages branch
|
|
- analyze_code:
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
|
|
# Run code checks on PRs from forks
|
|
- analyze_pr:
|
|
filters:
|
|
branches:
|
|
only: /^pull\/.*$/
|
|
|
|
# Gather coverage
|
|
- js_coverage:
|
|
filters:
|
|
branches:
|
|
ignore: gh-pages
|
|
|
|
nightly:
|
|
unless: << pipeline.parameters.run_package_release_workflow_only >>
|
|
triggers:
|
|
- schedule:
|
|
cron: "0 20 * * *"
|
|
filters:
|
|
branches:
|
|
only:
|
|
- main
|
|
jobs:
|
|
- nightly_job
|
|
|
|
- build_npm_package:
|
|
publish_npm_args: --nightly
|