blob: bed2cc608a7183d2fe9a183b4e5740d0c169caab [file] [log] [blame] [edit]
#
# 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
# CMake 4.0.0 removed compatibility with CMake < 3.5. Add
# -DCMAKE_POLICY_VERSION_MINIMUM=3.5 to try configuring anyway.
variables:
CMAKE_FLAGS: >-
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
-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]'
- 'aom_nightly_build/**/*.[hc]pp'
- 'aom_nightly_build/**/*.cc'
- 'aom_nightly_build/**/*.inc'
# 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
# Ignore parse errors due to a bug in `gcovr 7.0`:
# https://github.com/gcovr/gcovr/issues/882
# Ignore errors about 'no_working_dir_found' because
# tarballs for third_party code (e.g. tensorflow and dependencies) are NOT
# extracted here and so the source files from those are NOT available.
- >-
gcovr
--gcov-ignore-parse-errors
--gcov-ignore-errors=no_working_dir_found
--gcov-executable gcov-14
--exclude ../third_party --exclude _deps --exclude abseil-cpp --exclude
benchmark --exclude cpuinfo --exclude eigen --exclude farmhash --exclude
fft2d --exclude flatbuffers --exclude flatbuffers-flatc --exclude fp16
--exclude FP16 --exclude FXdiv --exclude psimd --exclude ml_dtypes
--exclude neon2sse --exclude protobuf --exclude pthreadpool --exclude
pthreadpool-source --exclude ruy --exclude xnnpack --exclude XNNPACK
--exclude gemmlowp --exclude googletest
--exclude-directories "third_party"
--exclude-directories "aom_nightly_build/third_party"
--json -o "coverage_${CI_NODE_INDEX}.json"
-r ../ . > "coverage_${CI_NODE_INDEX}.log" 2>&1
needs:
- 'Test Data'
- 'Linux Nightly Build'
artifacts:
when: always
reports:
junit: ./aom_nightly_build/report.xml
paths:
- aom_nightly_build/coverage_*.json
- aom_nightly_build/coverage_*.log
# 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
- >-
gcovr
--gcov-executable gcov-14
--add-tracefile "coverage_*.json"
--exclude ../third_party --exclude _deps --exclude abseil-cpp --exclude
benchmark --exclude cpuinfo --exclude eigen --exclude farmhash --exclude
fft2d --exclude flatbuffers --exclude flatbuffers-flatc --exclude fp16
--exclude FP16 --exclude FXdiv --exclude psimd --exclude ml_dtypes
--exclude neon2sse --exclude protobuf --exclude pthreadpool --exclude
pthreadpool-source --exclude ruy --exclude xnnpack --exclude XNNPACK
--exclude gemmlowp --exclude googletest
--xml ../coverage.xml
--html --html-details ../coverage-html/coverage.html
--print-summary
-r ../ .
needs:
- 'Linux Nightly Build'
- 'Linux All Unit Test'
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-18/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}"
;;
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
parallel: 34
variables:
AOM_SANITIZER_TYPE: address
needs:
- 'Test Data'
- 'Linux Sanitizers (x86_64-clang): [address]'
Linux Sanitizer (undefined) Test Nightly:
extends: .sanitizer-common-nigtly
parallel: 34
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
parallel: 16
variables:
AOM_SANITIZER_TYPE: thread
needs:
- 'Test Data'
- 'Linux Sanitizers (x86_64-clang): [thread]'
# Memory sanitizer (MSan) needs special setup where some standard libraries
# have to be built with memory sanitizer. Hence, the separate build and test
# jobs for MSan.
Linux Sanitizers (x86_64-clang) (Memory):
stage: build
interruptible: true
script:
- LLVM_VERSION_MAJOR=18
- LLVM_VERSION="${LLVM_VERSION_MAJOR}.1.3"
- export PATH="/usr/lib/llvm-${LLVM_VERSION_MAJOR}/bin:${PATH}"
# Build cxx and cxxabi with msan.
- git clone --depth=1 --branch llvmorg-${LLVM_VERSION} https://github.com/llvm/llvm-project
- LLVM_MSAN_BUILD_DIR=${PWD}/llvm-project/msan_out
- cmake -G Ninja -S llvm-project/runtimes -B "${LLVM_MSAN_BUILD_DIR}"
-DCMAKE_BUILD_TYPE=Release
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind"
-DCMAKE_C_COMPILER=clang
-DCMAKE_CXX_COMPILER=clang++
-DLLVM_USE_SANITIZER=MemoryWithOrigins
-DLIBCXXABI_USE_LLVM_UNWINDER=OFF
- cmake --build "${LLVM_MSAN_BUILD_DIR}" --config Release -- cxx cxxabi unwind
# Build AVM with msan.
- AVM_MSAN_BUILD_DIR="aom_build/memory"
- |
MSAN_CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2"
MSAN_CFLAGS="${MSAN_CFLAGS} -fno-omit-frame-pointer -g -O2"
MSAN_CFLAGS="${MSAN_CFLAGS} -I${LLVM_MSAN_BUILD_DIR}/include"
- |
MSAN_CXXFLAGS="${MSAN_CFLAGS}"
MSAN_CXXFLAGS="${MSAN_CXXFLAGS} -I${LLVM_MSAN_BUILD_DIR}/include/c++/v1"
MSAN_CXXFLAGS="${MSAN_CXXFLAGS} -stdlib=libc++"
- MSAN_LD_FLAGS="${MSAN_CXXFLAGS} -L${LLVM_MSAN_BUILD_DIR}/lib -lc++abi"
- export CFLAGS="${MSAN_CFLAGS}"
- export CXXFLAGS="${MSAN_CXXFLAGS}"
- export LDFLAGS="${MSAN_LD_FLAGS}"
- echo "CFLAGS = ${CFLAGS}"
- echo "CXXFLAGS = ${CXXFLAGS}"
- echo "LDFLAGS = ${LDFLAGS}"
- cmake -B "${AVM_MSAN_BUILD_DIR}" -G Ninja
-DAOM_TARGET_CPU=generic
-DCMAKE_C_COMPILER=clang
-DCMAKE_CXX_COMPILER=clang++
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
-DENABLE_CCACHE=1
-DENABLE_EXAMPLES=0
- cmake --build "${AVM_MSAN_BUILD_DIR}" --target test_libaom
needs: []
artifacts:
expire_in: 1 day
paths:
- aom_build/*/test_libaom
- llvm-project/msan_out/lib/
Linux Sanitizer (memory) Test Nightly:
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"
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-18/bin:${PATH}"
- export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1))
script:
- export MSAN_OPTIONS="${SANITIZER_OPTIONS}"
- export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${PWD}/llvm-project/msan_out/lib"
- filter="-*Large*:*MD5Test*:*TestVectorTest*:*InvalidFile*:*ExternalFrameBuffer*:*UninstantiatedParameterizedTestSuite*"
- ./aom_build/memory/test_libaom --gtest_filter="${filter}"
needs:
- 'Test Data'
- 'Linux Sanitizers (x86_64-clang) (Memory)'
# 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)'