blob: d5adad8dc207d85d8ef9b0a5930f97d2d37d3cda [file] [log] [blame]
Marvin Scholz647272e2022-01-18 04:02:32 +01001#
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
10default:
Urvang Joshi5fcb31c2022-12-22 13:49:32 -080011 timeout: 11 hours
Marvin Scholz647272e2022-01-18 04:02:32 +010012
13# Simple x86_64 Linux build
14Linux 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 Joshifd4d39d2022-12-06 01:01:25 +000026 - cmake --build "aom_nightly_build" --target aomenc
Marvin Scholz647272e2022-01-18 04:02:32 +010027 - cmake --build "aom_nightly_build" --target test_libaom
28 needs: []
29 artifacts:
30 expire_in: 1 day
31 paths:
Urvang Joshifd4d39d2022-12-06 01:01:25 +000032 - 'aom_nightly_build/aomenc'
Marvin Scholz647272e2022-01-18 04:02:32 +010033 - 'aom_nightly_build/test_libaom'
34 - 'aom_nightly_build/**/*.gcno'
35 - 'aom_nightly_build/**/*.[hc]'
36
37# Full unit tests run (with coverage report)
38Linux All Unit Test:
39 stage: test
40 interruptible: true
ePirat27f37732022-02-09 01:56:15 +000041 parallel: 24
Marvin Scholz647272e2022-01-18 04:02:32 +010042 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.
68Coverage 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 ../ .
Vibhoothi19166cb2022-05-24 13:47:39 +000085 coverage: '/lines:\s(\d+.\d+\%)/'
Marvin Scholz647272e2022-01-18 04:02:32 +010086 artifacts:
87 reports:
Vibhoothi7ddf68e2022-05-12 00:07:08 +000088 coverage_report:
89 coverage_format: cobertura
Marvin Scholz839f1412022-05-19 21:31:14 +020090 path: coverage.xml
91 paths:
92 - coverage-html
Vibhoothi7ddf68e2022-05-12 00:07:08 +000093
Marvin Scholz647272e2022-01-18 04:02:32 +010094
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 Joshibfa91fd2022-12-12 19:11:33 +0000111 parallel: 10
Marvin Scholz647272e2022-01-18 04:02:32 +0100112 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 Joshibfa91fd2022-12-12 19:11:33 +0000130 test_filter="-C*:MMX*:SSE*:SSSE*:AVX*:*Large*"
Marvin Scholz647272e2022-01-18 04:02:32 +0100131
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
143Linux Unit (x86_64, sse2):
144 extends: .common-linux-unit-optim
145 variables:
146 AOM_OPTIM_LEVEL: sse2
147
Marvin Scholz647272e2022-01-18 04:02:32 +0100148Linux Unit (x86_64, ssse3):
149 extends: .common-linux-unit-optim
150 variables:
151 AOM_OPTIM_LEVEL: ssse3
152
Marvin Scholz647272e2022-01-18 04:02:32 +0100153Linux Unit (x86_64, sse4_2):
154 extends: .common-linux-unit-optim
155 variables:
156 AOM_OPTIM_LEVEL: sse4_2
157
Marvin Scholz647272e2022-01-18 04:02:32 +0100158#
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
ePirat27f37732022-02-09 01:56:15 +0000175 parallel: 24
Marvin Scholz647272e2022-01-18 04:02:32 +0100176 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 Joshi40e8b2c2022-04-20 21:22:12 +0000187 - export PATH="/usr/lib/llvm-12/bin:${PATH}"
Marvin Scholz647272e2022-01-18 04:02:32 +0100188 - 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
238Linux 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
246Linux 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
254Linux 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
262Linux 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 Joshifd4d39d2022-12-06 01:01:25 +0000269
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 Joshic121e792022-12-06 22:06:33 +0000285 - aom_nightly_build/aomenc
Urvang Joshifd4d39d2022-12-06 01:01:25 +0000286 --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
317Serial Encode (2 GOPs):
318 extends: .gop-enc-common
319
320
321Parallel 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
329Parallel 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
337Serial 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)'