defaults: &defaults working_directory: ~/repo version: 2 jobs: lint-testunit: <<: *defaults docker: - image: circleci/node:8 environment: CODECOV_TOKEN: caa771ab-3d45-4756-8e2a-e1f25996fef6 steps: - checkout - restore_cache: name: Restore NPM cache key: node-modules-{{ checksum "yarn.lock" }} - run: name: Install NPM modules command: | yarn - run: name: Lint command: | yarn lint - run: name: Test command: | yarn test - run: name: Codecov command: | yarn codecov - save_cache: key: node-modules-{{ checksum "yarn.lock" }} name: Save NPM cache paths: - ./node_modules e2e-test: macos: xcode: "10.2.1" environment: BASH_ENV: "~/.nvm/nvm.sh" steps: - checkout - restore_cache: name: Restore NPM cache key: node-v1-mac-{{ checksum "yarn.lock" }} - run: name: Install Node 8 command: | curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash source ~/.nvm/nvm.sh # https://github.com/creationix/nvm/issues/1394 set +e nvm install 8 - run: name: Install appleSimUtils command: | brew update brew tap wix/brew brew install wix/brew/applesimutils - run: name: Install NPM modules command: | yarn global add detox-cli yarn - run: name: Build command: | detox build --configuration ios.sim.release - run: name: Test command: | detox test --configuration ios.sim.release --cleanup - save_cache: name: Save NPM cache key: node-v1-mac-{{ checksum "yarn.lock" }} paths: - node_modules - store_artifacts: path: /tmp/screenshots android-play-build: docker: - image: circleci/android:api-29 environment: GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false steps: - checkout - restore_cache: name: Restore NPM cache key: node-modules-{{ checksum "yarn.lock" }} - run: name: Install React Native CLI command: | npm i -g react-native-cli - run: name: Install NPM modules command: | yarn - restore_cache: name: Restore gradle cache key: android-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }} - run: name: restore files from ENV command: | echo $CHAT_ROCKET_ANDROID_STORE_FILE_BASE64_JKS | base64 --decode > chat-rocket-android.jks echo $ROCKET_PLAY_JSON | base64 --decode > android/app/rocket-chat.json - run: name: Build Play AAB command: cd android && ./gradlew bundlePlayRelease - store_artifacts: path: app/build/outputs/bundle destination: bundle - save_cache: name: Save NPM cache key: node-modules-{{ checksum "yarn.lock" }} paths: - ./node_modules - save_cache: name: Save gradle cache key: android-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }} paths: - ~/.gradle android-play-experimental-build: <<: *defaults docker: - image: circleci/android:api-28-node environment: # GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError" # GRADLE_OPTS: -Xmx2048m -Dorg.gradle.daemon=false # JVM_OPTS: -Xmx4096m JAVA_OPTS: '-Xms512m -Xmx2g' GRADLE_OPTS: '-Xmx3g -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xmx2g -XX:+HeapDumpOnOutOfMemoryError"' TERM: dumb BASH_ENV: "~/.nvm/nvm.sh" steps: - checkout - run: name: Install Node 8 command: | curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash source ~/.nvm/nvm.sh # https://github.com/creationix/nvm/issues/1394 set +e nvm install 8 echo 'export PATH="/home/circleci/.nvm/versions/node/v8.16.0/bin:$PATH"' >> ~/.bash_profile source ~/.bash_profile - restore_cache: name: Restore NPM cache key: node-modules-{{ checksum "yarn.lock" }} - run: name: Install React Native CLI command: | npm i -g react-native-cli - run: name: Install NPM modules command: | yarn - restore_cache: name: Restore gradle cache key: android-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }} - run: name: Configure Gradle command: | cd android echo -e "" > ./gradle.properties # echo -e "android.enableAapt2=false" >> ./gradle.properties echo -e "android.useAndroidX=true" >> ./gradle.properties echo -e "android.enableJetifier=true" >> ./gradle.properties if [[ $KEYSTORE ]]; then echo $KEYSTORE_BASE64 | base64 --decode > ./app/$KEYSTORE echo -e "KEYSTORE=$KEYSTORE" >> ./gradle.properties echo -e "KEYSTORE_PASSWORD=$KEYSTORE_PASSWORD" >> ./gradle.properties echo -e "KEY_ALIAS=$KEY_ALIAS" >> ./gradle.properties echo -e "KEY_PASSWORD=$KEYSTORE_PASSWORD" >> ./gradle.properties fi echo -e "VERSIONCODE=$CIRCLE_BUILD_NUM" >> ./gradle.properties echo -e "BugsnagAPIKey=$BUGSNAG_KEY" >> ./gradle.properties - run: name: Set Google Services command: | cp src/playExperimental/google-services.prod.json src/playExperimental/google-services.json working_directory: android/app - run: name: Upload sourcemaps to Bugsnag command: | if [[ $BUGSNAG_KEY ]]; then yarn generate-source-maps-android curl https://upload.bugsnag.com/react-native-source-map \ -F apiKey=$BUGSNAG_KEY \ -F appVersionCode=$CIRCLE_BUILD_NUM \ -F dev=false \ -F platform=android \ -F sourceMap=@android-release.bundle.map \ -F bundle=@android-release.bundle fi - run: name: Config variables command: | echo -e "export default { BUGSNAG_API_KEY: '$BUGSNAG_KEY' };" > ./config.js - run: name: Build Android App command: | npx jetify cd android if [[ $KEYSTORE ]]; then ./gradlew bundlePlayExperimentalRelease else ./gradlew assembleDebug fi mkdir -p /tmp/build mv app/build/outputs /tmp/build/ - store_artifacts: path: /tmp/build/outputs/play-experimental - save_cache: name: Save NPM cache key: node-modules-{{ checksum "yarn.lock" }} paths: - ./node_modules - save_cache: name: Save gradle cache key: android-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }} paths: - ~/.gradle ios-build: macos: xcode: "10.2.1" environment: BASH_ENV: "~/.nvm/nvm.sh" steps: - checkout - restore_cache: name: Restore gems cache key: bundle-v1-{{ checksum "ios/Gemfile.lock" }} - restore_cache: name: Restore NPM cache key: node-v1-mac-{{ checksum "yarn.lock" }} - run: name: Install Node 8 command: | curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash source ~/.nvm/nvm.sh # https://github.com/creationix/nvm/issues/1394 set +e nvm install 8 - run: name: Install NPM modules command: | yarn global add react-native react-native-cli yarn - run: name: Update Fastlane command: | sudo bundle install working_directory: ios - run: name: Set Google Services command: | cp GoogleService-Info.prod.plist GoogleService-Info.plist working_directory: ios - run: name: Upload sourcemaps to Bugsnag command: | if [[ $BUGSNAG_KEY ]]; then yarn generate-source-maps-ios curl https://upload.bugsnag.com/react-native-source-map \ -F apiKey=$BUGSNAG_KEY \ -F appBundleVersion=$CIRCLE_BUILD_NUM \ -F dev=false \ -F platform=ios \ -F sourceMap=@ios-release.bundle.map \ -F bundle=@ios-release.bundle fi - run: name: Fastlane Build no_output_timeout: 1200 command: | agvtool new-version -all $CIRCLE_BUILD_NUM /usr/libexec/PlistBuddy -c "Set BugsnagAPIKey $BUGSNAG_KEY" ./RocketChatRN/Info.plist if [[ $MATCH_KEYCHAIN_NAME ]]; then bundle exec fastlane ios release else export MATCH_KEYCHAIN_NAME="temp" export MATCH_KEYCHAIN_PASSWORD="temp" bundle exec fastlane ios build fi working_directory: ios - save_cache: name: Save NPM cache key: node-v1-mac-{{ checksum "yarn.lock" }} paths: - node_modules - save_cache: name: Save gems cache key: bundle-v1-{{ checksum "ios/Gemfile.lock" }} paths: - vendor/bundle - store_artifacts: path: ios/RocketChatRN.ipa - persist_to_workspace: root: . paths: - ios/*.ipa - ios/fastlane/report.xml ios-testflight: macos: xcode: "10.2.1" steps: - checkout - attach_workspace: at: ios - restore_cache: name: Restore gems cache key: bundle-v1-{{ checksum "ios/Gemfile.lock" }} - run: name: Update Fastlane command: | sudo bundle install working_directory: ios - run: name: Fastlane Tesflight Upload command: | bundle exec fastlane ios beta working_directory: ios - save_cache: name: Save gems cache key: bundle-v1-{{ checksum "ios/Gemfile.lock" }} paths: - vendor/bundle workflows: version: 2 build-and-test: jobs: - lint-testunit - e2e-hold: type: approval requires: - lint-testunit - e2e-test: requires: - e2e-hold - ios-build: requires: - lint-testunit - ios-hold-testflight: type: approval requires: - ios-build - ios-testflight: requires: - ios-hold-testflight - android-play-build: requires: - lint-testunit - android-play-experimental-build: requires: - lint-testunit