diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml new file mode 100644 index 0000000000..a4930ccd78 --- /dev/null +++ b/.github/workflows/code-coverage.yml @@ -0,0 +1,128 @@ +# +# Copyright (c) 2026 Sam Darwin +# Copyright (c) 2026 Alexander Grund +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# + +# Instructions +# +# After running this workflow successfully, go to https://github.com/ORGANIZATION/REPO/settings/pages +# and enable github pages on the code-coverage branch. +# The pages will be hosted at https://ORGANIZATION.github.io/REPO +# + +name: Code Coverage + +on: + push: + branches: + - master + - develop + paths: + - 'src/**' + - 'include/**' + - '.github/workflows/code-coverage.yml' + workflow_dispatch: + +concurrency: + group: code-coverage-pages + cancel-in-progress: false + +env: + GIT_FETCH_JOBS: 8 + NET_RETRY_COUNT: 5 + # Commit title of the automatically created commits + GCOVR_COMMIT_MSG: "Update coverage data" + # Should branch coverage be reported? Default to no. + BOOST_BRANCH_COVERAGE: 0 + # Dependencies: + # EXTRA_BOOST_LIBRARIES: "myorg/myrepo other/repo3" + +jobs: + build: + defaults: + run: + shell: bash + + strategy: + fail-fast: false + matrix: + include: + - runs-on: "ubuntu-24.04" + name: Coverage + cxxstd: "20" + gcovr_script: './ci-automation/scripts/lcov-jenkins-gcc-13.sh --only-gcovr' + + name: ${{ matrix.name }} + runs-on: ${{ matrix.runs-on }} + timeout-minutes: 120 + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Check for code-coverage Branch + run: | + set -xe + git config --global user.name cppalliance-bot + git config --global user.email cppalliance-bot@example.com + git fetch origin + if git branch -r | grep origin/code-coverage; then + echo "The code-coverage branch exists. Continuing." + else + echo "The code-coverage branch does not exist. Creating it." + git switch --orphan code-coverage + git commit --allow-empty -m "$GCOVR_COMMIT_MSG" + git push origin code-coverage + git checkout "$GITHUB_REF_NAME" + fi + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version: '3.13' + + - name: Install Python packages + run: pip install gcovr + + - name: Checkout ci-automation + uses: actions/checkout@v6 + with: + repository: cppalliance/ci-automation + path: ci-automation + + - name: Build and run tests & collect coverage data + run: | + set -xe + ls -al + export ORGANIZATION=${GITHUB_REPOSITORY_OWNER} + export REPONAME=$(basename ${GITHUB_REPOSITORY}) + export B2_CXXSTD=${{matrix.cxxstd}} + ${{matrix.gcovr_script}} + + - name: Checkout GitHub pages branch + uses: actions/checkout@v6 + with: + ref: code-coverage + path: gh_pages_dir + + - name: Copy gcovr results + run: | + set -xe + pwd + ls -al + touch gh_pages_dir/.nojekyll # Prevent GH pages from treating these files as Jekyll pages. + mkdir -p gh_pages_dir/develop + mkdir -p gh_pages_dir/master + rm -rf "gh_pages_dir/${GITHUB_REF_NAME}/gcovr" + cp -rp gcovr "gh_pages_dir/${GITHUB_REF_NAME}/" + echo -e "\n\n\n\ndevelop
\nmaster
\n\n\n" > gh_pages_dir/index.html + # In the future: echo -e "\n\n\n\ngcovr
\n\n\n" > gh_pages_dir/develop/index.html + echo -e "\n\n\n\n\n\n\n" > gh_pages_dir/develop/index.html + cp gh_pages_dir/develop/index.html gh_pages_dir/master/index.html + cd gh_pages_dir + git add . + git commit --amend -m "$GCOVR_COMMIT_MSG" + git push -f origin code-coverage