version: 2.1 # # This CI configuration heavily relies on templates and CMake. Most of the # jobs will have the following steps (usually configurable via parameters): # prepare, build and test. # # 'sanity-checks' and 'baselines' are special. The former will run a series # of checks to see if the patch has the minimum requirements for landing in # our repository and the latter will generate new baselines for the tests # in case the PR changes the baselines. # workflows: version: 2 development: jobs: - sanity-checks - build-template: name: android-armeabi-v7a-release executor_name: ubuntu-eoan target_is_android: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_INSTALL_PREFIX=/tmp/workspace/install/$CIRCLE_JOB -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_CCACHE=/usr/bin/ccache -DANDROID_ABI=armeabi-v7a' install: true - build-template: name: android-arm64-v8a-release executor_name: ubuntu-eoan target_is_android: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_INSTALL_PREFIX=/tmp/workspace/install/$CIRCLE_JOB -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_CCACHE=/usr/bin/ccache -DANDROID_ABI=arm64-v8a' build_params: '--target libmbgl-render-test-runner.so' install: true - build-template: name: android-x86-release executor_name: ubuntu-eoan target_is_android: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_INSTALL_PREFIX=/tmp/workspace/install/$CIRCLE_JOB -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_CCACHE=/usr/bin/ccache -DANDROID_ABI=x86' build_params: '--target libmbgl-render-test-runner.so' install: true - build-template: name: android-x86_64-release executor_name: ubuntu-eoan target_is_android: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_INSTALL_PREFIX=/tmp/workspace/install/$CIRCLE_JOB -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_CCACHE=/usr/bin/ccache -DANDROID_ABI=x86_64' build_params: '--target libmbgl-render-test-runner.so' install: true - build-template: name: linux-gcc8-release executor_name: ubuntu-eoan target_is_linux: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_INSTALL_PREFIX=/tmp/workspace/install/$CIRCLE_JOB -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8' install: true metrics: true style_tests: true - build-template: name: linux-gcc5-release executor_name: ubuntu-eoan target_is_linux: true requires: - linux-gcc8-release config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=gcc-5 -DCMAKE_CXX_COMPILER=g++-5' build_params: '--target mbgl-glfw' test_params: '-N -Q' - build-template: name: linux-gcc8-debug-coverage executor_name: ubuntu-eoan target_is_linux: true requires: - linux-gcc8-release config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_BUILD_TYPE=Debug -DMBGL_WITH_COVERAGE=ON' style_tests: true upload_coverage: true - build-template: name: linux-clang8-release executor_name: ubuntu-eoan target_is_linux: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_INSTALL_PREFIX=/tmp/workspace/install/$CIRCLE_JOB -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8' install: true metrics: true style_tests: true - build-template: name: FIXME-linux-asan executor_name: ubuntu-eoan target_is_linux: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8 -DMBGL_WITH_SANITIZER=address' test_params: '|| true' style_tests: true - build-template: name: linux-tsan executor_name: ubuntu-eoan target_is_linux: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8 -DMBGL_WITH_SANITIZER=thread' style_tests: true - build-template: name: FIXME-linux-valgrind executor_name: ubuntu-eoan target_is_linux: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8 -DCMAKE_CXX_FLAGS=-DSANITIZE' test_params: '-j 4 -E "mbgl-node|gl-benchmark" -D ExperimentalMemCheck || true' - build-template: name: linux-ubsan executor_name: ubuntu-eoan target_is_linux: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8 -DMBGL_WITH_SANITIZER=undefined' style_tests: true - build-template: name: qt5-linux-gcc5-release executor_name: ubuntu-eoan target_is_linux: true requires: - sanity-checks config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=gcc-5 -DCMAKE_CXX_COMPILER=g++-5 -DMBGL_WITH_QT=ON' - build-template: name: qt5-macos-gcc5-release executor_name: macos-11_1_0 target_is_macos: true requires: - linux-gcc8-release config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DMBGL_WITH_QT=ON -DCMAKE_PREFIX_PATH=$(echo /usr/local/Cellar/qt/5.*/lib/cmake)' - build-template: name: macos-xcode11-release executor_name: macos-11_1_0 target_is_macos: true requires: - linux-gcc8-release config_params: '-G Ninja -DCMAKE_INSTALL_PREFIX=/tmp/workspace/install/$CIRCLE_JOB -DCMAKE_CXX_COMPILER_LAUNCHER=ccache' install: true metrics: true style_tests: true - build-template: name: macos-xcode11-debug executor_name: macos-11_1_0 target_is_macos: true requires: - macos-xcode11-release config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Debug -DMBGL_WITH_COVERAGE=ON' style_tests: true upload_coverage: true - build-template: name: ios-xcode11-release executor_name: macos-11_3_1 target_is_macos: true requires: - linux-gcc8-release config_params: '-G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64e -DCMAKE_OSX_SYSROOT=iphoneos -DMBGL_WITH_IOS_CCACHE=ON' build_params: '--config Release' - android-benchmark-runner: requires: - linux-gcc8-release - android-render-test-runner: requires: - linux-gcc8-release - android-unit-test-runner: requires: - linux-gcc8-release - ios-render-test-runner: requires: - linux-gcc8-release - ios-unit-test-runner: requires: - linux-gcc8-release - ios-benchmark-runner: requires: - linux-gcc8-release - baselines: requires: - android-arm64-v8a-release - android-armeabi-v7a-release - android-render-test-runner - android-x86-release - android-x86_64-release - linux-clang8-release - linux-gcc8-release - macos-xcode11-release - ios-render-test-runner - trigger-pipeline: requires: - baselines name: mapboxci slug: mapbox/mapbox-gl-native-internal - android-api-breakage: requires: - baselines nightly: triggers: - schedule: cron: "0 5 * * *" filters: branches: only: - master jobs: - build-template: name: linux-gcc8-debug-coverage-nightly executor_name: ubuntu-eoan target_is_linux: true config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_BUILD_TYPE=Debug -DMBGL_WITH_COVERAGE=ON' style_tests: true upload_coverage: true - build-template: name: macos-xcode11-debug-coverage-nightly executor_name: macos-11_1_0 target_is_macos: true requires: - linux-gcc8-debug-coverage-nightly config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Debug -DMBGL_WITH_COVERAGE=ON' style_tests: true upload_coverage: true publish_coverage: true # # Executors: we currently support two executors, one based on Ubuntu 19.04 aka Disco # and another based on macOS + Xcode 11.1.0. The Ubuntu executor is a lot more stable # and will produce reproduceable builds completely offline because it uses a docker # image with all the build dependencies preinstalled, whereas the macOS is managed # by CircleCI and will install dependencies on build time. Build results from the macOS # bots might differ if in meantime the macOS image gets updated. :-( # executors: ubuntu-eoan: docker: # FIXME: Move the image to mbgl/ - image: tmpsantos/mbgl_ci:1.9 resource_class: xlarge working_directory: /src environment: DISPLAY: :99 UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1:report_error_type=1 ASAN_OPTIONS: strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1:halt_on_error=0 QT_INSTALL_DOCS: /usr/share/qt5/doc QT_VERSION: 5 TSAN_OPTIONS: suppressions=/src/platform/linux/tsan_suppress.txt macos-11_1_0: macos: xcode: '11.1.0' environment: HOMEBREW_NO_AUTO_UPDATE: 1 HOMEBREW_NO_INSTALL_CLEANUP: 1 macos-11_3_1: macos: xcode: '11.3.1' environment: HOMEBREW_NO_AUTO_UPDATE: 1 HOMEBREW_NO_INSTALL_CLEANUP: 1 commands: prepare: steps: - restore_cache: keys: - 'ccache-v1-{{ .Environment.CIRCLE_JOB }}-{{ .Branch }}-{{ .Revision }}' - 'ccache-v1-{{ .Environment.CIRCLE_JOB }}-{{ .Branch }}-' - 'ccache-v1-{{ .Environment.CIRCLE_JOB }}-master' - run: name: Prepare command: | git submodule sync git submodule update --init --recursive git gc npm install --ignore-scripts ulimit -c unlimited prepare-linux: steps: - run: name: Prepare Linux background: true command: | Xvfb :99 -noreset -screen 0 1280x1024x24 prepare-macos: steps: - run: name: Prepare macOS command: | brew install cmake ccache glfw ninja pkgconfig qt chargepoint/xcparse/xcparse brew cask install google-cloud-sdk pip install ansi2html scipy config: parameters: config_params: type: string steps: - run: name: Configure command: | cmake . -B build << parameters.config_params >> build: parameters: build_params: type: string steps: - run: name: Build command: | ccache --zero-stats --max-size=2G cmake --build build -j $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null) << parameters.build_params >> ccache --show-stats install: steps: - run: name: Install command: | cmake --build build --target install/strip test: parameters: test_params: type: string steps: - run: name: Test command: | cd build ctest -V << parameters.test_params >> metrics: parameters: step_name: type: string metrics_params: type: string steps: - run: name: << parameters.step_name >> command: | build/mbgl-render-test-runner << parameters.metrics_params >> save: steps: - save_cache: key: 'ccache-v1-{{ .Environment.CIRCLE_JOB }}-{{ .Branch }}-{{ .Revision }}' paths: - .git/modules - /Users/distiller/Library/Caches/Homebrew - node_modules - ~/.ccache - ~/.gradle - run: name: Collecting results when: always command: | mkdir -p /tmp/workspace/metrics && touch /tmp/workspace/.$CIRCLE_JOB if [ -d metrics/$CIRCLE_JOB ]; then cp -r metrics/$CIRCLE_JOB /tmp/workspace/metrics; fi mkdir -p /tmp/tests/baselines if [ -f baselines.patch ]; then cp baselines.patch /tmp/tests/baselines; fi mkdir -p /tmp/tests/nitpick if [ -f nitpick.patch ]; then cp nitpick.patch /tmp/tests/nitpick; fi mkdir -p /tmp/tests/render if [ -f clang-tidy.log ]; then cp clang-tidy.log /tmp/tests/clang-tidy; fi mkdir -p /tmp/tests/render if ls render-test/*.html 1> /dev/null 2>&1; then cp render-test/*.html /tmp/tests/render; fi mkdir -p /tmp/tests/metrics if ls metrics/*.html 1> /dev/null 2>&1; then cp metrics/*.html /tmp/tests/metrics; fi mkdir -p /tmp/tests/coredumps if ls core* 1> /dev/null 2>&1; then cp core* /tmp/tests/coredumps; fi mkdir -p /tmp/tests/valgrind if ls build/Testing/Temporary/MemoryChecker.*.log 1> /dev/null 2>&1; then cp build/Testing/Temporary/MemoryChecker.*.log /tmp/tests/valgrind; fi - persist_to_workspace: root: /tmp/workspace paths: - '*' - store_artifacts: path: /tmp/tests destination: tests login-google-cloud-platform: steps: - run: name: Login Google Cloud Platform command: | echo "${GCLOUD_SERVICE_ACCOUNT_JSON}" > secret.json gcloud auth activate-service-account --key-file secret.json --project android-gl-native rm secret.json login-google-cloud-platform-ios: steps: - run: name: Login to IOS Google Cloud Platform command: | if [[ -n "${GCLOUD_SERVICE_ACCOUNT_JSON_IOS}" ]]; then echo "${GCLOUD_SERVICE_ACCOUNT_JSON_IOS}" > iosAccount.json gcloud auth activate-service-account --key-file iosAccount.json --project ios-mapbox-gl-native rm iosAccount.json fi prepare-ios-codesign-keychain: parameters: directory: type: string steps: - run: name: Prepare codesign keychain command: | cd << parameters.directory >> fastlane run create_keychain name:fastlane_keychain password:$FASTLANE_PASSWORD timeout:false unlock:true fastlane match security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $FASTLANE_PASSWORD fastlane_keychain codesign-ios-test-runner: parameters: directory: type: string steps: - run: name: Codesign iOS TestApp for running on a physical device command: | cp -r << parameters.directory >>/codesigning build cd build ./codesigning/generate-entitlements.swift ./codesigning/codesign_all.sh codesign -dv --verbose=4 Release-iphoneos/*.app # for debugging that app is signed or not run-ios-test-app: parameters: directory: type: string steps: - run: name: Run iOS Test App on Firebase no_output_timeout: 30m command: | if [[ -n "${GCLOUD_SERVICE_ACCOUNT_JSON_IOS}" ]]; then # arrange files in a way Firebase expects it, and package them in a zip file cp << parameters.directory >>/*_iphoneos13.2-arm64e-release.xctestrun build cd build zip testapp.zip -r Release-iphoneos/*.app --quiet zip testapp.zip *_iphoneos13.2-arm64e-release.xctestrun gcloud firebase test ios models list gcloud firebase test ios run \ --test testapp.zip \ --device model=iphone11,version=13.3,locale=en,orientation=portrait --xcode-version=11.3.1 --timeout 30m \ --verbosity=debug --no-record-video --results-dir ios-test-app-${CIRCLE_BUILD_NUM} fi upload-coverage-results: steps: - run: name: Get coverage results command: | cd build find . -type f -iname *.gcda -exec gcov -p -b {} \; - run: name: Upload coverage results to codecov.io command: | bash <(curl -sSfL https://codecov.io/bash) -X gcov || echo 'Codecov failed to upload' publish-coverage-metrics: steps: - run: name: Upload coverage metrics to s3 command: | if [[ $CIRCLE_BRANCH == master ]]; then scripts/publish_core_codecoverage.js -p Linux -s Core fi jobs: ios-render-test-runner: executor: macos-11_3_1 steps: - checkout - prepare - prepare-macos - prepare-ios-codesign-keychain: directory: render-test/ios - config: config_params: '-G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DMBGL_IOS_RENDER_TEST=ON -DCMAKE_OSX_ARCHITECTURES=arm64e -DMBGL_WITH_IOS_CCACHE=ON' - build: build_params: '--config Release' - codesign-ios-test-runner: directory: render-test/ios - login-google-cloud-platform-ios - run-ios-test-app: directory: render-test/ios - run: name: Retrieve Test Result from gcloud when: always command: | if [[ -n "${GCLOUD_SERVICE_ACCOUNT_JSON_IOS}" ]]; then testResult=$(gsutil ls -d gs://test-lab-hn7kwqcz3108z-hjm4qtbqqkymk/ios-test-app-${CIRCLE_BUILD_NUM}/iphone11-13.3-en-portrait/TestLogs/) mkdir -p render-test-app gsutil -m cp -r $testResult render-test-app cd render-test-app/TestLogs xcparse attachments *.xcresult && ls cd ../.. && mkdir -p /tmp/tests/ios-render-test if ls render-test-app/TestLogs/*.html 1> /dev/null 2>&1; then cp render-test-app/TestLogs/*.html /tmp/tests/ios-render-test; fi if [[ -n $(ls render-test-app/TestLogs/*.zip 2>/dev/null) ]]; then cp render-test-app/TestLogs/*.zip metrics/ios-render-test-runner/ cp render-test-app/TestLogs/*.zip /tmp/tests/ios-render-test cd metrics/ios-render-test-runner/ unzip -o *.zip rm -rf *.zip fi fi - save ios-unit-test-runner: executor: macos-11_3_1 steps: - checkout - prepare - prepare-macos - prepare-ios-codesign-keychain: directory: test/ios - config: config_params: '-G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DMBGL_IOS_UNIT_TEST=ON -DCMAKE_OSX_ARCHITECTURES=arm64e -DMBGL_WITH_IOS_CCACHE=ON' - build: build_params: '--config Release' - codesign-ios-test-runner: directory: test/ios - login-google-cloud-platform-ios - run-ios-test-app: directory: test/ios - run: name: Retrieve Test Result from gcloud when: always command: | if [[ -n "${GCLOUD_SERVICE_ACCOUNT_JSON_IOS}" ]]; then testResult=$(gsutil ls -d gs://test-lab-hn7kwqcz3108z-hjm4qtbqqkymk/ios-test-app-${CIRCLE_BUILD_NUM}/iphone11-13.3-en-portrait/TestLogs/) mkdir -p unit-test-app gsutil -m cp -r $testResult unit-test-app cd unit-test-app/TestLogs xcparse attachments *.xcresult && ls cd ../.. && mkdir -p /tmp/tests/unit-test if ls unit-test-app/TestLogs/*.xml 1> /dev/null 2>&1; then cp unit-test-app/TestLogs/*.xml /tmp/tests/unit-test/results.xml; fi fi - save ios-benchmark-runner: executor: macos-11_3_1 steps: - checkout - prepare - prepare-macos - prepare-ios-codesign-keychain: directory: benchmark/ios - config: config_params: '-G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DMBGL_IOS_BENCHMARK=ON -DCMAKE_OSX_ARCHITECTURES=arm64e -DMBGL_WITH_IOS_CCACHE=ON' - build: build_params: '--config Release' - codesign-ios-test-runner: directory: benchmark/ios - login-google-cloud-platform-ios - run-ios-test-app: directory: benchmark/ios - run: name: Retrieve Test Result from gcloud when: always command: | if [[ -n "${GCLOUD_SERVICE_ACCOUNT_JSON_IOS}" ]]; then testResult=$(gsutil ls -d gs://test-lab-hn7kwqcz3108z-hjm4qtbqqkymk/ios-test-app-${CIRCLE_BUILD_NUM}/iphone11-13.3-en-portrait/TestLogs/) mkdir -p benchmark-app gsutil -m cp -r $testResult benchmark-app cd benchmark-app/TestLogs xcparse attachments *.xcresult && ls cd ../.. && mkdir -p /tmp/tests/benchmark if ls benchmark-app/TestLogs/*.json 1> /dev/null 2>&1; then cp benchmark-app/TestLogs/*.json /tmp/tests/benchmark/results.json; fi fi - run: name: Compare result to baseline when: always command: | scripts/check_benchmark_results.sh metrics/benchmark/ios/results.json /tmp/tests/benchmark/results.json /tmp/tests/benchmark/results_comparison.txt /tmp/tests/benchmark/results_comparison.html - save android-benchmark-runner: executor: ubuntu-eoan steps: - checkout - prepare - run: name: Build BenchmarkRunner APK command: | cd benchmark/android ./gradlew --parallel --max-workers=8 -Pmapbox.abis=arm64-v8a app:assembleRelease app:assembleAndroidTest - login-google-cloud-platform - run: name: Run BenchmarkRunner on Firebase no_output_timeout: 30m command: | gcloud firebase test android models list gcloud firebase test android run --type instrumentation \ --app benchmark/android/app/build/outputs/apk/release/app-release.apk \ --test benchmark/android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk \ --device-ids flame --os-version-ids 29 --locales en --orientations portrait --timeout 30m \ --directories-to-pull /sdcard/benchmark/results --results-dir benchmark-${CIRCLE_BUILD_NUM} \ --no-record-video --no-performance-metrics - run: name: Retrieve TestResult from gcloud when: always command: | testResult=$(gsutil ls gs://test-lab-186672a0qp5bq-ycr70axads3nc/benchmark-${CIRCLE_BUILD_NUM}/**/results/results.json) mkdir -p /tmp/tests/benchmark gsutil cp $testResult /tmp/tests/benchmark - run: name: Compare result to baseline when: always command: | scripts/check_benchmark_results.sh metrics/benchmark/android/results.json /tmp/tests/benchmark/results.json /tmp/tests/benchmark/results_comparison.txt /tmp/tests/benchmark/results_comparison.html - save android-api-breakage: executor: ubuntu-eoan steps: - run: name: Clone mapbox-gl-native-android in working directory command: git clone https://github.com/mapbox/mapbox-gl-native-android.git . - prepare - run: name: Update mapbox-gl-native to match PR command: cd vendor/mapbox-gl-native && git fetch origin $CIRCLE_SHA1 && git checkout $CIRCLE_SHA1 && git submodule update --init --recursive - run: name: Build SDK command: BUILDTYPE=Release make android-arm-v8 - save android-unit-test-runner: executor: ubuntu-eoan steps: - checkout - prepare - run: name: Build UnitTestRunner APK command: | cd test/android ./gradlew --parallel --max-workers=8 -Pmapbox.abis=arm64-v8a app:assembleRelease app:assembleAndroidTest - login-google-cloud-platform - run: name: Run UnitTestRunner on Firebase no_output_timeout: 20m command: | gcloud firebase test android models list gcloud firebase test android run --type instrumentation \ --app test/android/app/build/outputs/apk/release/app-release.apk \ --test test/android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk \ --device-ids flame --os-version-ids 29 --locales en --orientations portrait --timeout 20m \ --directories-to-pull /sdcard/test/results --results-dir unit-test-${CIRCLE_BUILD_NUM} \ --no-record-video --no-performance-metrics - run: name: Retrieve Test Result from gcloud when: always command: | testResult=$(gsutil ls gs://test-lab-186672a0qp5bq-ycr70axads3nc/unit-test-${CIRCLE_BUILD_NUM}/**/results/results.xml) mkdir -p /tmp/tests/unit-test gsutil cp $testResult /tmp/tests/unit-test - save android-render-test-runner: executor: ubuntu-eoan steps: - checkout - prepare - run: name: Build RenderTestRunner APK command: | cd render-test/android ./gradlew --parallel --max-workers=8 -Pmapbox.abis=arm64-v8a app:assembleRelease app:assembleAndroidTest - login-google-cloud-platform - run: name: Run RenderTestRunner Instrumentation Test on Firebase no_output_timeout: 20m command: | gcloud firebase test android models list gcloud firebase test android run --type instrumentation \ --app render-test/android/app/build/outputs/apk/release/app-release.apk \ --test render-test/android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk \ --device-ids flame --os-version-ids 29 --locales en --orientations portrait --timeout 20m \ --directories-to-pull /sdcard --results-dir render-test-app-${CIRCLE_BUILD_NUM} \ --no-record-video --no-performance-metrics - run: name: Retrieve TestResult from gcloud when: always command: | testResult=$(gsutil ls gs://test-lab-186672a0qp5bq-ycr70axads3nc/render-test-app-${CIRCLE_BUILD_NUM}/**/*.html) mkdir -p /tmp/tests/render-test-app gsutil cp $testResult /tmp/tests/render-test-app - run: name: Retrieve Rebaselined Metrics from gcloud command: | metricsResult=$(gsutil ls -d gs://test-lab-186672a0qp5bq-ycr70axads3nc/render-test-app-${CIRCLE_BUILD_NUM}/*/*/sdcard/baselines/*) || true gsutil -m cp -r $metricsResult metrics/android-render-test-runner/ || true mkdir -p /tmp/tests/render-test-app/rebaselined_metrics gsutil -m cp -r $metricsResult /tmp/tests/render-test-app/rebaselined_metrics || true - save trigger-pipeline: executor: ubuntu-eoan parameters: slug: type: string steps: - checkout - run: name: Trigger Pipeline command: | scripts/ci-circleci-start-pipeline.py --target-slug << parameters.slug >> sanity-checks: executor: ubuntu-eoan steps: - checkout - prepare - config: config_params: '-G Ninja -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8' - run: name: Code Generators command: | cp build/mbgl-core.license LICENSE.mbgl-core.md platform/default/include/mbgl/storage/offline_schema.js scripts/generate-shaders.js scripts/generate-style-code.js git add -A && git diff --staged --exit-code | tee nitpick.patch - run: name: Validation Scripts command: | scripts/nitpick/submodule-pin.js - run: name: CMake Format command: | cmake-format -i $(find -name '*.cmake' -and -not -path './vendor/*/*' -and -not -path './build/*') cmake-format -i $(find -name CMakeLists.txt -and -not -path './vendor/*/*' -and -not -path './build/*') git diff --exit-code | tee nitpick.patch - run: name: Clang Format command: | git diff -U0 --ignore-submodules=all --no-color origin/master... *.cpp *.hpp | clang-format-diff-8 -p1 -i git diff --exit-code | tee nitpick.patch - run: name: Clang Tidy command: | run-clang-tidy-8 -quiet -j $(nproc) -header-filter='.*' -p build $PWD/src/.*cpp $PWD/platform/.*cpp - save baselines: executor: ubuntu-eoan steps: - checkout - prepare - prepare-linux - attach_workspace: at: /tmp/attach - run: name: 'Binary Size' command: | /tmp/attach/install/linux-gcc8-release/bin/mbgl-render-test-runner -u rebaseline -p metrics/binary-size.json - run: name: 'Metrics Baselines' command: | cp -r /tmp/attach/metrics . git add -A && git diff --staged --exit-code | tee baselines.patch - save build-template: parameters: config_params: type: string default: '' build_params: type: string default: '' test_params: type: string default: '' executor_name: type: string target_is_android: type: boolean default: false target_is_linux: type: boolean default: false target_is_macos: type: boolean default: false install: type: boolean default: false metrics: type: boolean default: false style_tests: type: boolean default: false upload_coverage: type: boolean default: false publish_coverage: type: boolean default: false executor: << parameters.executor_name >> steps: - checkout - when: condition: << parameters.target_is_android >> steps: - prepare - config: config_params: << parameters.config_params >> - build: build_params: << parameters.build_params >> - when: condition: << parameters.target_is_linux >> steps: - prepare - prepare-linux - config: config_params: << parameters.config_params >> - build: build_params: << parameters.build_params >> - test: test_params: << parameters.test_params >> - when: condition: << parameters.target_is_macos >> steps: - prepare - prepare-macos - config: config_params: << parameters.config_params >> - build: build_params: << parameters.build_params >> - test: test_params: << parameters.test_params >> - when: condition: << parameters.install >> steps: - install - when: condition: << parameters.style_tests >> steps: - metrics: step_name: 'Style Tests' metrics_params: '-u rebaseline -p metrics/$CIRCLE_JOB-style.json' - when: condition: << parameters.metrics >> steps: - metrics: step_name: 'Metrics' metrics_params: '-u rebaseline -p metrics/$CIRCLE_JOB-metrics.json' - when: condition: << parameters.upload_coverage >> steps: - upload-coverage-results - when: condition: << parameters.publish_coverage >> steps: - publish-coverage-metrics - save