1# SPDX-License-Identifier: GPL-2.0+ 2 3# Grab our configured image. The source for this is found at: 4# https://source.denx.de/u-boot/gitlab-ci-runner 5image: trini/u-boot-gitlab-ci-runner:focal-20220113-03Feb2022 6 7# We run some tests in different order, to catch some failures quicker. 8stages: 9 - testsuites 10 - test.py 11 - world build 12 13.buildman_and_testpy_template: &buildman_and_testpy_dfn 14 stage: test.py 15 before_script: 16 # Clone uboot-test-hooks 17 - git clone --depth=1 https://source.denx.de/u-boot/u-boot-test-hooks /tmp/uboot-test-hooks 18 - ln -s travis-ci /tmp/uboot-test-hooks/bin/`hostname` 19 - ln -s travis-ci /tmp/uboot-test-hooks/py/`hostname` 20 - grub-mkimage --prefix="" -o ~/grub_x86.efi -O i386-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd 21 - grub-mkimage --prefix="" -o ~/grub_x64.efi -O x86_64-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd 22 - if [[ "${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then 23 wget -O - https://github.com/riscv/opensbi/releases/download/v0.9/opensbi-0.9-rv-bin.tar.xz | tar -C /tmp -xJ; 24 export OPENSBI=/tmp/opensbi-0.9-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin; 25 fi 26 - if [[ "${TEST_PY_BD}" == "qemu-riscv64_spl" ]] || [[ "${TEST_PY_BD}" == "sifive_unleashed" ]]; then 27 wget -O - https://github.com/riscv/opensbi/releases/download/v0.9/opensbi-0.9-rv-bin.tar.xz | tar -C /tmp -xJ; 28 export OPENSBI=/tmp/opensbi-0.9-rv-bin/share/opensbi/lp64/generic/firmware/fw_dynamic.bin; 29 fi 30 31 after_script: 32 - rm -rf /tmp/uboot-test-hooks /tmp/venv 33 script: 34 # If we've been asked to use clang only do one configuration. 35 - export UBOOT_TRAVIS_BUILD_DIR=/tmp/${TEST_PY_BD} 36 - tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w -E -W -e 37 --board ${TEST_PY_BD} ${OVERRIDE} 38 - cp ~/grub_x86.efi $UBOOT_TRAVIS_BUILD_DIR/ 39 - cp ~/grub_x64.efi $UBOOT_TRAVIS_BUILD_DIR/ 40 - cp /opt/grub/grubriscv64.efi $UBOOT_TRAVIS_BUILD_DIR/grub_riscv64.efi 41 - cp /opt/grub/grubaa64.efi $UBOOT_TRAVIS_BUILD_DIR/grub_arm64.efi 42 - cp /opt/grub/grubarm.efi $UBOOT_TRAVIS_BUILD_DIR/grub_arm.efi 43 # create sdcard / spi-nor images for sifive unleashed using genimage 44 - if [[ "${TEST_PY_BD}" == "sifive_unleashed" ]]; then 45 mkdir -p root; 46 cp ${UBOOT_TRAVIS_BUILD_DIR}/spl/u-boot-spl.bin .; 47 cp ${UBOOT_TRAVIS_BUILD_DIR}/u-boot.itb .; 48 rm -rf tmp; 49 genimage --inputpath . --config board/sifive/unleashed/genimage_sdcard.cfg; 50 cp images/sdcard.img ${UBOOT_TRAVIS_BUILD_DIR}/; 51 rm -rf tmp; 52 genimage --inputpath . --config board/sifive/unleashed/genimage_spi-nor.cfg; 53 cp images/spi-nor.img ${UBOOT_TRAVIS_BUILD_DIR}/; 54 fi 55 - if [[ "${TEST_PY_BD}" == "coreboot" ]]; then 56 wget -O - 57 "https://drive.google.com/uc?id=1x6nrtWIyIRPLS2cQBwYTnT2TbOI8UjmM&export=download" | 58 xz -dc >${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom; 59 wget -O - 60 "https://drive.google.com/uc?id=149Cz-5SZXHNKpi9xg6R_5XITWohu348y&export=download" > 61 cbfstool; 62 chmod a+x cbfstool; 63 ./cbfstool ${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom add-flat-binary -f ${UBOOT_TRAVIS_BUILD_DIR}/u-boot.bin -n fallback/payload -c LZMA -l 0x1110000 -e 0x1110000; 64 fi 65 - virtualenv -p /usr/bin/python3 /tmp/venv 66 - . /tmp/venv/bin/activate 67 - pip install -r test/py/requirements.txt 68 # "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not 69 - export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH}; 70 export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci; 71 ./test/py/test.py -ra --bd ${TEST_PY_BD} ${TEST_PY_ID} 72 ${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"} 73 --build-dir "$UBOOT_TRAVIS_BUILD_DIR" 74 # It seems that the files in /tmp go away, so copy out what we need 75 - if [[ "${TEST_PY_BD}" == "coreboot" ]]; then 76 cp -v /tmp/coreboot/*.{html,css} .; 77 fi 78 79build all 32bit ARM platforms: 80 stage: world build 81 script: 82 - ret=0; 83 ./tools/buildman/buildman -o /tmp -P -E -W arm -x aarch64 || ret=$?; 84 if [[ $ret -ne 0 ]]; then 85 ./tools/buildman/buildman -o /tmp -seP; 86 exit $ret; 87 fi; 88 89build all 64bit ARM platforms: 90 stage: world build 91 script: 92 - virtualenv -p /usr/bin/python3 /tmp/venv 93 - . /tmp/venv/bin/activate 94 - pip install pyelftools 95 - ret=0; 96 ./tools/buildman/buildman -o /tmp -P -E -W aarch64 || ret=$?; 97 if [[ $ret -ne 0 ]]; then 98 ./tools/buildman/buildman -o /tmp -seP; 99 exit $ret; 100 fi; 101 102build all PowerPC platforms: 103 stage: world build 104 script: 105 - ret=0; 106 ./tools/buildman/buildman -o /tmp -P -E -W powerpc || ret=$?; 107 if [[ $ret -ne 0 ]]; then 108 ./tools/buildman/buildman -o /tmp -seP; 109 exit $ret; 110 fi; 111 112build all other platforms: 113 stage: world build 114 script: 115 - ret=0; 116 ./tools/buildman/buildman -o /tmp -P -E -W -x arm,powerpc || ret=$?; 117 if [[ $ret -ne 0 ]]; then 118 ./tools/buildman/buildman -o /tmp -seP; 119 exit $ret; 120 fi; 121 122check for migrated symbols in board header: 123 stage: testsuites 124 script: 125 - KSYMLST=`mktemp`; 126 KUSEDLST=`mktemp`; 127 cat `find . -name "Kconfig*"` | 128 sed -n -e 's/^\s*config *\([A-Za-z0-9_]*\).*$/CONFIG_\1/p' 129 -e 's/^\s*menuconfig *\([A-Za-z0-9_]*\).*$/CONFIG_\1/p' 130 | sort -u > $KSYMLST; 131 for CFG in `find include/configs -name "*.h"`; do 132 grep '#define[[:blank:]]CONFIG_' $CFG | 133 sed -n 's/#define.\(CONFIG_[A-Za-z0-9_]*\).*/\1/p' | 134 sort -u > ${KUSEDLST} || true; 135 NUM=`comm -12 --total --output-delimiter=, ${KSYMLST} ${KUSEDLST} | 136 cut -d , -f 3`; 137 if [[ $NUM -ne 0 ]]; then 138 echo "Unmigrated symbols found in $CFG"; 139 exit 1; 140 fi; 141 done 142 143# QA jobs for code analytics 144# static code analysis with cppcheck (we can add --enable=all later) 145cppcheck: 146 stage: testsuites 147 script: 148 - cppcheck -j$(nproc) --force --quiet --inline-suppr . 149 150# search for TODO within source tree 151grep TODO/FIXME/HACK: 152 stage: testsuites 153 script: 154 - grep -r TODO . 155 - grep -r FIXME . 156 # search for HACK within source tree and ignore HACKKIT board 157 - grep -r HACK . | grep -v HACKKIT 158 159# build HTML documentation 160htmldocs: 161 stage: testsuites 162 script: 163 - virtualenv -p /usr/bin/python3 /tmp/venvhtml 164 - . /tmp/venvhtml/bin/activate 165 - pip install -r doc/sphinx/requirements.txt 166 - make htmldocs 167 168# some statistics about the code base 169sloccount: 170 stage: testsuites 171 script: 172 - sloccount . 173 174# ensure all configs have MAINTAINERS entries 175Check for configs without MAINTAINERS entry: 176 stage: testsuites 177 script: 178 - if [ `./tools/genboardscfg.py -f 2>&1 | wc -l` -ne 0 ]; then exit 1; fi 179 180# Ensure host tools build 181Build tools-only: 182 stage: testsuites 183 script: 184 - make tools-only_config tools-only -j$(nproc) 185 186# Ensure env tools build 187Build envtools: 188 stage: testsuites 189 script: 190 - make tools-only_config envtools -j$(nproc) 191 192Run binman, buildman, dtoc, Kconfig and patman testsuites: 193 stage: testsuites 194 script: 195 - git config --global user.name "GitLab CI Runner"; 196 git config --global user.email trini@konsulko.com; 197 export USER=gitlab; 198 virtualenv -p /usr/bin/python3 /tmp/venv; 199 . /tmp/venv/bin/activate; 200 pip install -r test/py/requirements.txt; 201 export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl; 202 export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt"; 203 export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}"; 204 ./tools/buildman/buildman -T0 -o ${UBOOT_TRAVIS_BUILD_DIR} -w 205 --board sandbox_spl; 206 ./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools test; 207 ./tools/buildman/buildman -t; 208 ./tools/dtoc/dtoc -t; 209 ./tools/patman/patman test; 210 make testconfig 211 212Run tests for Nokia RX-51 (aka N900): 213 stage: testsuites 214 script: 215 - export PATH=/opt/gcc-11.1.0-nolibc/arm-linux-gnueabi/bin:$PATH; 216 test/nokia_rx51_test.sh 217 218# Test sandbox with test.py 219sandbox test.py: 220 variables: 221 TEST_PY_BD: "sandbox" 222 <<: *buildman_and_testpy_dfn 223 224sandbox with clang test.py: 225 variables: 226 TEST_PY_BD: "sandbox" 227 OVERRIDE: "-O clang-13" 228 <<: *buildman_and_testpy_dfn 229 230sandbox_spl test.py: 231 variables: 232 TEST_PY_BD: "sandbox_spl" 233 TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff or test_spl" 234 <<: *buildman_and_testpy_dfn 235 236sandbox_noinst_test.py: 237 variables: 238 TEST_PY_BD: "sandbox_noinst" 239 TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff or test_spl" 240 <<: *buildman_and_testpy_dfn 241 242evb-ast2500 test.py: 243 variables: 244 TEST_PY_BD: "evb-ast2500" 245 TEST_PY_ID: "--id qemu" 246 <<: *buildman_and_testpy_dfn 247 248sandbox_flattree test.py: 249 variables: 250 TEST_PY_BD: "sandbox_flattree" 251 <<: *buildman_and_testpy_dfn 252 253vexpress_ca9x4 test.py: 254 variables: 255 TEST_PY_BD: "vexpress_ca9x4" 256 TEST_PY_ID: "--id qemu" 257 <<: *buildman_and_testpy_dfn 258 259integratorcp_cm926ejs test.py: 260 variables: 261 TEST_PY_BD: "integratorcp_cm926ejs" 262 TEST_PY_TEST_SPEC: "not sleep" 263 TEST_PY_ID: "--id qemu" 264 <<: *buildman_and_testpy_dfn 265 266qemu_arm test.py: 267 variables: 268 TEST_PY_BD: "qemu_arm" 269 TEST_PY_TEST_SPEC: "not sleep" 270 <<: *buildman_and_testpy_dfn 271 272qemu_arm64 test.py: 273 variables: 274 TEST_PY_BD: "qemu_arm64" 275 TEST_PY_TEST_SPEC: "not sleep" 276 <<: *buildman_and_testpy_dfn 277 278qemu_malta test.py: 279 variables: 280 TEST_PY_BD: "malta" 281 TEST_PY_TEST_SPEC: "not sleep and not efi" 282 TEST_PY_ID: "--id qemu" 283 <<: *buildman_and_testpy_dfn 284 285qemu_maltael test.py: 286 variables: 287 TEST_PY_BD: "maltael" 288 TEST_PY_TEST_SPEC: "not sleep and not efi" 289 TEST_PY_ID: "--id qemu" 290 <<: *buildman_and_testpy_dfn 291 292qemu_malta64 test.py: 293 variables: 294 TEST_PY_BD: "malta64" 295 TEST_PY_TEST_SPEC: "not sleep and not efi" 296 TEST_PY_ID: "--id qemu" 297 <<: *buildman_and_testpy_dfn 298 299qemu_malta64el test.py: 300 variables: 301 TEST_PY_BD: "malta64el" 302 TEST_PY_TEST_SPEC: "not sleep and not efi" 303 TEST_PY_ID: "--id qemu" 304 <<: *buildman_and_testpy_dfn 305 306qemu-ppce500 test.py: 307 variables: 308 TEST_PY_BD: "qemu-ppce500" 309 TEST_PY_TEST_SPEC: "not sleep" 310 <<: *buildman_and_testpy_dfn 311 312qemu-riscv32 test.py: 313 variables: 314 TEST_PY_BD: "qemu-riscv32" 315 TEST_PY_TEST_SPEC: "not sleep" 316 <<: *buildman_and_testpy_dfn 317 318qemu-riscv64 test.py: 319 variables: 320 TEST_PY_BD: "qemu-riscv64" 321 TEST_PY_TEST_SPEC: "not sleep" 322 <<: *buildman_and_testpy_dfn 323 324qemu-riscv32_spl test.py: 325 variables: 326 TEST_PY_BD: "qemu-riscv32_spl" 327 TEST_PY_TEST_SPEC: "not sleep" 328 <<: *buildman_and_testpy_dfn 329 330qemu-riscv64_spl test.py: 331 variables: 332 TEST_PY_BD: "qemu-riscv64_spl" 333 TEST_PY_TEST_SPEC: "not sleep" 334 <<: *buildman_and_testpy_dfn 335 336qemu-x86 test.py: 337 variables: 338 TEST_PY_BD: "qemu-x86" 339 TEST_PY_TEST_SPEC: "not sleep" 340 <<: *buildman_and_testpy_dfn 341 342qemu-x86_64 test.py: 343 variables: 344 TEST_PY_BD: "qemu-x86_64" 345 TEST_PY_TEST_SPEC: "not sleep" 346 <<: *buildman_and_testpy_dfn 347 348r2dplus_i82557c test.py: 349 variables: 350 TEST_PY_BD: "r2dplus" 351 TEST_PY_ID: "--id i82557c_qemu" 352 <<: *buildman_and_testpy_dfn 353 354r2dplus_pcnet test.py: 355 variables: 356 TEST_PY_BD: "r2dplus" 357 TEST_PY_ID: "--id pcnet_qemu" 358 <<: *buildman_and_testpy_dfn 359 360r2dplus_rtl8139 test.py: 361 variables: 362 TEST_PY_BD: "r2dplus" 363 TEST_PY_ID: "--id rtl8139_qemu" 364 <<: *buildman_and_testpy_dfn 365 366r2dplus_tulip test.py: 367 variables: 368 TEST_PY_BD: "r2dplus" 369 TEST_PY_ID: "--id tulip_qemu" 370 <<: *buildman_and_testpy_dfn 371 372sifive_unleashed_sdcard test.py: 373 variables: 374 TEST_PY_BD: "sifive_unleashed" 375 TEST_PY_ID: "--id sdcard_qemu" 376 <<: *buildman_and_testpy_dfn 377 378sifive_unleashed_spi-nor test.py: 379 variables: 380 TEST_PY_BD: "sifive_unleashed" 381 TEST_PY_ID: "--id spi-nor_qemu" 382 <<: *buildman_and_testpy_dfn 383 384xilinx_zynq_virt test.py: 385 variables: 386 TEST_PY_BD: "xilinx_zynq_virt" 387 TEST_PY_TEST_SPEC: "not sleep" 388 TEST_PY_ID: "--id qemu" 389 <<: *buildman_and_testpy_dfn 390 391xilinx_versal_virt test.py: 392 variables: 393 TEST_PY_BD: "xilinx_versal_virt" 394 TEST_PY_TEST_SPEC: "not sleep" 395 TEST_PY_ID: "--id qemu" 396 <<: *buildman_and_testpy_dfn 397 398xtfpga test.py: 399 variables: 400 TEST_PY_BD: "xtfpga" 401 TEST_PY_TEST_SPEC: "not sleep" 402 TEST_PY_ID: "--id qemu" 403 <<: *buildman_and_testpy_dfn 404 405coreboot test.py: 406 variables: 407 TEST_PY_BD: "coreboot" 408 TEST_PY_TEST_SPEC: "not sleep" 409 TEST_PY_ID: "--id qemu" 410 artifacts: 411 paths: 412 - "*.html" 413 - "*.css" 414 expire_in: 1 week 415 <<: *buildman_and_testpy_dfn 416