# Copyright 2021 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. image: jbettis/ubuntu-26apr23 # You can update that image using this repo: # https://gitlab.com/zephyr-ec/gitlab-ci-runner/-/tree/main # Only run on main and coverage branches workflow: rules: - if: ($CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "coverage") # The directory structure is: # # ${CI_PROJECT_DIR} # |_ ec_dir/ - EC repo (${EC_DIR}) # |_ build/ - make and zmake artifacts (${BUILD_DIR}) # |_ twister-out/ - Twister artifacts (${TWISTER_OUT_DIR}) # |_ modules/ - Additional Zephyr modules (${MODULES_DIR}) # | |_ cmsis/ # | |_ hal_stm32/ # | |_ nanopb/ # | |_ cryptoc/ # | |_ boringssl/ # |_ zephyr/ # |_ main/ - Zephyr repo (${ZEPHYR_BASE}) # # On Gitlab builds, ${CI_PROJECT_DIR} is at /builds/zephyr-ec/ec. On local # builds, it will be /builds/0/project-0. before_script: - echo "CI_PROJECT_DIR is at ${CI_PROJECT_DIR}" # Move freshly-checked out ec code to subdirectory - cd ${CI_PROJECT_DIR} - mkdir -p ec_dir - find . -mindepth 1 -maxdepth 1 -name ec_dir -o -print0 | xargs -0 -I {} mv {} ec_dir - export EC_DIR="${CI_PROJECT_DIR}/ec_dir" - export MODULES_DIR="$CI_PROJECT_DIR/modules" - export ZEPHYR_BASE="${CI_PROJECT_DIR}/zephyr/main" - export REPO_BASE="${CI_PROJECT_DIR}/repo" - git config --global --add safe.directory '*' # Get Zephyr repo and modules - checkout_at_date() { local url="$1" ; local branch="$2" ; local path="$3" ; local date="$4" ; local retries=5 ; while [ ${retries} -gt 0 ] ; do rm -rf "${path}" ; mkdir -p "${path}" ; if git clone --depth 1 -b "${branch}" "${url}" "${path}"; then break ; else echo "git clone failed will retry ${retries} times"; fi ; retries="$(( ${retries} - 1 ))" ; done ; cd "${path}" ; rev="$(git rev-list -n 1 --before="${date}" "${branch}")" ; depth=1 ; while [ -z "${rev}" ] ; do depth="$(( ${depth} + 100 ))" ; git fetch --depth="${depth}" ; rev="$(git rev-list -n 1 --before="${date}" "${branch}")" ; done ; git checkout -d "${rev}" ; } - repo_clone_at_data() { local repo="$1" ; local branch="$2" ; local path="$3" ; local date="$4" ; mkdir -p "${REPO_BASE}" ; cd "${REPO_BASE}" ; repo init -u https://chromium.googlesource.com/chromiumos/manifest -b main ; repo sync "${repo}" ; mkdir -p "${path}" ; cp -rTLf "${repo}" "${path}" ; cd "${path}" ; rev="$(git rev-list -n 1 --before="${date}" "${branch}")" ; depth=1 ; while [ -z "${rev}" ] ; do depth="$(( ${depth} + 100 ))" ; git fetch --depth="${depth}" ; rev="$(git rev-list -n 1 --before="${date}" "${branch}")" ; done ; git checkout -d "${rev}" ; rev="$(git rev-list -n 1 --before="${date}" "${branch}")" ; } - ec_commit_date="$(cd ${EC_DIR} ; git log -1 HEAD --format=%cd --date=iso)" - checkout_at_date "https://chromium.googlesource.com/chromium/tools/depot_tools.git" "main" "${CI_PROJECT_DIR}/depot_tools" "${ec_commit_date}" - export PATH="${CI_PROJECT_DIR}/depot_tools:$PATH" - checkout_at_date "https://chromium.googlesource.com/chromiumos/third_party/zephyr" "main" "${ZEPHYR_BASE}" "${ec_commit_date}" - checkout_at_date "https://chromium.googlesource.com/chromiumos/third_party/zephyr/cmsis" "chromeos-main" "${MODULES_DIR}/cmsis" "${ec_commit_date}" - checkout_at_date "https://chromium.googlesource.com/chromiumos/third_party/zephyr/hal_stm32" "chromeos-main" "${MODULES_DIR}/hal_stm32" "${ec_commit_date}" - checkout_at_date "https://chromium.googlesource.com/chromiumos/third_party/zephyr/nanopb" "main" "${MODULES_DIR}/nanopb" "${ec_commit_date}" - checkout_at_date "https://chromium.googlesource.com/chromiumos/third_party/cryptoc" "main" "${MODULES_DIR}/cryptoc" "${ec_commit_date}" - repo_clone_at_data "src/third_party/boringssl" "m/main" "${MODULES_DIR}/boringssl" "${ec_commit_date}" # Add a symlink so the ec appears in modules directory (hack to make zmake work) - ln -s "${EC_DIR}" "${MODULES_DIR}/ec" # Install Python and packages - python3 -V # Print out python version for debugging - python3 -m pip install "${EC_DIR}/zephyr/zmake[tests]" --user - export PATH="$PATH:$HOME/.local/bin" - export PYTHONIOENCODING=utf-8 # Build directory - export BUILD_DIR=${EC_DIR}/build - export TWISTER_OUT_DIR=${EC_DIR}/twister-out # Users of this template must set: # $PROJECT to the project to build. E.g., "lazor" .build_template: &build_template stage: build needs: [] script: - zmake --zephyr-base "${ZEPHYR_BASE}" --modules-dir "${MODULES_DIR}" -l DEBUG build -B "${BUILD_DIR}" -t ${TOOLCHAIN:-zephyr} "${PROJECT}" - for b in "${BUILD_DIR}/${PROJECT}"/build-* ; do bdir=$(basename ${b}) ; if ninja -C ${b} ram_report >"${BUILD_DIR}/${PROJECT}/output/${bdir}_ram_report.txt" ; then cp ${b}/ram.json "${BUILD_DIR}/${PROJECT}/output/${bdir}_ram.json" ; else echo "Ram report failed" ; fi ; if ninja -C ${b} rom_report >"${BUILD_DIR}/${PROJECT}/output/${bdir}_rom_report.txt" ; then cp ${b}/rom.json "${BUILD_DIR}/${PROJECT}/output/${bdir}_rom.json" ; else echo "Rom report failed" ; fi ; done - ls "${BUILD_DIR}/${PROJECT}" "${BUILD_DIR}/${PROJECT}/output" artifacts: paths: - ec_dir/build/${PROJECT}/output/* expire_in: 1 week # Users of this template must set: # $PROJECT to the project to build. E.g., "lazor" # Builds the project with coverage enabled, removes the non-ec files. # Then merges with the tests, excludes all files not used by this project, # and generates a report. # NOTE: If you change the lcov -r command below, also edit the one in # merged_coverage .coverage_template: &coverage_template stage: test needs: - "merged_coverage" - "zephyr_coverage" script: - cd ${EC_DIR} - zmake --zephyr-base "${ZEPHYR_BASE}" --modules-dir "${MODULES_DIR}" -l DEBUG build --coverage -B "${BUILD_DIR}" -t ${TOOLCHAIN:-zephyr} "${PROJECT}" - lcov --rc lcov_branch_coverage=1 -o "${BUILD_DIR}/${PROJECT}/output/merged.info" -a "${BUILD_DIR}/${PROJECT}/output/zephyr.info" -a "${BUILD_DIR}/merged.info" - lcov --rc lcov_branch_coverage=1 -o "${BUILD_DIR}/${PROJECT}/output/no_zephyr.info" -r "${BUILD_DIR}/${PROJECT}/output/zephyr.info" "${ZEPHYR_BASE}/**" "${MODULES_DIR}/**" "${EC_DIR}/zephyr/drivers/**" "${EC_DIR}/zephyr/include/drivers/**" "${EC_DIR}/zephyr/shim/chip/**" "${EC_DIR}/zephyr/shim/core/**" "/usr/include/**" "${EC_DIR}/build/**" "${EC_DIR}/twister-out*/**" "${EC_DIR}/test/**" "${EC_DIR}/zephyr/shim/chip/npcx/npcx_monitor/**" "${EC_DIR}/zephyr/emul/**" "${EC_DIR}/zephyr/test/**" "**/testsuite/**" "**/subsys/emul/**" - util/lcov_stencil.py -o "${BUILD_DIR}/${PROJECT}/output/prefiltered.info" "${BUILD_DIR}/${PROJECT}/output/no_zephyr.info" "${BUILD_DIR}/${PROJECT}/output/merged.info" - lcov --rc lcov_branch_coverage=1 -o "${BUILD_DIR}/${PROJECT}/output/filtered_no_zephyr.info" -r "${BUILD_DIR}/${PROJECT}/output/prefiltered.info" "${ZEPHYR_BASE}/**" "${MODULES_DIR}/**" "${EC_DIR}/zephyr/drivers/**" "${EC_DIR}/zephyr/include/drivers/**" "${EC_DIR}/zephyr/shim/chip/**" "${EC_DIR}/zephyr/shim/core/**" "/usr/include/**" "${EC_DIR}/build/**" "${EC_DIR}/twister-out*/**" "${EC_DIR}/zephyr/shim/chip/npcx/npcx_monitor/**" "${EC_DIR}/test/**" "${EC_DIR}/include/tests/**" "${EC_DIR}/private/test/**" "${EC_DIR}/private/fingerprint/*/mcutest/**" "${EC_DIR}/zephyr/test/**" "${EC_DIR}/include/mock/**" "${EC_DIR}/common/mock/**" "${EC_DIR}/board/host/**" "${EC_DIR}/chip/host/**" "${EC_DIR}/core/host/**" "${EC_DIR}/zephyr/emul/**" "${EC_DIR}/zephyr/mock/**" "**/*_test.c" "**/*_test.h" "**/*_emul.c" "**/*_emul.h" "${EC_DIR}/include/test_util.h" "${EC_DIR}/common/test_util.c" "${EC_DIR}/zephyr/shim/src/test_util.c" "${EC_DIR}/zephyr/shim/src/ztest_system.c" "${EC_DIR}/driver/tcpm/it8xxx2.c" - /usr/bin/genhtml --branch-coverage -q -o "${BUILD_DIR}/${PROJECT}/output/filtered_no_zephyr_rpt" -t "${PROJECT} coverage w/o zephyr" -p ${EC_DIR} -s "${BUILD_DIR}/${PROJECT}/output/filtered_no_zephyr.info" artifacts: paths: - ec_dir/build/${PROJECT}/output/*.info - ec_dir/build/${PROJECT}/output/*_rpt expire_in: 1 week when: always coverage: '/lines\.*: \d+\.\d+%/' herobrine: variables: PROJECT: "herobrine" <<: *build_template herobrine_coverage: variables: PROJECT: "herobrine" <<: *coverage_template nivviks_coverage: variables: PROJECT: "nivviks" <<: *coverage_template nereid_coverage: variables: PROJECT: "nereid" <<: *coverage_template it8xxx2_evb: variables: PROJECT: "it8xxx2_evb" <<: *build_template kingler: variables: PROJECT: "kingler" <<: *build_template kingler_coverage: variables: PROJECT: "kingler" <<: *coverage_template krabby: variables: PROJECT: "krabby" <<: *build_template krabby_coverage: variables: PROJECT: "krabby" <<: *coverage_template lazor: variables: PROJECT: "lazor" <<: *build_template npcx7_evb: variables: PROJECT: "npcx7" <<: *build_template npcx9_evb: variables: PROJECT: "npcx9" <<: *build_template skyrim: variables: PROJECT: "skyrim" <<: *build_template skyrim_coverage: variables: PROJECT: "skyrim" <<: *coverage_template winterhold: variables: PROJECT: "winterhold" <<: *build_template winterhold_coverage: variables: PROJECT: "winterhold" <<: *coverage_template frostflow: variables: PROJECT: "frostflow" <<: *build_template frostflow_coverage: variables: PROJECT: "frostflow" <<: *coverage_template crystaldrift: variables: PROJECT: "crystaldrift" <<: *build_template crystaldrift_coverage: variables: PROJECT: "crystaldrift" <<: *coverage_template markarth: variables: PROJECT: "markarth" <<: *build_template markarth_coverage: variables: PROJECT: "markarth" <<: *coverage_template rex: variables: PROJECT: "rex" <<: *build_template rex_coverage: variables: PROJECT: "rex" <<: *coverage_template geralt: variables: PROJECT: "geralt" <<: *build_template geralt_coverage: variables: PROJECT: "geralt" <<: *coverage_template myst: variables: PROJECT: "myst" <<: *build_template myst_coverage: variables: PROJECT: "myst" <<: *coverage_template ec_coverage: stage: test needs: [] script: - cd ${EC_DIR} - make -j$(nproc) BORINGSSL_DIR="${MODULES_DIR}/boringssl" CRYPTOC_DIR="${MODULES_DIR}/cryptoc" CROSS_COMPILE_arm=/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi- CROSS_COMPILE_host=/usr/bin/ test-coverage artifacts: paths: - ec_dir/build/coverage/coverage_rpt/* - ec_dir/build/coverage/lcov.info expire_in: 1 week coverage: '/lines\.*: \d+\.\d+%/' zephyr_coverage: stage: test needs: [] script: - python3 ${EC_DIR}/twister --coverage --outdir "${TWISTER_OUT_DIR}" -v -i -x=ALLOW_WARNINGS=ON artifacts: paths: - ec_dir/twister-out/coverage.info expire_in: 1 week coverage: '/lines\.*: \d+\.\d+%/' zephyr_boards_coverage: stage: build needs: [] parallel: 5 script: - cd ${EC_DIR} - projects=( $(zmake --zephyr-base "${ZEPHYR_BASE}" --modules-dir "${MODULES_DIR}" list-projects | split -n r/"${CI_NODE_INDEX}"/"${CI_NODE_TOTAL}") ) - zmake --zephyr-base "${ZEPHYR_BASE}" --modules-dir "${MODULES_DIR}" -l DEBUG build --coverage --delete-intermediates "${projects[@]}" - mv build/zephyr/all_builds.info "build/zephyr/all_builds${CI_NODE_INDEX}.info" artifacts: paths: - ec_dir/build/zephyr/all_builds*.info expire_in: 1 week coverage: '/lines\.*: \d+\.\d+%/' # NOTE: If you change the lcov -r command below, also edit the one in # .coverage_template merged_coverage: stage: test needs: ["ec_coverage", "zephyr_coverage", "zephyr_boards_coverage"] script: # build_dir / "all_tests.info" -> "${BUILD_DIR}/merged.info" - lcov --rc lcov_branch_coverage=1 -o "${BUILD_DIR}/merged.info" -a "${BUILD_DIR}/coverage/lcov.info" -a "${TWISTER_OUT_DIR}/coverage.info" - printf ' -a %s' ${BUILD_DIR}/zephyr/all_builds[0-9]*.info | xargs -x lcov --rc lcov_branch_coverage=1 -o "${BUILD_DIR}/zephyr/zephyr_merged.info" -a "${BUILD_DIR}/merged.info" - lcov --rc lcov_branch_coverage=1 -o "${BUILD_DIR}/all_builds_filtered.info" -r "${BUILD_DIR}/zephyr/zephyr_merged.info" "${EC_DIR}/build/**" "${EC_DIR}/twister-out*/**" "/usr/include/**" "/usr/lib/**" "${EC_DIR}/test/**" "${EC_DIR}/include/tests/**" "${EC_DIR}/private/test/**" "${EC_DIR}/private/fingerprint/*/mcutest/**" "${EC_DIR}/zephyr/test/**" "${ZEPHYR_BASE}/main/subsys/testsuite/**" "${EC_DIR}/include/mock/**" "${EC_DIR}/common/mock/**" "${EC_DIR}/board/host/**" "${EC_DIR}/chip/host/**" "${EC_DIR}/core/host/**" "${EC_DIR}/zephyr/emul/**" "${EC_DIR}/zephyr/mock/**" "${ZEPHYR_BASE}/main/subsys/emul/**" "**/*_test.c" "**/*_test.h" "**/*_emul.c" "**/*_emul.h" "${EC_DIR}/include/test_util.h" "${EC_DIR}/common/test_util.c" "${EC_DIR}/zephyr/shim/src/test_util.c" "${EC_DIR}/zephyr/shim/src/ztest_system.c" - /usr/bin/genhtml --branch-coverage -q -o "${BUILD_DIR}/all_builds_filtered_rpt" -t "All boards and tests merged" -p ${EC_DIR} -s "${BUILD_DIR}/all_builds_filtered.info" artifacts: paths: - ec_dir/build/*.info - ec_dir/build/*_rpt expire_in: 1 week coverage: '/lines\.*: \d+\.\d+%/' testall: stage: test needs: [] script: - python3 ${EC_DIR}/twister --outdir "${TWISTER_OUT_DIR}" -v -i -x=ALLOW_WARNINGS=ON # The download url changed. Disable until we can figure it out. # twister_coverage: # stage: test # needs: [] # script: # - mkdir -p ${BUILD_DIR}/zephyr_codecov # - for commitid in $(cd "${ZEPHYR_BASE}" ; git fetch --depth=100 ; git log | awk '/GitOrigin-RevId:/ {print $2}') ; do # echo "COMMITID = ${commitid?}" ; # if wget -O /tmp/coverage.html "https://app.codecov.io/gh/zephyrproject-rtos/zephyr/commit/${commitid?}" ; then # downloadurl=$(sed -e '/download\/build/!d' -e 's|^.*href="|https://codecov.io|' -e 's|".*$||' /tmp/coverage.html | head -1) ; # echo "DOWNLOADURL = ${downloadurl?}" ; # wget -O ${BUILD_DIR}/zephyr_codecov/merged.info.raw "${downloadurl?}" ; # sed <${BUILD_DIR}/zephyr_codecov/merged.info.raw >${BUILD_DIR}/zephyr_codecov/merged.info # -e '1,/<<<<<< network/d' -e '/<<<<<< EOF/,$d' ; # sed <${BUILD_DIR}/zephyr_codecov/merged.info >${BUILD_DIR}/zephyr_codecov/fixed.info # -e "s|/__w/zephyr/zephyr|${ZEPHYR_BASE}|" # -e "s|/__w/zephyr/modules/hal/cmsis|${MODULES_DIR}/cmsis|" # -e "s|/__w/zephyr/modules|${MODULES_DIR}|" ; # break ; # fi ; # done # - lcov --rc lcov_branch_coverage=1 --summary ${BUILD_DIR}/zephyr_codecov/fixed.info # artifacts: # paths: # - ec_dir/build/zephyr_codecov/fixed.info # expire_in: 1 week # coverage: '/lines\.*: \d+\.\d+%/' zmake_coverage: stage: test needs: [] script: - cd ${EC_DIR}/zephyr/zmake - coverage run --source=zmake -m pytest . - coverage report - coverage html artifacts: paths: - ec_dir/zephyr/zmake/htmlcov/* expire_in: 1 week coverage: '/^TOTAL.+?(\d+\%)$/'