name: Code Coverage with codecov on: schedule: - cron: '25 */3 * * 1-5' concurrency: group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.head_ref || github.ref }} cancel-in-progress: true jobs: codecov: if: github.repository == 'zephyrproject-rtos/zephyr' runs-on: zephyr-runner-linux-x64-4xlarge container: image: ghcr.io/zephyrproject-rtos/ci:v0.26.5 options: '--entrypoint /bin/bash' volumes: - /repo-cache/zephyrproject:/github/cache/zephyrproject strategy: fail-fast: false matrix: platform: ["native_posix", "qemu_x86", "unit_testing"] env: ZEPHYR_SDK_INSTALL_DIR: /opt/toolchains/zephyr-sdk-0.16.3 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: Update PATH for west run: | echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Clone cached Zephyr repository continue-on-error: true run: | git clone --shared /github/cache/zephyrproject/zephyr . git remote set-url origin ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY} - name: checkout uses: actions/checkout@v3 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: Check Environment run: | cmake --version gcc --version ls -la - name: Prepare ccache keys id: ccache_cache_prop shell: cmake -P {0} run: | string(REPLACE "/" "_" repo ${{github.repository}}) string(REPLACE "-" "_" repo2 ${repo}) file(APPEND $ENV{GITHUB_OUTPUT} "repo=${repo2}\n") - name: use cache id: cache-ccache uses: zephyrproject-rtos/action-s3-cache@v1.2.0 with: key: ${{ steps.ccache_cache_prop.outputs.repo }}-${{github.event_name}}-${{matrix.platform}}-codecov-ccache path: /github/home/.cache/ccache aws-s3-bucket: ccache.zephyrproject.org aws-access-key-id: ${{ vars.AWS_CCACHE_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_CCACHE_SECRET_ACCESS_KEY }} aws-region: us-east-2 - name: ccache stats initial run: | mkdir -p /github/home/.cache test -d github/home/.cache/ccache && mv github/home/.cache/ccache /github/home/.cache/ccache ccache -M 10G -s - name: Run Tests with Twister (Push) continue-on-error: true run: | export ZEPHYR_BASE=${PWD} export ZEPHYR_TOOLCHAIN_VARIANT=zephyr mkdir -p coverage/reports ./scripts/twister --force-color -N -v --filter runnable -p ${{ matrix.platform }} --coverage -T tests - name: Generate Coverage Report run: | mv twister-out/coverage.info lcov.pre.info lcov -q --remove lcov.pre.info mylib.c --remove lcov.pre.info tests/\* \ --remove lcov.pre.info samples/\* --remove lcov.pre.info ext/\* \ --remove lcov.pre.info *generated* \ -o coverage/reports/${{ matrix.platform }}.info --rc lcov_branch_coverage=1 - name: ccache stats post run: | ccache -s ccache -p - name: Upload Coverage Results if: always() uses: actions/upload-artifact@v3 with: name: Coverage Data (Subset ${{ matrix.platform }}) path: coverage/reports/${{ matrix.platform }}.info 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@v3 with: fetch-depth: 0 - name: Download Artifacts uses: actions/download-artifact@v3 with: path: coverage/reports - name: Move coverage files run: | mv ./coverage/reports/*/*.info ./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/*.info") 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 "-a ${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: | sudo apt-get update sudo apt-get install -y lcov cd ./coverage/reports lcov ${{ steps.get-coverage-files.outputs.mergefiles }} -o merged.info --rc lcov_branch_coverage=1 - name: Upload coverage to Codecov if: always() uses: codecov/codecov-action@v3 with: directory: ./coverage/reports env_vars: OS,PYTHON fail_ci_if_error: false verbose: true files: merged.info