name: Code Coverage with codecov on: schedule: - cron: '25 06,18 * * *' concurrency: group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.head_ref || github.ref }} cancel-in-progress: true jobs: codecov: if: github.repository_owner == 'zephyrproject-rtos' runs-on: group: zephyr-runner-v2-linux-x64-4xlarge container: image: ghcr.io/zephyrproject-rtos/ci-repo-cache:v0.27.4.20241026 options: '--entrypoint /bin/bash' strategy: fail-fast: false matrix: platform: ["mps2/an385", "native_sim", "qemu_x86", "unit_testing"] include: - platform: 'mps2/an385' normalized: 'mps2_an385' - platform: 'native_sim' normalized: 'native_sim' - platform: 'qemu_x86' normalized: 'qemu_x86' - platform: 'unit_testing' normalized: 'unit_testing' env: CCACHE_DIR: /node-cache/ccache-zephyr CCACHE_REMOTE_STORAGE: "redis://cache-*.keydb-cache.svc.cluster.local|shards=1,2,3" CCACHE_REMOTE_ONLY: "true" # `--specs` is ignored because ccache is unable to resovle the toolchain specs file path. CCACHE_IGNOREOPTIONS: '-specs=* --specs=*' steps: - name: Apply container owner mismatch workaround run: | # FIXME: The owner UID of the GITHUB_WORKSPACE directory may not # match the container user UID because of the way GitHub # Actions runner is implemented. Remove this workaround when # GitHub comes up with a fundamental fix for this problem. git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Print cloud service information run: | echo "ZEPHYR_RUNNER_CLOUD_PROVIDER = ${ZEPHYR_RUNNER_CLOUD_PROVIDER}" echo "ZEPHYR_RUNNER_CLOUD_NODE = ${ZEPHYR_RUNNER_CLOUD_NODE}" echo "ZEPHYR_RUNNER_CLOUD_POD = ${ZEPHYR_RUNNER_CLOUD_POD}" - name: Update PATH for west run: | echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Clone cached Zephyr repository continue-on-error: true run: | git clone --shared /repo-cache/zephyrproject/zephyr . git remote set-url origin ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY} - name: checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: west setup run: | west init -l . || true west update 1> west.update.log || west update 1> west.update-2.log - name: Environment Setup run: | cmake --version gcc --version ls -la echo "ZEPHYR_SDK_INSTALL_DIR=/opt/toolchains/zephyr-sdk-$( cat SDK_VERSION )" >> $GITHUB_ENV - name: Set up ccache run: | mkdir -p ${CCACHE_DIR} ccache -M 10G ccache -p ccache -z -s -vv - name: Update BabbleSim to manifest revision run: | export BSIM_VERSION=$( west list bsim -f {revision} ) echo "Manifest points to bsim sha $BSIM_VERSION" cd /opt/bsim_west/bsim git fetch -n origin ${BSIM_VERSION} git -c advice.detachedHead=false checkout ${BSIM_VERSION} west update make everything -s -j 8 - name: Run Tests with Twister (Push) continue-on-error: true run: | export ZEPHYR_BASE=${PWD} export ZEPHYR_TOOLCHAIN_VARIANT=zephyr mkdir -p coverage/reports pip3 install gcovr==6.0 ./scripts/twister -E ${{matrix.normalized}}-testplan.json ls -la ./scripts/twister \ -i --force-color -N -v --filter runnable -p ${{ matrix.platform }} --coverage \ -T tests --coverage-tool gcovr -xCONFIG_TEST_EXTRA_STACK_SIZE=4096 -e nano \ --timeout-multiplier 2 - name: Print ccache stats if: always() run: | ccache -s -vv - name: Rename coverage files if: always() run: | mv twister-out/coverage.json coverage/reports/${{matrix.normalized}}.json - name: Upload Coverage Results if: always() uses: actions/upload-artifact@v4 with: name: Coverage Data (Subset ${{ matrix.normalized }}) path: | coverage/reports/${{ matrix.normalized }}.json ${{ matrix.normalized }}-testplan.json codecov-results: name: "Publish Coverage Results" needs: codecov runs-on: ubuntu-22.04 # the codecov job might be skipped, we don't need to run this job then if: success() || failure() steps: - name: checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download Artifacts uses: actions/download-artifact@v4 with: path: coverage/reports - name: Move coverage files run: | ls -lRt ./coverage/reports mv ./coverage/reports/*/*testplan.json . mv ./coverage/reports/*/coverage/reports/*.json ./coverage/reports ls -la ./coverage/reports - name: Generate list of coverage files id: get-coverage-files shell: cmake -P {0} run: | file(GLOB INPUT_FILES_LIST "coverage/reports/*.json") set(MERGELIST "") set(FILELIST "") foreach(ITEM ${INPUT_FILES_LIST}) get_filename_component(f ${ITEM} NAME) if(FILELIST STREQUAL "") set(FILELIST "${f}") else() set(FILELIST "${FILELIST},${f}") endif() endforeach() foreach(ITEM ${INPUT_FILES_LIST}) get_filename_component(f ${ITEM} NAME) if(MERGELIST STREQUAL "") set(MERGELIST "--add-tracefile ${f}") else() set(MERGELIST "${MERGELIST} -a ${f}") endif() endforeach() file(APPEND $ENV{GITHUB_OUTPUT} "mergefiles=${MERGELIST}\n") file(APPEND $ENV{GITHUB_OUTPUT} "covfiles=${FILELIST}\n") - name: Merge coverage files run: | pushd ./coverage/reports pip3 install gcovr==6.0 gcovr ${{ steps.get-coverage-files.outputs.mergefiles }} --merge-mode-functions=separate --json merged.json gcovr ${{ steps.get-coverage-files.outputs.mergefiles }} --merge-mode-functions=separate --cobertura merged.xml popd - name: Get current date id: run_date run: | echo "run_date=$(date --iso-8601=minutes)" >> "$GITHUB_OUTPUT" echo "run_date_short=$(date +'%Y-%m-%d')" >> "$GITHUB_OUTPUT" echo "run_date_year=$(date +'%Y')" >> "$GITHUB_OUTPUT" echo "run_date_month=$(date +'%m')" >> "$GITHUB_OUTPUT" - name: Generate Coverage Report if: always() run: | pip install xlsxwriter ijson python3 ./scripts/ci/coverage/coverage_analysis.py \ -t native_sim-testplan.json \ -m MAINTAINERS.yml \ -c coverage/reports/merged.json \ -o coverage-report-${{ steps.run_date.outputs.run_date_short }} \ -f all cp coverage-report-* coverage/reports/ - name: Upload Merged Coverage Results and Report if: always() uses: actions/upload-artifact@v4 with: name: Coverage Data and report path: | coverage/reports/merged.json coverage/reports/merged.xml coverage/reports/coverage-report-${{ steps.run_date.outputs.run_date_short }}.json coverage/reports/coverage-report-${{ steps.run_date.outputs.run_date_short }}.xlsx - name: Upload coverage to Codecov if: always() uses: codecov/codecov-action@v4 with: env_vars: OS,PYTHON fail_ci_if_error: false verbose: true token: ${{ secrets.CODECOV_TOKEN }} files: coverage/reports/merged.xml