Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 1 | # |
| 2 | # Nightly-only jobs |
| 3 | # |
| 4 | # This file is conditionally included in the main |
| 5 | # .gitlab-ci.yml only when doing nightly builds |
| 6 | # so the builds here do not explicitly need to be |
| 7 | # made nightly-only using rules. |
| 8 | # |
| 9 | |
| 10 | default: |
Urvang Joshi | 5fcb31c | 2022-12-22 13:49:32 -0800 | [diff] [blame] | 11 | timeout: 11 hours |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 12 | |
| 13 | # Simple x86_64 Linux build |
| 14 | Linux Nightly Build: |
| 15 | stage: build |
| 16 | interruptible: true |
| 17 | variables: |
| 18 | CMAKE_FLAGS: >- |
| 19 | -DCMAKE_BUILD_TYPE=RelWithDebInfo |
| 20 | -DAOM_EXTRA_C_FLAGS="--coverage" |
| 21 | -DAOM_EXTRA_CXX_FLAGS="--coverage" |
| 22 | -DAOM_EXTRA_EXE_LINKER_FLAGS="--coverage" |
| 23 | script: |
| 24 | - 'echo "CMake Flags: $CMAKE_FLAGS"' |
| 25 | - cmake -B "aom_nightly_build" -GNinja $CMAKE_FLAGS |
Urvang Joshi | fd4d39d | 2022-12-06 01:01:25 +0000 | [diff] [blame] | 26 | - cmake --build "aom_nightly_build" --target aomenc |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 27 | - cmake --build "aom_nightly_build" --target test_libaom |
| 28 | needs: [] |
| 29 | artifacts: |
| 30 | expire_in: 1 day |
| 31 | paths: |
Urvang Joshi | fd4d39d | 2022-12-06 01:01:25 +0000 | [diff] [blame] | 32 | - 'aom_nightly_build/aomenc' |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 33 | - 'aom_nightly_build/test_libaom' |
| 34 | - 'aom_nightly_build/**/*.gcno' |
| 35 | - 'aom_nightly_build/**/*.[hc]' |
| 36 | |
| 37 | # Full unit tests run (with coverage report) |
| 38 | Linux All Unit Test: |
| 39 | stage: test |
| 40 | interruptible: true |
ePirat | 27f3773 | 2022-02-09 01:56:15 +0000 | [diff] [blame] | 41 | parallel: 24 |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 42 | variables: |
| 43 | LIBAOM_TEST_DATA_PATH: ${CI_PROJECT_DIR}/libaom-test-data |
| 44 | GTEST_TOTAL_SHARDS: ${CI_NODE_TOTAL} |
| 45 | GTEST_OUTPUT: "xml:report.xml" |
| 46 | before_script: |
| 47 | - export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1)) |
| 48 | script: |
| 49 | - cd aom_nightly_build |
| 50 | - ./test_libaom |
| 51 | - gcovr |
| 52 | --exclude '../third_party/' |
| 53 | --json -o "coverage_${CI_NODE_INDEX}.json" |
| 54 | -r ../ . |
| 55 | needs: |
| 56 | - 'Test Data' |
| 57 | - 'Linux Nightly Build' |
| 58 | artifacts: |
| 59 | when: always |
| 60 | reports: |
| 61 | junit: ./aom_nightly_build/report.xml |
| 62 | paths: |
| 63 | - aom_nightly_build/coverage_*.json |
| 64 | |
| 65 | # Produce actual coverage report from the |
| 66 | # "Linux All Unit Test" job that ran in the |
| 67 | # test stage before. |
| 68 | Coverage Report: |
| 69 | stage: report |
| 70 | interruptible: true |
| 71 | script: |
| 72 | - mkdir -p coverage-html |
| 73 | - cd aom_nightly_build |
| 74 | # the find can be replace with --add-tracefile "coverage_*.json" once |
| 75 | # next release of gcovr is done (current is gcovr 4.2) |
| 76 | # additionally --html-self-contained could then be used. |
| 77 | - >- |
| 78 | gcovr |
| 79 | $(find . -name 'coverage_*.json' -printf '--add-tracefile %p ') |
| 80 | --exclude '../third_party/' |
| 81 | --xml ../coverage.xml |
| 82 | --html --html-details ../coverage-html/coverage.html |
| 83 | --print-summary |
| 84 | -r ../ . |
Vibhoothi | 19166cb | 2022-05-24 13:47:39 +0000 | [diff] [blame] | 85 | coverage: '/lines:\s(\d+.\d+\%)/' |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 86 | artifacts: |
| 87 | reports: |
Vibhoothi | 7ddf68e | 2022-05-12 00:07:08 +0000 | [diff] [blame] | 88 | coverage_report: |
| 89 | coverage_format: cobertura |
Marvin Scholz | 839f141 | 2022-05-19 21:31:14 +0200 | [diff] [blame] | 90 | path: coverage.xml |
| 91 | paths: |
| 92 | - coverage-html |
Vibhoothi | 7ddf68e | 2022-05-12 00:07:08 +0000 | [diff] [blame] | 93 | |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 94 | |
| 95 | # |
| 96 | # Tests run with varying SIMD levels |
| 97 | # [sse2, sse3, ssse3, sse4_1, sse4_2, avx2] |
| 98 | # |
| 99 | # This is not done with a big matrix, because |
| 100 | # GitLab CI has a limitation on expanding matrices |
| 101 | # being limited to 50 jobs only. If that limit is |
| 102 | # ever raised, this should be re-written using a |
| 103 | # matrix! |
| 104 | # |
| 105 | |
| 106 | # Common unit-optim template |
| 107 | # This is inherited by all the SIMD-level jobs |
| 108 | .common-linux-unit-optim: |
| 109 | stage: test |
| 110 | interruptible: true |
Urvang Joshi | bfa91fd | 2022-12-12 19:11:33 +0000 | [diff] [blame] | 111 | parallel: 10 |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 112 | variables: |
| 113 | LIBAOM_TEST_DATA_PATH: ${CI_PROJECT_DIR}/libaom-test-data |
| 114 | GTEST_TOTAL_SHARDS: ${CI_NODE_TOTAL} |
| 115 | GTEST_OUTPUT: "xml:report.xml" |
| 116 | script: |
| 117 | - cd aom_nightly_build |
| 118 | - | |
| 119 | case "${AOM_OPTIM_LEVEL}" in |
| 120 | sse) export AOM_SIMD_CAPS_MASK=0x3 ;; |
| 121 | sse2) export AOM_SIMD_CAPS_MASK=0x7 ;; |
| 122 | sse3) export AOM_SIMD_CAPS_MASK=0xf ;; |
| 123 | ssse3) export AOM_SIMD_CAPS_MASK=0x1f ;; |
| 124 | sse4_1) export AOM_SIMD_CAPS_MASK=0x3f ;; |
| 125 | # sse4_2 was added *after* avx2 so the mask is a little weird |
| 126 | sse4_2) export AOM_SIMD_CAPS_MASK=0x13f ;; |
| 127 | avx2) export AOM_SIMD_CAPS_MASK=0x1ff ;; |
| 128 | esac |
| 129 | |
Urvang Joshi | bfa91fd | 2022-12-12 19:11:33 +0000 | [diff] [blame] | 130 | test_filter="-C*:MMX*:SSE*:SSSE*:AVX*:*Large*" |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 131 | |
| 132 | - ./test_libaom --gtest_filter=${test_filter} |
| 133 | needs: |
| 134 | - 'Test Data' |
| 135 | - 'Linux Nightly Build' |
| 136 | artifacts: |
| 137 | when: always |
| 138 | reports: |
| 139 | junit: ./aom_nightly_build/report.xml |
| 140 | before_script: |
| 141 | - export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1)) |
| 142 | |
| 143 | Linux Unit (x86_64, sse2): |
| 144 | extends: .common-linux-unit-optim |
| 145 | variables: |
| 146 | AOM_OPTIM_LEVEL: sse2 |
| 147 | |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 148 | Linux Unit (x86_64, ssse3): |
| 149 | extends: .common-linux-unit-optim |
| 150 | variables: |
| 151 | AOM_OPTIM_LEVEL: ssse3 |
| 152 | |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 153 | Linux Unit (x86_64, sse4_2): |
| 154 | extends: .common-linux-unit-optim |
| 155 | variables: |
| 156 | AOM_OPTIM_LEVEL: sse4_2 |
| 157 | |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 158 | # |
| 159 | # Sanitizer jobs |
| 160 | # The following jobs run the unit tests but |
| 161 | # with a built where the respective sanitizers |
| 162 | # are enabled. |
| 163 | # |
| 164 | # This is not using a matrix as the jobs |
| 165 | # depend on other jobs that were built by |
| 166 | # a matrix job before and a matrix can not |
| 167 | # depend on other matrix-jobs unfortunately. |
| 168 | # |
| 169 | |
| 170 | # Common sanitizer unit tests template |
| 171 | # This is inherited by all sanitizer test jobs |
| 172 | .sanitizer-common-nigtly: |
| 173 | stage: test |
| 174 | interruptible: true |
ePirat | 27f3773 | 2022-02-09 01:56:15 +0000 | [diff] [blame] | 175 | parallel: 24 |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 176 | variables: |
| 177 | LIBAOM_TEST_DATA_PATH: ${CI_PROJECT_DIR}/libaom-test-data |
| 178 | GTEST_TOTAL_SHARDS: ${CI_NODE_TOTAL} |
| 179 | GTEST_OUTPUT: "xml:report.xml" |
| 180 | SANITIZER_OPTIONS: "\ |
| 181 | :handle_segv=1\ |
| 182 | :handle_abort=1\ |
| 183 | :handle_sigfpe=1\ |
| 184 | :fast_unwind_on_fatal=1\ |
| 185 | :allocator_may_return_null=1" |
| 186 | before_script: |
Urvang Joshi | 40e8b2c | 2022-04-20 21:22:12 +0000 | [diff] [blame] | 187 | - export PATH="/usr/lib/llvm-12/bin:${PATH}" |
Marvin Scholz | 647272e | 2022-01-18 04:02:32 +0100 | [diff] [blame] | 188 | - export GTEST_SHARD_INDEX=$((CI_NODE_INDEX - 1)) |
| 189 | script: |
| 190 | - | |
| 191 | case $AOM_SANITIZER_TYPE in |
| 192 | address) |
| 193 | SANITIZER_OPTIONS="${SANITIZER_OPTIONS}:detect_stack_use_after_return=1" |
| 194 | SANITIZER_OPTIONS="${SANITIZER_OPTIONS}:max_uar_stack_size_log=17" |
| 195 | export ASAN_OPTIONS="${SANITIZER_OPTIONS}" |
| 196 | ;; |
| 197 | memory) |
| 198 | export MSAN_OPTIONS="${SANITIZER_OPTIONS}" |
| 199 | ;; |
| 200 | thread) |
| 201 | # The thread sanitizer uses a subset. |
| 202 | TSAN_OPTIONS="handle_sigfpe=1" |
| 203 | TSAN_OPTIONS="$TSAN_OPTIONS handle_segv=1" |
| 204 | TSAN_OPTIONS="$TSAN_OPTIONS handle_abort=1" |
| 205 | export TSAN_OPTIONS |
| 206 | ;; |
| 207 | undefined|integer) |
| 208 | SANITIZER_OPTIONS="${SANITIZER_OPTIONS}:print_stacktrace=1:suppressions=.gitlab/UBSan.supp" |
| 209 | export UBSAN_OPTIONS="${SANITIZER_OPTIONS}" |
| 210 | ;; |
| 211 | esac |
| 212 | - | |
| 213 | filter="*Large*" |
| 214 | # As of 17 May 2018 there are no large threading tests. |
| 215 | [ "${AOM_SANITIZER_TYPE}" = "thread" ] && filter="*Thread*Large*" || : |
| 216 | - ./aom_build/${AOM_SANITIZER_TYPE}/test_libaom --gtest_filter="${filter}" 2> >(tee -a sanitizer.log >&2) |
| 217 | - | |
| 218 | # Looking for sanitizer output in log... |
| 219 | grep -q "\(ERROR\|WARNING\): \(Address\|Thread\|Memory\|Leak\)Sanitizer:" sanitizer.log && { |
| 220 | echo "Found sanitizer errors or warnings, check the log:" |
| 221 | cat sanitizer.log |
| 222 | exit 1 |
| 223 | } |
| 224 | # Looking for UBSan output in log (differs from the common format) |
| 225 | grep -q ":[[:digit:]]\+:[[:digit:]]\+: runtime error:" sanitizer.log && { |
| 226 | echo "Found sanitizer errors or warnings, check the log:" |
| 227 | cat sanitizer.log |
| 228 | exit 1 |
| 229 | } |
| 230 | echo "No sanitizer errors found" |
| 231 | artifacts: |
| 232 | expose_as: 'Nightly sanitizer logs' |
| 233 | name: "sanitizer.log-$CI_JOB_ID" |
| 234 | when: on_failure |
| 235 | paths: |
| 236 | - sanitizer.log |
| 237 | |
| 238 | Linux Sanitizer (address) Test Nightly: |
| 239 | extends: .sanitizer-common-nigtly |
| 240 | variables: |
| 241 | AOM_SANITIZER_TYPE: address |
| 242 | needs: |
| 243 | - 'Test Data' |
| 244 | - 'Linux Sanitizers (x86_64-clang): [address]' |
| 245 | |
| 246 | Linux Sanitizer (undefined) Test Nightly: |
| 247 | extends: .sanitizer-common-nigtly |
| 248 | variables: |
| 249 | AOM_SANITIZER_TYPE: undefined |
| 250 | needs: |
| 251 | - 'Test Data' |
| 252 | - 'Linux Sanitizers (x86_64-clang): [undefined]' |
| 253 | |
| 254 | Linux Sanitizer (integer) Test Nightly: |
| 255 | extends: .sanitizer-common-nigtly |
| 256 | variables: |
| 257 | AOM_SANITIZER_TYPE: integer |
| 258 | needs: |
| 259 | - 'Test Data' |
| 260 | - 'Linux Sanitizers (x86_64-clang): [integer]' |
| 261 | |
| 262 | Linux Sanitizer (thread) Test Nightly: |
| 263 | extends: .sanitizer-common-nigtly |
| 264 | variables: |
| 265 | AOM_SANITIZER_TYPE: thread |
| 266 | needs: |
| 267 | - 'Test Data' |
| 268 | - 'Linux Sanitizers (x86_64-clang): [thread]' |
Urvang Joshi | fd4d39d | 2022-12-06 01:01:25 +0000 | [diff] [blame] | 269 | |
| 270 | |
| 271 | # Encode 2 GOPs in parallel and serial manner and ensure that results match. |
| 272 | .gop-enc-common: |
| 273 | stage: test |
| 274 | interruptible: true |
| 275 | variables: |
| 276 | AOMENC_LIMIT: 130 |
| 277 | AOMENC_SKIP: 0 |
| 278 | AOMENC_QP: 160 |
| 279 | AOMENC_INPUT: Vertical_Bayshore_270x480_2997.y4m |
| 280 | AOMENC_OUTPUT: serial_2gops |
| 281 | before_script: |
| 282 | - curl -s -S -f -O https://gitlab.com/AOMediaCodec/aom-testing/-/raw/master/test-files/${AOMENC_INPUT}.xz |
| 283 | - unxz ${AOMENC_INPUT}.xz |
| 284 | script: |
Urvang Joshi | c121e79 | 2022-12-06 22:06:33 +0000 | [diff] [blame] | 285 | - aom_nightly_build/aomenc |
Urvang Joshi | fd4d39d | 2022-12-06 01:01:25 +0000 | [diff] [blame] | 286 | --debug |
| 287 | --cpu-used=0 |
| 288 | --passes=1 |
| 289 | --lag-in-frames=19 |
| 290 | --auto-alt-ref=1 |
| 291 | --min-gf-interval=16 |
| 292 | --max-gf-interval=16 |
| 293 | --gf-min-pyr-height=4 |
| 294 | --gf-max-pyr-height=4 |
| 295 | --kf-min-dist=65 |
| 296 | --kf-max-dist=65 |
| 297 | --use-fixed-qp-offsets=1 |
| 298 | --deltaq-mode=0 |
| 299 | --enable-tpl-model=0 |
| 300 | --end-usage=q |
| 301 | --qp=${AOMENC_QP} |
| 302 | --enable-keyframe-filtering=0 |
| 303 | --obu |
| 304 | --limit=${AOMENC_LIMIT} |
| 305 | --skip=${AOMENC_SKIP} |
| 306 | -o "${AOMENC_OUTPUT}.obu" |
| 307 | "${AOMENC_INPUT}" 2>&1 | tee "${AOMENC_OUTPUT}.psnr.log" |
| 308 | - '[ -f "${AOMENC_OUTPUT}.obu" ] || exit 1' |
| 309 | artifacts: |
| 310 | when: always |
| 311 | paths: |
| 312 | - ${AOMENC_OUTPUT}.* |
| 313 | needs: |
| 314 | - 'Linux Nightly Build' |
| 315 | |
| 316 | |
| 317 | Serial Encode (2 GOPs): |
| 318 | extends: .gop-enc-common |
| 319 | |
| 320 | |
| 321 | Parallel Encode (1st GOP): |
| 322 | extends: .gop-enc-common |
| 323 | variables: |
| 324 | AOMENC_LIMIT: 65 |
| 325 | AOMENC_SKIP: 0 |
| 326 | AOMENC_OUTPUT: parallel_gop1 |
| 327 | |
| 328 | |
| 329 | Parallel Encode (2nd GOP): |
| 330 | extends: .gop-enc-common |
| 331 | variables: |
| 332 | AOMENC_LIMIT: 130 |
| 333 | AOMENC_SKIP: 65 |
| 334 | AOMENC_OUTPUT: parallel_gop2 |
| 335 | |
| 336 | |
| 337 | Serial Parallel compare: |
| 338 | stage: report |
| 339 | interruptible: true |
| 340 | script: |
| 341 | - cat parallel_gop1.obu parallel_gop2.obu > parallel_2gops.obu |
| 342 | - diff serial_2gops.obu parallel_2gops.obu |
| 343 | needs: |
| 344 | - 'Serial Encode (2 GOPs)' |
| 345 | - 'Parallel Encode (1st GOP)' |
| 346 | - 'Parallel Encode (2nd GOP)' |