|  | # | 
|  | # Nightly-only jobs | 
|  | # | 
|  | # This file is conditionally included in the main | 
|  | # .gitlab-ci.yml only when doing nightly builds | 
|  | # so the builds here do not explicitly need to be | 
|  | # made nightly-only using rules. | 
|  | # | 
|  |  | 
|  | default: | 
|  | timeout: 8 hours | 
|  |  | 
|  | # Simple x86_64 Linux build | 
|  | Linux Nightly Build: | 
|  | stage: build | 
|  | interruptible: true | 
|  | variables: | 
|  | CMAKE_FLAGS: >- | 
|  | -DCMAKE_BUILD_TYPE=RelWithDebInfo | 
|  | -DAOM_EXTRA_C_FLAGS="--coverage" | 
|  | -DAOM_EXTRA_CXX_FLAGS="--coverage" | 
|  | -DAOM_EXTRA_EXE_LINKER_FLAGS="--coverage" | 
|  | script: | 
|  | - 'echo "CMake Flags: $CMAKE_FLAGS"' | 
|  | - cmake -B "aom_nightly_build" -GNinja $CMAKE_FLAGS | 
|  | - cmake --build "aom_nightly_build" --target test_libaom | 
|  | needs: [] | 
|  | artifacts: | 
|  | expire_in: 1 day | 
|  | paths: | 
|  | - 'aom_nightly_build/test_libaom' | 
|  | - 'aom_nightly_build/**/*.gcno' | 
|  | - 'aom_nightly_build/**/*.[hc]' | 
|  |  | 
|  | # Full unit tests run (with coverage report) | 
|  | Linux All Unit Test: | 
|  | stage: test | 
|  | interruptible: true | 
|  | parallel: 24 | 
|  | variables: | 
|  | LIBAOM_TEST_DATA_PATH: ${CI_PROJECT_DIR}/libaom-test-data | 
|  | GTEST_TOTAL_SHARDS: ${CI_NODE_TOTAL} | 
|  | GTEST_OUTPUT: "xml:report.xml" | 
|  | before_script: | 
|  | - export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1)) | 
|  | script: | 
|  | - cd aom_nightly_build | 
|  | - ./test_libaom | 
|  | - gcovr | 
|  | --exclude '../third_party/' | 
|  | --json -o "coverage_${CI_NODE_INDEX}.json" | 
|  | -r ../ . | 
|  | needs: | 
|  | - 'Test Data' | 
|  | - 'Linux Nightly Build' | 
|  | artifacts: | 
|  | when: always | 
|  | reports: | 
|  | junit: ./aom_nightly_build/report.xml | 
|  | paths: | 
|  | - aom_nightly_build/coverage_*.json | 
|  |  | 
|  | # Produce actual coverage report from the | 
|  | # "Linux All Unit Test" job that ran in the | 
|  | # test stage before. | 
|  | Coverage Report: | 
|  | stage: report | 
|  | interruptible: true | 
|  | script: | 
|  | - mkdir -p coverage-html | 
|  | - cd aom_nightly_build | 
|  | # the find can be replace with --add-tracefile "coverage_*.json" once | 
|  | # next release of gcovr is done (current is gcovr 4.2) | 
|  | # additionally --html-self-contained could then be used. | 
|  | - >- | 
|  | gcovr | 
|  | $(find . -name 'coverage_*.json' -printf '--add-tracefile %p ') | 
|  | --exclude '../third_party/' | 
|  | --xml ../coverage.xml | 
|  | --html --html-details ../coverage-html/coverage.html | 
|  | --print-summary | 
|  | -r ../ . | 
|  | artifacts: | 
|  | reports: | 
|  | cobertura: coverage.xml | 
|  | paths: | 
|  | - coverage-html | 
|  |  | 
|  | # | 
|  | # Tests run with varying SIMD levels | 
|  | # [sse2, sse3, ssse3, sse4_1, sse4_2, avx2] | 
|  | # | 
|  | # This is not done with a big matrix, because | 
|  | # GitLab CI has a limitation on expanding matrices | 
|  | # being limited to 50 jobs only. If that limit is | 
|  | # ever raised, this should be re-written using a | 
|  | # matrix! | 
|  | # | 
|  |  | 
|  | # Common unit-optim template | 
|  | # This is inherited by all the SIMD-level jobs | 
|  | .common-linux-unit-optim: | 
|  | stage: test | 
|  | interruptible: true | 
|  | parallel: 20 | 
|  | variables: | 
|  | LIBAOM_TEST_DATA_PATH: ${CI_PROJECT_DIR}/libaom-test-data | 
|  | GTEST_TOTAL_SHARDS: ${CI_NODE_TOTAL} | 
|  | GTEST_OUTPUT: "xml:report.xml" | 
|  | script: | 
|  | - cd aom_nightly_build | 
|  | - | | 
|  | case "${AOM_OPTIM_LEVEL}" in | 
|  | sse) export AOM_SIMD_CAPS_MASK=0x3 ;; | 
|  | sse2) export AOM_SIMD_CAPS_MASK=0x7 ;; | 
|  | sse3) export AOM_SIMD_CAPS_MASK=0xf ;; | 
|  | ssse3) export AOM_SIMD_CAPS_MASK=0x1f ;; | 
|  | sse4_1) export AOM_SIMD_CAPS_MASK=0x3f ;; | 
|  | # sse4_2 was added *after* avx2 so the mask is a little weird | 
|  | sse4_2) export AOM_SIMD_CAPS_MASK=0x13f ;; | 
|  | avx2) export AOM_SIMD_CAPS_MASK=0x1ff ;; | 
|  | esac | 
|  |  | 
|  | test_filter="-C*:MMX*:SSE*:SSSE*:AVX*" | 
|  |  | 
|  | - ./test_libaom --gtest_filter=${test_filter} | 
|  | needs: | 
|  | - 'Test Data' | 
|  | - 'Linux Nightly Build' | 
|  | artifacts: | 
|  | when: always | 
|  | reports: | 
|  | junit: ./aom_nightly_build/report.xml | 
|  | before_script: | 
|  | - export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1)) | 
|  |  | 
|  | Linux Unit (x86_64, sse2): | 
|  | extends: .common-linux-unit-optim | 
|  | variables: | 
|  | AOM_OPTIM_LEVEL: sse2 | 
|  |  | 
|  | Linux Unit (x86_64, sse3): | 
|  | extends: .common-linux-unit-optim | 
|  | variables: | 
|  | AOM_OPTIM_LEVEL: sse3 | 
|  |  | 
|  | Linux Unit (x86_64, ssse3): | 
|  | extends: .common-linux-unit-optim | 
|  | variables: | 
|  | AOM_OPTIM_LEVEL: ssse3 | 
|  |  | 
|  | Linux Unit (x86_64, sse4_1): | 
|  | extends: .common-linux-unit-optim | 
|  | variables: | 
|  | AOM_OPTIM_LEVEL: sse4_1 | 
|  |  | 
|  | Linux Unit (x86_64, sse4_2): | 
|  | extends: .common-linux-unit-optim | 
|  | variables: | 
|  | AOM_OPTIM_LEVEL: sse4_2 | 
|  |  | 
|  | Linux Unit (x86_64, avx2): | 
|  | extends: .common-linux-unit-optim | 
|  | variables: | 
|  | AOM_OPTIM_LEVEL: avx2 | 
|  |  | 
|  | # | 
|  | # Sanitizer jobs | 
|  | # The following jobs run the unit tests but | 
|  | # with a built where the respective sanitizers | 
|  | # are enabled. | 
|  | # | 
|  | # This is not using a matrix as the jobs | 
|  | # depend on other jobs that were built by | 
|  | # a matrix job before and a matrix can not | 
|  | # depend on other matrix-jobs unfortunately. | 
|  | # | 
|  |  | 
|  | # Common sanitizer unit tests template | 
|  | # This is inherited by all sanitizer test jobs | 
|  | .sanitizer-common-nigtly: | 
|  | stage: test | 
|  | interruptible: true | 
|  | parallel: 24 | 
|  | variables: | 
|  | LIBAOM_TEST_DATA_PATH: ${CI_PROJECT_DIR}/libaom-test-data | 
|  | GTEST_TOTAL_SHARDS: ${CI_NODE_TOTAL} | 
|  | GTEST_OUTPUT: "xml:report.xml" | 
|  | SANITIZER_OPTIONS: "\ | 
|  | :handle_segv=1\ | 
|  | :handle_abort=1\ | 
|  | :handle_sigfpe=1\ | 
|  | :fast_unwind_on_fatal=1\ | 
|  | :allocator_may_return_null=1" | 
|  | before_script: | 
|  | - export PATH="/usr/lib/llvm-12/bin:${PATH}" | 
|  | - export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1)) | 
|  | script: | 
|  | - | | 
|  | case $AOM_SANITIZER_TYPE in | 
|  | address) | 
|  | SANITIZER_OPTIONS="${SANITIZER_OPTIONS}:detect_stack_use_after_return=1" | 
|  | SANITIZER_OPTIONS="${SANITIZER_OPTIONS}:max_uar_stack_size_log=17" | 
|  | export ASAN_OPTIONS="${SANITIZER_OPTIONS}" | 
|  | ;; | 
|  | memory) | 
|  | export MSAN_OPTIONS="${SANITIZER_OPTIONS}" | 
|  | ;; | 
|  | thread) | 
|  | # The thread sanitizer uses a subset. | 
|  | TSAN_OPTIONS="handle_sigfpe=1" | 
|  | TSAN_OPTIONS="$TSAN_OPTIONS handle_segv=1" | 
|  | TSAN_OPTIONS="$TSAN_OPTIONS handle_abort=1" | 
|  | export TSAN_OPTIONS | 
|  | ;; | 
|  | undefined|integer) | 
|  | SANITIZER_OPTIONS="${SANITIZER_OPTIONS}:print_stacktrace=1:suppressions=.gitlab/UBSan.supp" | 
|  | export UBSAN_OPTIONS="${SANITIZER_OPTIONS}" | 
|  | ;; | 
|  | esac | 
|  | - | | 
|  | filter="*Large*" | 
|  | # As of 17 May 2018 there are no large threading tests. | 
|  | [ "${AOM_SANITIZER_TYPE}" = "thread" ] && filter="*Thread*Large*" || : | 
|  | - ./aom_build/${AOM_SANITIZER_TYPE}/test_libaom --gtest_filter="${filter}" 2> >(tee -a sanitizer.log >&2) | 
|  | - | | 
|  | # Looking for sanitizer output in log... | 
|  | grep -q "\(ERROR\|WARNING\): \(Address\|Thread\|Memory\|Leak\)Sanitizer:" sanitizer.log && { | 
|  | echo "Found sanitizer errors or warnings, check the log:" | 
|  | cat sanitizer.log | 
|  | exit 1 | 
|  | } | 
|  | # Looking for UBSan output in log (differs from the common format) | 
|  | grep -q ":[[:digit:]]\+:[[:digit:]]\+: runtime error:" sanitizer.log && { | 
|  | echo "Found sanitizer errors or warnings, check the log:" | 
|  | cat sanitizer.log | 
|  | exit 1 | 
|  | } | 
|  | echo "No sanitizer errors found" | 
|  | artifacts: | 
|  | expose_as: 'Nightly sanitizer logs' | 
|  | name: "sanitizer.log-$CI_JOB_ID" | 
|  | when: on_failure | 
|  | paths: | 
|  | - sanitizer.log | 
|  |  | 
|  | Linux Sanitizer (address) Test Nightly: | 
|  | extends: .sanitizer-common-nigtly | 
|  | variables: | 
|  | AOM_SANITIZER_TYPE: address | 
|  | needs: | 
|  | - 'Test Data' | 
|  | - 'Linux Sanitizers (x86_64-clang): [address]' | 
|  |  | 
|  | Linux Sanitizer (undefined) Test Nightly: | 
|  | extends: .sanitizer-common-nigtly | 
|  | variables: | 
|  | AOM_SANITIZER_TYPE: undefined | 
|  | needs: | 
|  | - 'Test Data' | 
|  | - 'Linux Sanitizers (x86_64-clang): [undefined]' | 
|  |  | 
|  | Linux Sanitizer (integer) Test Nightly: | 
|  | extends: .sanitizer-common-nigtly | 
|  | variables: | 
|  | AOM_SANITIZER_TYPE: integer | 
|  | needs: | 
|  | - 'Test Data' | 
|  | - 'Linux Sanitizers (x86_64-clang): [integer]' | 
|  |  | 
|  | Linux Sanitizer (thread) Test Nightly: | 
|  | extends: .sanitizer-common-nigtly | 
|  | variables: | 
|  | AOM_SANITIZER_TYPE: thread | 
|  | needs: | 
|  | - 'Test Data' | 
|  | - 'Linux Sanitizers (x86_64-clang): [thread]' |