version: 2 workflows: version: 2 default: jobs: - clang-tidy: filters: branches: ignore: master - android-debug-arm-v7 - android-release-all - node4-clang39-release - node6-clang39-release - node6-clang39-debug - linux-clang39-debug - linux-clang4-sanitize-address - linux-clang4-sanitize-undefined - linux-clang4-sanitize-thread - linux-gcc4.9-debug - linux-gcc5-debug-coverage - linux-gcc5-release-qt4 - linux-gcc5-release-qt5 step-library: - &generate-cache-key run: name: Generate cache key command: | echo "$(date +"%Y-%V")" > .circle-week ccache --clear ccache --max-size=5G - &restore-cache restore_cache: keys: - 'v3/{{ .Environment.CIRCLE_JOB }}/{{ .Branch }}/{{ checksum ".circle-week" }}' - 'v3/{{ .Environment.CIRCLE_JOB }}/master/{{ checksum ".circle-week" }}' - &save-cache save_cache: key: 'v3/{{ .Environment.CIRCLE_JOB }}/{{ .Branch }}/{{ checksum ".circle-week" }}' paths: [ "node_modules", "/root/.ccache", "mason_packages/.binaries" ] - &reset-ccache-stats run: name: Clear ccache statistics command: | ccache --zero-stats ccache --show-stats - &show-ccache-stats run: name: Show ccache statistics command: ccache --show-stats - &setup-llvm-symbolizer run: name: Environment Setup command: | # LLVM has a hard check for "llvm-symbolizer" and doesn't support suffixed executables ln -s /usr/bin/llvm-symbolizer-* /usr/bin/llvm-symbolizer # We'll use tee to redirect stderr to a file so we can check for sanitiziation # https://bugs.launchpad.net/ubuntu/+source/xorg-server/+bug/1059947 sed -i 's/"$@" 2>&1/"$@"/' /usr/bin/xvfb-run - &build-node run: name: Build node command: make node - &build-linux run: name: Build linux command: make linux - &build-benchmark run: name: Build benchmark command: make benchmark - &build-test run: name: Build test command: make test - &build-qt-app run: name: Build qt-app command: make qt-app - &build-qt-test run: name: Build qt-test command: make qt-test - &run-node-tests run: name: Run node tests command: | xvfb-run --server-args="-screen 0 1024x768x24" \ logbt -- apitrace trace --api=egl -v make test-node - &run-node-tests-recycle-map run: name: Run node tests (recycling the map object) command: | xvfb-run --server-args="-screen 0 1024x768x24" \ logbt -- apitrace trace --api=egl -v make test-node-recycle-map - &run-unit-tests run: name: Run tests command: | xvfb-run --server-args="-screen 0 1024x768x24" \ make run-test - &publish-node-package run: name: Publish node package when: on_success command: platform/node/scripts/after_success.sh - &upload-render-tests store_artifacts: path: mapbox-gl-js/test/integration/render-tests/index.html destination: render-tests - &upload-render-tests-recycle-map store_artifacts: path: mapbox-gl-js/test/integration/render-tests/index-recycle-map.html destination: render-tests jobs: # ------------------------------------------------------------------------------ clang-tidy: docker: - image: mbgl/ci:r4-linux-clang-3.9 working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: Debug steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - run: name: Fetch 'origin/master' branch command: git fetch origin master:refs/remotes/origin/master - run: name: Generate compilation database command: make compdb - *show-ccache-stats - *save-cache - run: name: Run Clang checks command: make check # ------------------------------------------------------------------------------ android-debug-arm-v7: docker: - image: mbgl/ci@sha256:c34e221294d81da80918d3e9a9df5de795b067e88f86d7c9a5e262763332536e resource_class: large working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: Debug IS_LOCAL_DEVELOPMENT: false steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - run: name: Build libmapbox-gl.so for arm-v7 command: make android-lib-arm-v7 - run: name: Compile Core tests for arm-v7 command: make android-test-lib-arm-v7 - run: name: Test phone module command: make run-android-unit-test - run: name: Generate Espresso sanity tests command: make test-code-android - run: name: Check Java code style command: make android-checkstyle - run: name: Check Android modules for potential bugs (Lint SDK) command: | make android-lint-sdk - run: name: Check Android modules for potential bugs (Lint Test App) command: | make android-lint-test-app - run: name: Build Test APK command: | echo "${MAPBOX_DEVELOPER_CONFIG_XML}" > platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/developer-config.xml make android-ui-test-arm-v7 - *show-ccache-stats - *save-cache - run: name: Log in to Google Cloud Platform shell: /bin/bash -euo pipefail command: | echo "${GCLOUD_SERVICE_ACCOUNT_JSON}" > secret.json gcloud auth activate-service-account --key-file secret.json --project android-gl-native rm secret.json - run: name: Run instrumentation tests on Firebase no_output_timeout: 1200 shell: /bin/bash -euo pipefail command: | gcloud firebase test android models list (gcloud firebase test android run --type instrumentation \ --app platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk/MapboxGLAndroidSDKTestApp-debug.apk \ --test platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk/MapboxGLAndroidSDKTestApp-debug-androidTest.apk \ --device-ids shamu --os-version-ids 22 --locales en --orientations portrait --timeout 20m \ --test-targets "package com.mapbox.mapboxsdk.testapp.style" 2>&1 | tee firebase.log) || EXIT_CODE=$? FIREBASE_TEST_BUCKET=$(sed -n 's|^.*\[https://console.developers.google.com/storage/browser/\([^]]*\).*|gs://\1|p' firebase.log) echo "Downloading from: ${FIREBASE_TEST_BUCKET}" gsutil -m cp -n -R -Z "$FIREBASE_TEST_BUCKET*" platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk echo "Try running ndk-stack on downloaded logcat to symbolicate the stacktraces:" find platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk -type f -name "logcat" -print0 | \ xargs -0 -I '{}' ${ANDROID_NDK_HOME}/ndk-stack -sym build/android-arm-v7/Debug -dump {} exit ${EXIT_CODE:-0} - store_artifacts: path: platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk destination: . - store_artifacts: path: platform/android/MapboxGLAndroidSDK/build/reports/lint-results.html - store_artifacts: path: platform/android/MapboxGLAndroidSDK/build/reports/lint-results.xml - store_artifacts: path: platform/android/MapboxGLAndroidSDK/lint-baseline.xml - store_artifacts: path: platform/android/MapboxGLAndroidSDKTestApp/build/reports/lint-results.html - store_artifacts: path: platform/android/MapboxGLAndroidSDKTestApp/build/reports/lint-results.xml - store_artifacts: path: platform/android/MapboxGLAndroidSDKTestApp/lint-baseline.xml # ------------------------------------------------------------------------------ android-release-all: docker: - image: mbgl/ci@sha256:c34e221294d81da80918d3e9a9df5de795b067e88f86d7c9a5e262763332536e resource_class: large working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: Release IS_LOCAL_DEVELOPMENT: false steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - run: name: Generate Maven credentials shell: /bin/bash -euo pipefail command: | aws s3 cp s3://mapbox/android/signing-credentials/secring.gpg platform/android/MapboxGLAndroidSDK/secring.gpg echo "NEXUS_USERNAME=$PUBLISH_NEXUS_USERNAME NEXUS_PASSWORD=$PUBLISH_NEXUS_PASSWORD signing.keyId=$SIGNING_KEYID signing.password=$SIGNING_PASSWORD signing.secretKeyRingFile=secring.gpg" >> platform/android/MapboxGLAndroidSDK/gradle.properties - run: name: Build package command: make apackage - *show-ccache-stats - *save-cache - store_artifacts: path: platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk destination: . - deploy: name: Show statistics command: | [ "${CIRCLE_BRANCH}" == "master" ] && export CLOUDWATCH=true platform/android/scripts/metrics.sh - deploy: name: Publish to Maven command: | if [ "${CIRCLE_BRANCH}" == "master" ]; then make run-android-upload-archives ; fi # ------------------------------------------------------------------------------ node4-clang39-release: docker: - image: mbgl/ci:r4-linux-clang-3.9-node-4 working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: RelWithDebInfo WITH_EGL: 1 PACKAGE_JSON_VERSION: $(node -e "console.log(require('./package.json').version)") PUBLISH: $([[ "${CIRCLE_BRANCH}" == "node-v${PACKAGE_JSON_VERSION}" ]] && echo true) steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *build-node - *show-ccache-stats - *save-cache - *run-node-tests - *publish-node-package - *upload-render-tests # ------------------------------------------------------------------------------ node6-clang39-release: docker: - image: mbgl/ci:r4-linux-clang-3.9 working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: RelWithDebInfo WITH_EGL: 1 PACKAGE_JSON_VERSION: $(node -e "console.log(require('./package.json').version)") PUBLISH: $([[ "${CIRCLE_BRANCH}" == "node-v${PACKAGE_JSON_VERSION}" ]] && echo true) steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *build-node - *show-ccache-stats - *save-cache - *run-node-tests - *publish-node-package - *upload-render-tests # ------------------------------------------------------------------------------ node6-clang39-debug: docker: - image: mbgl/ci:r4-linux-clang-3.9 working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: Debug WITH_EGL: 1 PACKAGE_JSON_VERSION: $(node -e "console.log(require('./package.json').version)") PUBLISH: $([[ "${CIRCLE_BRANCH}" == "node-v${PACKAGE_JSON_VERSION}" ]] && echo true) steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *build-node - *show-ccache-stats - *save-cache - *run-node-tests-recycle-map - *publish-node-package - *upload-render-tests-recycle-map # ------------------------------------------------------------------------------ linux-clang39-debug: docker: - image: mbgl/ci:r4-linux-clang-3.9 working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: Debug WITH_EGL: 1 steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *build-linux - *build-benchmark - *build-test - *show-ccache-stats - *save-cache - *run-unit-tests # ------------------------------------------------------------------------------ linux-clang4-sanitize-address: docker: - image: mbgl/ci:r4-linux-clang-4 working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: Sanitize WITH_EGL: 1 GDB: '' # Do not run with GDB CXXFLAGS: -fsanitize=address LDFLAGS: -fsanitize=address ASAN_OPTIONS: detect_leaks=0:color=always:print_summary=1 steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *setup-llvm-symbolizer - *build-test - *show-ccache-stats - *save-cache - run: name: Run tests command: | xvfb-run --server-args="-screen 0 1024x768x24" make run-test 2> >(tee sanitizer 1>&2) # Unfortunately, Google Test eats the status code, so we'll have to check the output. [ -z "$(sed -n '/^SUMMARY: AddressSanitizer:/p' sanitizer)" ] # ------------------------------------------------------------------------------ linux-clang4-sanitize-undefined: docker: - image: mbgl/ci:r4-linux-clang-4 working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: Sanitize WITH_EGL: 1 GDB: '' # Do not run with GDB CXXFLAGS: -fsanitize=undefined LDFLAGS: -fsanitize=undefined UBSAN_OPTIONS: print_stacktrace=1:color=always:print_summary=1 steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *setup-llvm-symbolizer - *build-test - *show-ccache-stats - *save-cache - run: name: Run tests command: | xvfb-run --server-args="-screen 0 1024x768x24" make run-test 2> >(tee sanitizer 1>&2) # Unfortunately, Google Test eats the status code, so we'll have to check the output. [ -z "$(sed -n '/^SUMMARY: UndefinedBehaviorSanitizer:/p' sanitizer)" ] # ------------------------------------------------------------------------------ linux-clang4-sanitize-thread: docker: - image: mbgl/ci:r4-linux-clang-4 working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 4 BUILDTYPE: Sanitize WITH_EGL: 1 GDB: '' # Do not run with GDB CXXFLAGS: -fsanitize=thread LDFLAGS: -fsanitize=thread TSAN_OPTIONS: color=always:print_summary=1 steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *setup-llvm-symbolizer - *build-test - *show-ccache-stats - *save-cache - run: name: Run tests command: | xvfb-run --server-args="-screen 0 1024x768x24" make run-test 2> >(tee sanitizer 1>&2) # Unfortunately, Google Test eats the status code, so we'll have to check the output. [ -z "$(sed -n '/^SUMMARY: ThreadSanitizer:/p' sanitizer)" ] # ------------------------------------------------------------------------------ linux-gcc4.9-debug: docker: - image: mbgl/ci:r4-linux-gcc-4.9 resource_class: large working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 2 BUILDTYPE: Debug WITH_EGL: 1 WITH_CXX11ABI: 0 DISPLAY: :0 steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *build-linux - *build-benchmark - *build-test - *show-ccache-stats - *save-cache - *run-unit-tests # ------------------------------------------------------------------------------ linux-gcc5-debug-coverage: docker: - image: mbgl/ci:r4-linux-gcc-5 resource_class: large working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 2 BUILDTYPE: Debug WITH_EGL: 1 WITH_COVERAGE: 1 steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *build-linux - *build-benchmark - *build-test - *show-ccache-stats - *save-cache - *run-unit-tests - run: name: Upload coverage results to coveralls command: | platform/linux/scripts/coveralls.sh # ------------------------------------------------------------------------------ linux-gcc5-release-qt4: docker: - image: mbgl/ci:r4-linux-gcc-5-qt-4 resource_class: large working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 2 # OOM, causing the compiler to crash. BUILDTYPE: Release GTEST_OUTPUT: xml LD_PRELOAD: /usr/lib/x86_64-linux-gnu/libjemalloc.so steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *build-qt-app - *build-qt-test - *show-ccache-stats - *save-cache - run: name: Run memory-load tests command: | xvfb-run --server-args="-screen 0 1024x768x24" \ make run-qt-test-Memory.*:*.Load scripts/log_memory_benchmarks.sh test_detail.xml "Platform=Linux,Compiler=${_CC},Arch=$(uname -m)" # ------------------------------------------------------------------------------ linux-gcc5-release-qt5: docker: - image: mbgl/ci:r4-linux-gcc-5-qt-5 resource_class: large working_directory: /src environment: LIBSYSCONFCPUS: 4 JOBS: 2 # OOM, causing the compiler to crash. BUILDTYPE: Release WITH_QT_I18N: 1 steps: - checkout - *generate-cache-key - *restore-cache - *reset-ccache-stats - *build-qt-app - *build-qt-test - run: name: Build qt-docs command: make qt-docs - *show-ccache-stats - *save-cache - run: name: Run valgrind-backed tests environment: JOBS: 1 # https://github.com/mapbox/mapbox-gl-native/issues/9108 command: | xvfb-run --server-args="-screen 0 1024x768x24" \ scripts/valgrind.sh build/qt-linux-x86_64/Release/mbgl-test --gtest_filter=-*.Load --gtest_filter=-Memory.Vector