| # |
| # 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: 11 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 aomenc |
| - cmake --build "aom_nightly_build" --target test_libaom |
| needs: [] |
| artifacts: |
| expire_in: 1 day |
| paths: |
| - 'aom_nightly_build/aomenc' |
| - '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 ../ . |
| coverage: '/lines:\s(\d+.\d+\%)/' |
| artifacts: |
| reports: |
| coverage_report: |
| coverage_format: cobertura |
| path: 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: 10 |
| 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*:*Large*" |
| |
| - ./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, ssse3): |
| extends: .common-linux-unit-optim |
| variables: |
| AOM_OPTIM_LEVEL: ssse3 |
| |
| Linux Unit (x86_64, sse4_2): |
| extends: .common-linux-unit-optim |
| variables: |
| AOM_OPTIM_LEVEL: sse4_2 |
| |
| # |
| # 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]' |
| |
| |
| # Encode 2 GOPs in parallel and serial manner and ensure that results match. |
| .gop-enc-common: |
| stage: test |
| interruptible: true |
| variables: |
| AOMENC_LIMIT: 130 |
| AOMENC_SKIP: 0 |
| AOMENC_QP: 160 |
| AOMENC_INPUT: Vertical_Bayshore_270x480_2997.y4m |
| AOMENC_OUTPUT: serial_2gops |
| before_script: |
| - curl -s -S -f -O https://gitlab.com/AOMediaCodec/aom-testing/-/raw/master/test-files/${AOMENC_INPUT}.xz |
| - unxz ${AOMENC_INPUT}.xz |
| script: |
| - aom_nightly_build/aomenc |
| --debug |
| --cpu-used=0 |
| --passes=1 |
| --lag-in-frames=19 |
| --auto-alt-ref=1 |
| --min-gf-interval=16 |
| --max-gf-interval=16 |
| --gf-min-pyr-height=4 |
| --gf-max-pyr-height=4 |
| --kf-min-dist=65 |
| --kf-max-dist=65 |
| --use-fixed-qp-offsets=1 |
| --deltaq-mode=0 |
| --enable-tpl-model=0 |
| --end-usage=q |
| --qp=${AOMENC_QP} |
| --enable-keyframe-filtering=0 |
| --obu |
| --limit=${AOMENC_LIMIT} |
| --skip=${AOMENC_SKIP} |
| -o "${AOMENC_OUTPUT}.obu" |
| "${AOMENC_INPUT}" 2>&1 | tee "${AOMENC_OUTPUT}.psnr.log" |
| - '[ -f "${AOMENC_OUTPUT}.obu" ] || exit 1' |
| artifacts: |
| when: always |
| paths: |
| - ${AOMENC_OUTPUT}.* |
| needs: |
| - 'Linux Nightly Build' |
| |
| |
| Serial Encode (2 GOPs): |
| extends: .gop-enc-common |
| |
| |
| Parallel Encode (1st GOP): |
| extends: .gop-enc-common |
| variables: |
| AOMENC_LIMIT: 65 |
| AOMENC_SKIP: 0 |
| AOMENC_OUTPUT: parallel_gop1 |
| |
| |
| Parallel Encode (2nd GOP): |
| extends: .gop-enc-common |
| variables: |
| AOMENC_LIMIT: 130 |
| AOMENC_SKIP: 65 |
| AOMENC_OUTPUT: parallel_gop2 |
| |
| |
| Serial Parallel compare: |
| stage: report |
| interruptible: true |
| script: |
| - cat parallel_gop1.obu parallel_gop2.obu > parallel_2gops.obu |
| - diff serial_2gops.obu parallel_2gops.obu |
| needs: |
| - 'Serial Encode (2 GOPs)' |
| - 'Parallel Encode (1st GOP)' |
| - 'Parallel Encode (2nd GOP)' |