# SPDX-License-Identifier: GPL-2.0+ include: - local: '.gitlab-ci-release.yml' workflow: rules: - if: $CI_PIPELINE_SOURCE == "push" when: always - if: $CI_PIPELINE_SOURCE == "merge_request_event" when: always - when: never variables: DEFAULT_TAG: "" MIRROR_DOCKER: docker.io SUITES: "1" PYTEST: "1" TEST_SPEC: "" WORLD: "1" SJG_LAB: "" PLATFORM: linux/amd64,linux/arm64 GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_RUNNER_ID/$CI_CONCURRENT_ID/u-boot default: tags: - ${DEFAULT_TAG} # Grab our configured image. The source for this is found # in the u-boot tree at tools/docker/Dockerfile image: ${MIRROR_DOCKER}/sjg20/u-boot-gitlab-ci-runner:jammy-20250404-24Oct2025p1 services: - name: container-$(CI_JOB_ID) command: ["--rm"] # We run some tests in different order, to catch some failures quicker. stages: - test_suites - test.py - sjg-lab - world_build - version_bump - release .buildman_and_testpy_template: &buildman_and_testpy_dfn stage: test.py retry: 2 # QEMU may be too slow, etc. # Note: These tests require device-mapper access for LUKS encryption tests. # The GitLab runner must be configured with: # - privileged = true in /etc/gitlab-runner/config.toml # OR passwordless sudo for: modprobe, cryptsetup, dd needs: [ "Run binman, buildman, dtoc, hwids_to_dtsi, Kconfig, patman and pickman suites" ] rules: # Skip if MR description contains [skip-pytest] - if: $CI_MERGE_REQUEST_DESCRIPTION =~ /\[skip-pytest\]/ when: never - if: $PYTEST == "1" when: always - if: $PYTEST == $CI_JOB_NAME when: always - if: $PYTEST == $TEST_PY_BD when: always - when: never before_script: - git config --global --add safe.directory "${CI_PROJECT_DIR}" # qemu_arm64_lwip_defconfig is the same as qemu_arm64 but with NET_LWIP enabled. # The test config and the boardenv file from qemu_arm64 can be re-used so create symlinks - ln -s conf.qemu_arm64_na test/hooks/bin/travis-ci/conf.qemu_arm64_lwip_na - ln -s u_boot_boardenv_qemu_arm64_na.py test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py - ln -s travis-ci test/hooks/bin/`hostname` - ln -s travis-ci test/hooks/py/`hostname` - if [[ "${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then wget -O - https://github.com/riscv-software-src/opensbi/releases/download/v1.3.1/opensbi-1.3.1-rv-bin.tar.xz | tar -C /tmp -xJ; export OPENSBI=/tmp/opensbi-1.3.1-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin; fi - if [[ "${TEST_PY_BD}" == "qemu-riscv64_spl" ]] || [[ "${TEST_PY_BD}" == "sifive_unleashed" ]]; then wget -O - https://github.com/riscv-software-src/opensbi/releases/download/v1.3.1/opensbi-1.3.1-rv-bin.tar.xz | tar -C /tmp -xJ; export OPENSBI=/tmp/opensbi-1.3.1-rv-bin/share/opensbi/lp64/generic/firmware/fw_dynamic.bin; fi - if [[ "${TEST_PY_BD}" == "qemu-arm-sbsa" ]]; then wget -O /tmp/bl1.bin https://artifacts.codelinaro.org/artifactory/linaro-419-sbsa-ref/latest/tf-a/bl1.bin; wget -O /tmp/fip.bin https://artifacts.codelinaro.org/artifactory/linaro-419-sbsa-ref/latest/tf-a/fip.bin; export BINMAN_INDIRS=/tmp; fi # Prepare python environment - python3 -m venv /tmp/venv; . /tmp/venv/bin/activate; pip install -r test/py/requirements.txt -r tools/binman/requirements.txt -r tools/buildman/requirements.txt -r tools/u_boot_pylib/requirements.txt after_script: - cp -v /tmp/${TEST_PY_BD}/*.{html,css,xml} . - rm -rf /tmp/venv script: # If we've been asked to use clang only do one configuration. - export UBOOT_TRAVIS_BUILD_DIR=/tmp/${TEST_PY_BD} - echo BUILD_ENV ${BUILD_ENV} - if [ -n "${BUILD_ENV}" ]; then export ${BUILD_ENV}; fi - tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w -E -W -e --board ${TEST_PY_BD} ${OVERRIDE} - cp /opt/grub/grub_x86.efi $UBOOT_TRAVIS_BUILD_DIR/ - cp /opt/grub/grub_x64.efi $UBOOT_TRAVIS_BUILD_DIR/ - cp /opt/grub/grubriscv64.efi $UBOOT_TRAVIS_BUILD_DIR/grub_riscv64.efi - cp /opt/grub/grubaa64.efi $UBOOT_TRAVIS_BUILD_DIR/grub_arm64.efi - cp /opt/grub/grubarm.efi $UBOOT_TRAVIS_BUILD_DIR/grub_arm.efi # create sdcard / spi-nor images for sifive unleashed using genimage - if [[ "${TEST_PY_BD}" == "sifive_unleashed" ]]; then mkdir -p root; cp ${UBOOT_TRAVIS_BUILD_DIR}/spl/u-boot-spl.bin .; cp ${UBOOT_TRAVIS_BUILD_DIR}/u-boot.itb .; rm -rf tmp; genimage --inputpath . --config board/sifive/unleashed/genimage_sdcard.cfg; cp images/sdcard.img ${UBOOT_TRAVIS_BUILD_DIR}/; rm -rf tmp; genimage --inputpath . --config board/sifive/unleashed/genimage_spi-nor.cfg; cp images/spi-nor.img ${UBOOT_TRAVIS_BUILD_DIR}/; fi - if [[ "${TEST_PY_BD}" == "coreboot" ]]; then cp /opt/coreboot/coreboot.rom ${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom; /opt/coreboot/cbfstool ${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom remove -n fallback/payload; /opt/coreboot/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; fi # If we have TF-A binaries, we need to use them. - if [[ -d /opt/tf-a/"${TEST_PY_BD}" ]]; then cp /opt/tf-a/"${TEST_PY_BD}"/fip.bin /opt/tf-a/"${TEST_PY_BD}"/bl1.bin /tmp/; export fip=/tmp/fip.bin; export bl1=/tmp/bl1.bin; export PATH=/opt/Base_RevC_AEMvA_pkg/models/Linux64_GCC-9.3:${PATH}; fi - if [[ -n "${TEST_SPEC}" ]]; then SPEC="${TEST_SPEC}"; echo 'Using provided test spec ${TEST_SPEC}"'; else SPEC="${TEST_PY_TEST_SPEC}"; fi # "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not - export PATH=/opt/qemu/bin:test/hooks/bin:${PATH}; export PYTHONPATH=test/hooks/py/travis-ci; ./test/py/test.py -ra --bd ${TEST_PY_BD} ${TEST_PY_ID} ${TEST_PY_EXTRA} ${SPEC:+"-k ${SPEC}"} --build-dir "$UBOOT_TRAVIS_BUILD_DIR" --junitxml=/tmp/${TEST_PY_BD}/results.xml artifacts: when: always paths: - "*.html" - "*.css" - results.xml reports: junit: results.xml expire_in: 1 week .world_build: stage: world_build dependencies: [] rules: # Skip if MR description contains [skip-world] - if: $CI_MERGE_REQUEST_DESCRIPTION =~ /\[skip-world\]/ when: never - if: $WORLD == "1" when: always - when: never build all 32bit ARM platforms: extends: .world_build dependencies: [] tags: - single script: # Prepare python environment - python3 -m venv /tmp/venv; . /tmp/venv/bin/activate; pip install -r tools/binman/requirements.txt -r tools/buildman/requirements.txt - ret=0; git config --global --add safe.directory "${CI_PROJECT_DIR}"; ./tools/buildman/buildman -o /tmp -PEWM arm -x aarch64 || ret=$?; if [[ $ret -ne 0 ]]; then ./tools/buildman/buildman -o /tmp -seP; exit $ret; fi; build all 64bit ARM platforms: extends: .world_build dependencies: [] tags: - single script: # Prepare python environment - python3 -m venv /tmp/venv; . /tmp/venv/bin/activate; pip install -r tools/binman/requirements.txt -r tools/buildman/requirements.txt - ret=0; git config --global --add safe.directory "${CI_PROJECT_DIR}"; pip install -r tools/buildman/requirements.txt; ./tools/buildman/buildman -o /tmp -PEWM aarch64 || ret=$?; if [[ $ret -ne 0 ]]; then ./tools/buildman/buildman -o /tmp -seP; exit $ret; fi; build all PowerPC platforms: extends: .world_build dependencies: [] tags: - single script: # Prepare python environment - python3 -m venv /tmp/venv; . /tmp/venv/bin/activate; pip install -r tools/binman/requirements.txt -r tools/buildman/requirements.txt - ret=0; git config --global --add safe.directory "${CI_PROJECT_DIR}"; ./tools/buildman/buildman -o /tmp -P -E -W powerpc || ret=$?; if [[ $ret -ne 0 ]]; then ./tools/buildman/buildman -o /tmp -seP; exit $ret; fi; # We exclude xtensa here due to not being able to build on aarch64 # hosts but covering all platforms in the pytest section. build all other platforms: extends: .world_build dependencies: [] tags: - single script: # Prepare python environment - python3 -m venv /tmp/venv; . /tmp/venv/bin/activate; pip install -r tools/binman/requirements.txt -r tools/buildman/requirements.txt - ret=0; git config --global --add safe.directory "${CI_PROJECT_DIR}"; ./tools/buildman/buildman -o /tmp -PEWM -x arm,powerpc,xtensa || ret=$?; if [[ $ret -ne 0 ]]; then ./tools/buildman/buildman -o /tmp -seP; exit $ret; fi; .test_suites: stage: test_suites rules: # Skip if MR description contains [skip-suites] - if: $CI_MERGE_REQUEST_DESCRIPTION =~ /\[skip-suites\]/ when: never - if: $SUITES == "1" when: always - when: never check for new CONFIG symbols outside Kconfig: extends: .test_suites script: - git config --global --add safe.directory "${CI_PROJECT_DIR}" # If grep succeeds and finds a match the test fails as we should # have no matches. - git grep -E '^#[[:blank:]]*(define|undef)[[:blank:]]*CONFIG_' :^doc/ :^arch/arm/dts/ :^scripts/kconfig/lkc.h :^include/linux/kconfig.h :^tools/ :^dts/upstream/ :^lib/mbedtls/external :^lib/mbedtls/mbedtls_def_config.h && exit 1 || exit 0 # build documentation docs: extends: .test_suites script: - python3 -m venv /tmp/venvhtml - . /tmp/venvhtml/bin/activate - pip install -r doc/sphinx/requirements.txt -r test/py/requirements.txt - make htmldocs KDOC_WERROR=1 - make infodocs # ensure all configs have MAINTAINERS entries Check for configs without MAINTAINERS entry: extends: .test_suites script: - ./tools/buildman/buildman --maintainer-check # Ensure host tools build Build tools-only and envtools: extends: .test_suites tags: - single script: - make tools-only_config tools-only -j$(nproc); make mrproper; make tools-only_config envtools -j$(nproc) Run binman, buildman, dtoc, hwids_to_dtsi, Kconfig, patman and pickman suites: extends: .test_suites script: - git config --global user.name "GitLab CI Runner"; git config --global user.email trini@konsulko.com; git config --global --add safe.directory "${CI_PROJECT_DIR}"; export USER=gitlab; python3 -m venv /tmp/venv; . /tmp/venv/bin/activate; pip install -r test/py/requirements.txt -r tools/binman/requirements.txt -r tools/buildman/requirements.txt -r tools/patman/requirements.txt -r tools/pickman/requirements.txt -r tools/u_boot_pylib/requirements.txt; export UBOOT_TRAVIS_BUILD_DIR=/tmp/tools-only; export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt"; export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}"; set +e; ./tools/buildman/buildman -T0 -o ${UBOOT_TRAVIS_BUILD_DIR} -w --board tools-only; set -e; export TOOLPATH="--toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools --toolpath /opt/coreboot"; ./tools/binman/binman ${TOOLPATH} tool -f missing; ./tools/binman/binman ${TOOLPATH} test; ./tools/binman/binman ${TOOLPATH} test -T; ./tools/buildman/buildman -t; ./tools/dtoc/dtoc -t; ./tools/patman/patman test; ./tools/pickman/pickman test; ./tools/pickman/pickman test -T; ./tools/buildman/buildman --coverage; python3 ./test/scripts/test_hwids_to_dtsi.py; python3 -m pytest ./test/scripts/test_release_version.py; make testconfig # Check for any pylint regressions Run pylint: extends: .test_suites tags: - single script: - git config --global --add safe.directory "${CI_PROJECT_DIR}" - python3 -m venv /tmp/venv - . /tmp/venv/bin/activate - pip install -r test/py/requirements.txt -r tools/binman/requirements.txt -r tools/buildman/requirements.txt -r tools/patman/requirements.txt -r tools/u_boot_pylib/requirements.txt asteval pylint==3.3.4 pyopenssl - export PATH=${PATH}:~/.local/bin - echo "[MASTER]" >> .pylintrc - echo "load-plugins=pylint.extensions.docparams" >> .pylintrc - export UBOOT_TRAVIS_BUILD_DIR=/tmp/tools-only - set +e - ./tools/buildman/buildman -T0 -o ${UBOOT_TRAVIS_BUILD_DIR} -w --board tools-only - set -e - pylint --version - export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt" - make pylint_err # Check for pre-schema driver model tags Check for pre-schema tags: extends: .test_suites script: - git config --global --add safe.directory "${CI_PROJECT_DIR}"; # If grep succeeds and finds a match the test fails as we should # have no matches. - git grep u-boot,dm- -- '*.dts*' && exit 1 || exit 0 # Check we can package the Python tools Check packing of Python tools: extends: .test_suites script: - make pip Examples: extends: .test_suites script: - git config --global user.name "GitLab CI Runner"; git config --global user.email trini@konsulko.com; git config --global --add safe.directory "${CI_PROJECT_DIR}"; export USER=gitlab; export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox; set +e; ./tools/buildman/buildman -T0 -o ${UBOOT_TRAVIS_BUILD_DIR} -w --board sandbox; set -e; - echo "Building C examples"; cd examples/ulib; make UBOOT_BUILD=${UBOOT_TRAVIS_BUILD_DIR} srctree=../.. - echo "Running C static"; ./demo_static - echo "Running C dynamic"; LD_LIBRARY_PATH=${UBOOT_TRAVIS_BUILD_DIR} ./demo - echo "Building Rust examples"; cd ../rust; make UBOOT_BUILD=${UBOOT_TRAVIS_BUILD_DIR} srctree=../.. - echo "Running Rust static"; ./demo_static - echo "Running Rust dynamic"; LD_LIBRARY_PATH=${UBOOT_TRAVIS_BUILD_DIR} ./demo # Template for running the 'make check' tools .python_check_template: stage: test.py rules: # Skip if MR description contains [skip-pytest] - if: $CI_MERGE_REQUEST_DESCRIPTION =~ /\[skip-pytest\]/ when: never - if: $PYTEST == "1" when: always - if: $PYTEST == $CI_JOB_NAME when: always - if: $PYTEST == $TEST_PY_BD when: always - when: never before_script: - git config --global user.name "GitLab CI Runner"; git config --global user.email trini@konsulko.com; git config --global --add safe.directory "${CI_PROJECT_DIR}"; export USER=gitlab; python3 -m venv /tmp/venv; . /tmp/venv/bin/activate; pip install -r test/py/requirements.txt -r tools/binman/requirements.txt -r tools/buildman/requirements.txt -r tools/patman/requirements.txt -r tools/u_boot_pylib/requirements.txt; export UBOOT_TRAVIS_BUILD_DIR=/tmp/tools-only; export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt"; export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}"; # Set environment variables - export TOOLPATH="--toolpath ${pwd}/build-sandbox/tools --toolpath /opt/coreboot" - export PATH=/opt/qemu/bin:${PATH} Check make check: extends: .python_check_template script: - make check Check make qcheck: extends: .python_check_template script: - make qcheck Check make tcheck: extends: .python_check_template script: - make tcheck # This currently fails, so disable it #Check make pcheck: # extends: .python_check_template # script: # - make pcheck # Test sandbox with test.py sandbox test.py: variables: TEST_PY_BD: "sandbox" TEST_PY_EXTRA: "--timing" <<: *buildman_and_testpy_dfn sandbox with clang test.py: variables: TEST_PY_BD: "sandbox" OVERRIDE: "-O clang-18" <<: *buildman_and_testpy_dfn sandbox64 test.py: variables: TEST_PY_BD: "sandbox64" <<: *buildman_and_testpy_dfn sandbox64 with clang test.py: variables: TEST_PY_BD: "sandbox64" OVERRIDE: "-O clang-18" <<: *buildman_and_testpy_dfn sandbox64_lwip test.py: variables: TEST_PY_BD: "sandbox64_lwip" <<: *buildman_and_testpy_dfn sandbox_spl test.py: variables: TEST_PY_BD: "sandbox_spl" TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff or test_spl" <<: *buildman_and_testpy_dfn sandbox_noinst_test.py: variables: TEST_PY_BD: "sandbox_noinst" TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff or test_spl" <<: *buildman_and_testpy_dfn sandbox_noinst with LOAD_FIT_FULL test.py: variables: TEST_PY_BD: "sandbox_noinst" TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff or test_spl" OVERRIDE: "-a CONFIG_SPL_LOAD_FIT_FULL=y" <<: *buildman_and_testpy_dfn sandbox_vpl test.py: variables: TEST_PY_BD: "sandbox_vpl" TEST_PY_TEST_SPEC: "vpl or test_spl" <<: *buildman_and_testpy_dfn # Enable tracing and disable LTO, to ensure functions are not elided sandbox trace_test.py: variables: TEST_PY_BD: "sandbox" BUILD_ENV: "FTRACE=1 NO_LTO=1" TEST_PY_TEST_SPEC: "trace" OVERRIDE: "-a CONFIG_TRACE=y -a CONFIG_TRACE_EARLY=y -a CONFIG_TRACE_EARLY_SIZE=0x01000000 -a CONFIG_TRACE_BUFFER_SIZE=0x02000000 -a ~CONFIG_BACKTRACE" <<: *buildman_and_testpy_dfn evb-ast2500 test.py: variables: TEST_PY_BD: "evb-ast2500" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id qemu" <<: *buildman_and_testpy_dfn sandbox_flattree test.py: variables: TEST_PY_BD: "sandbox_flattree" <<: *buildman_and_testpy_dfn vexpress_ca9x4 test.py: variables: TEST_PY_BD: "vexpress_ca9x4" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id qemu" <<: *buildman_and_testpy_dfn integratorcp_cm926ejs test.py: variables: TEST_PY_BD: "integratorcp_cm926ejs" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id qemu" <<: *buildman_and_testpy_dfn qemu_arm test.py: variables: TEST_PY_BD: "qemu_arm" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu_arm64 test.py: variables: TEST_PY_BD: "qemu_arm64" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu_arm64_lwip test.py: variables: TEST_PY_BD: "qemu_arm64_lwip" TEST_PY_TEST_SPEC: "test_net_dhcp or test_net_ping or test_net_tftpboot" <<: *buildman_and_testpy_dfn qemu_arm_sbsa test.py: variables: TEST_PY_BD: "qemu-arm-sbsa" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu_arm spl_test.py: variables: TEST_PY_BD: "qemu_arm_spl" TEST_PY_TEST_SPEC: "test_passage" <<: *buildman_and_testpy_dfn qemu_arm64 spl_test.py: variables: TEST_PY_BD: "qemu_arm64_spl" TEST_PY_TEST_SPEC: "test_passage" <<: *buildman_and_testpy_dfn qemu_m68k test.py: variables: TEST_PY_BD: "M5208EVBE" TEST_PY_ID: "--id qemu" TEST_PY_TEST_SPEC: "not sleep and not efi" OVERRIDE: "-a CONFIG_M68K_QEMU=y -a ~CONFIG_MCFTMR" <<: *buildman_and_testpy_dfn qemu_malta test.py: variables: TEST_PY_BD: "malta" TEST_PY_TEST_SPEC: "not sleep and not efi" TEST_PY_ID: "--id qemu" <<: *buildman_and_testpy_dfn qemu_maltael test.py: variables: TEST_PY_BD: "maltael" TEST_PY_TEST_SPEC: "not sleep and not efi" TEST_PY_ID: "--id qemu" <<: *buildman_and_testpy_dfn qemu_malta64 test.py: variables: TEST_PY_BD: "malta64" TEST_PY_TEST_SPEC: "not sleep and not efi" TEST_PY_ID: "--id qemu" <<: *buildman_and_testpy_dfn qemu_malta64el test.py: variables: TEST_PY_BD: "malta64el" TEST_PY_TEST_SPEC: "not sleep and not efi" TEST_PY_ID: "--id qemu" <<: *buildman_and_testpy_dfn qemu-ppce500 test.py: variables: TEST_PY_BD: "qemu-ppce500" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu-riscv32 test.py: variables: TEST_PY_BD: "qemu-riscv32" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu-riscv64 test.py: variables: TEST_PY_BD: "qemu-riscv64" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu-riscv32_spl test.py: variables: TEST_PY_BD: "qemu-riscv32_spl" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu-riscv64_spl test.py: variables: TEST_PY_BD: "qemu-riscv64_spl" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu-riscv64_smode test.py: variables: TEST_PY_BD: "qemu-riscv64_smode" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu-riscv64_smode_acpi test.py: variables: TEST_PY_BD: "qemu-riscv64_smode_acpi" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu-x86 test.py: variables: TEST_PY_BD: "qemu-x86" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu-x86_64 test.py: variables: TEST_PY_BD: "qemu-x86_64" TEST_PY_TEST_SPEC: "not sleep" <<: *buildman_and_testpy_dfn qemu-xtensa-dc233c test.py: variables: TEST_PY_BD: "qemu-xtensa-dc233c" TEST_PY_TEST_SPEC: "not sleep and not efi" tags: - all <<: *buildman_and_testpy_dfn r2dplus_i82557c test.py: variables: TEST_PY_BD: "r2dplus" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id i82557c_qemu" <<: *buildman_and_testpy_dfn r2dplus_pcnet test.py: variables: TEST_PY_BD: "r2dplus" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id pcnet_qemu" <<: *buildman_and_testpy_dfn r2dplus_rtl8139 test.py: variables: TEST_PY_BD: "r2dplus" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id rtl8139_qemu" <<: *buildman_and_testpy_dfn r2dplus_tulip test.py: variables: TEST_PY_BD: "r2dplus" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id tulip_qemu" <<: *buildman_and_testpy_dfn sifive_unleashed_sdcard test.py: variables: TEST_PY_BD: "sifive_unleashed" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id sdcard_qemu" <<: *buildman_and_testpy_dfn sifive_unleashed_spi-nor test.py: variables: TEST_PY_BD: "sifive_unleashed" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id spi-nor_qemu" <<: *buildman_and_testpy_dfn vexpress_fvp test.py: variables: TEST_PY_BD: "vexpress_fvp" TEST_PY_TEST_SPEC: "not sleep and not hostfs" <<: *buildman_and_testpy_dfn vexpress_fvp_bloblist test.py: variables: TEST_PY_BD: "vexpress_fvp_bloblist" TEST_PY_TEST_SPEC: "not sleep and not hostfs" <<: *buildman_and_testpy_dfn xilinx_zynq_virt test.py: variables: TEST_PY_BD: "xilinx_zynq_virt" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id qemu" <<: *buildman_and_testpy_dfn xilinx_versal_virt test.py: variables: TEST_PY_BD: "xilinx_versal_virt" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id qemu" OVERRIDE: "-a ~CONFIG_USB_DWC3" <<: *buildman_and_testpy_dfn xtfpga test.py: variables: TEST_PY_BD: "xtfpga" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id qemu" tags: - all <<: *buildman_and_testpy_dfn coreboot test.py: variables: TEST_PY_BD: "coreboot" TEST_PY_TEST_SPEC: "not sleep" TEST_PY_ID: "--id qemu" <<: *buildman_and_testpy_dfn .lab_template: &lab_dfn stage: sjg-lab needs: [] rules: # Skip if MR description contains [skip-sjg] - if: $CI_MERGE_REQUEST_DESCRIPTION =~ /\[skip-sjg\]/ when: never - if: $SJG_LAB == $ROLE || $SJG_LAB == "1" when: always - if: $CI_PIPELINE_SOURCE == "merge_request_event" when: always - if: $SJG_LAB != "" && $SJG_LAB != "1" && $SJG_LAB != $ROLE when: never - if: $SJG_LAB == "" when: manual allow_failure: true dependencies: [] tags: [ 'lab' ] script: # Environment: # SRC - source tree # OUT - output directory for builds - export SRC="$(pwd)" - export OUT="${SRC}/build/${ROLE}" - export OUT_EXTRA="${SRC}/build/${ROLE}_extra" - export PATH=$PATH:~/bin - export PATH=$PATH:test/hooks/bin # Load it on the device - ret=0 - echo "role ${ROLE}" - export strategy="-s uboot -e off" - export USE_LABGRID_SJG=1 # export verbose="-v" - export vars= - if [[ -n "${ADJUST}" ]]; then vars="-V build-adjust ${ADJUST}"; fi - ${SRC}/test/py/test.py --role ${ROLE} --build-dir "${OUT}" --build-dir-extra ${OUT_EXTRA} --capture=tee-sys -k "not bootstd ${TEST_PY_TEST_SPEC}" || ret=$? - U_BOOT_BOARD_IDENTITY="${ROLE}" u-boot-test-release || true - if [[ $ret -ne 0 ]]; then exit $ret; fi artifacts: when: always paths: - "build/${ROLE}/test-log.html" - "build/${ROLE}/multiplexed_log.css" expire_in: 1 week rpi3: variables: ROLE: rpi3 <<: *lab_dfn opi_pc: variables: ROLE: opi_pc <<: *lab_dfn pcduino3_nano: variables: ROLE: pcduino3_nano <<: *lab_dfn link: variables: ROLE: link <<: *lab_dfn jerry: variables: ROLE: jerry <<: *lab_dfn minnowmax: variables: ROLE: minnowmax <<: *lab_dfn opi_pc2: variables: ROLE: opi_pc2 <<: *lab_dfn bpi: variables: ROLE: bpi <<: *lab_dfn rpi2: variables: ROLE: rpi2 <<: *lab_dfn bob: variables: ROLE: bob <<: *lab_dfn ff3399: variables: ROLE: ff3399 <<: *lab_dfn coral: variables: ROLE: coral <<: *lab_dfn rpi3z: variables: ROLE: rpi3z <<: *lab_dfn bbb: variables: ROLE: bbb <<: *lab_dfn kevin: variables: ROLE: kevin <<: *lab_dfn # pine64+ pine64: variables: ROLE: pine64 <<: *lab_dfn # c4 needs binman supported added, so signing works #c4: # variables: # ROLE: c4 # <<: *lab_dfn rpi4: variables: ROLE: rpi4 ADJUST: SPI:CMD_SPI:TPM:DM_SPI:SOFT_SPI:CMD_TPM:TPM2_TIS_SPI <<: *lab_dfn rpi0: variables: ROLE: rpi0 <<: *lab_dfn snow: variables: ROLE: snow <<: *lab_dfn pcduino3: variables: ROLE: pcduino3 <<: *lab_dfn nyan-big: variables: ROLE: nyan-big <<: *lab_dfn rpi: variables: ROLE: rpi <<: *lab_dfn # StarFive VisionFive 2 vf2: variables: ROLE: vf2 <<: *lab_dfn colibrimx8: variables: ROLE: colibrimx8 <<: *lab_dfn rockpro64: variables: ROLE: rockpro64 <<: *lab_dfn rock3a: variables: ROLE: rock3a <<: *lab_dfn rock5b: variables: ROLE: rock5b <<: *lab_dfn rpi5: variables: ROLE: rpi5 <<: *lab_dfn qemu-x86_64: variables: ROLE: qemu-x86_64 TEST_PY_TEST_SPEC: "and not sleep" <<: *lab_dfn # NVIDIA Jetson TK1 tk1: variables: ROLE: tk1 <<: *lab_dfn # Firefly-RK3399 board running the rk3399-generic build vbe: variables: ROLE: vbe <<: *lab_dfn play: variables: ROLE: play <<: *lab_dfn efi-aarch64: variables: ROLE: efi-aarch64 TEST_PY_TEST_SPEC: "and not sleep" <<: *lab_dfn trigger_snap_builds: stage: release variables: GIT_DEPTH: 0 # Need full history for GitHub push rules: - if: $CI_COMMIT_BRANCH == "master" before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )' - mkdir -p ~/.ssh - echo "$LAUNCHPAD_SSH_KEY" | sed 's/\\n/\n/g' > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan git.launchpad.net >> ~/.ssh/known_hosts - ssh-keyscan github.com >> ~/.ssh/known_hosts - eval "$(ssh-agent -s)" - ssh-add ~/.ssh/id_rsa - git config --global user.name "GitLab CI" - git config --global user.email "admin@u-boot.org" script: - | echo "Triggering snap builds for latest U-Boot changes..." git clone --depth=1 git+ssh://sjg1@git.launchpad.net/~sjg1/u-boot/+git/u-boot-concept-qemu /tmp/qemu-snap cd /tmp/qemu-snap git commit --allow-empty -m "Trigger build: U-Boot updated to $CI_COMMIT_SHORT_SHA" git push origin master cd /tmp git clone --depth=1 git+ssh://sjg1@git.launchpad.net/~sjg1/u-boot/+git/u-boot-concept-efi /tmp/efi-snap cd /tmp/efi-snap git commit --allow-empty -m "Trigger build: U-Boot updated to $CI_COMMIT_SHORT_SHA" git push origin master echo "Snap build triggers completed" echo "Pushing to GitHub u-boot-concept for ReadTheDocs..." git config --global --add safe.directory $CI_PROJECT_DIR cd $CI_PROJECT_DIR git remote add github git@github.com:sjg20/u-boot-concept.git || true git push github HEAD:master --force echo "GitHub push completed"