Skip to content

Commit 53bee76

Browse files
committed
[ci] Generate coverage report
1 parent 5bb2871 commit 53bee76

1 file changed

Lines changed: 179 additions & 0 deletions

File tree

.github/workflows/coverage.yml

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
# Copyright Agustin K-ballo Berge, Fusion Fenix 2026
2+
#
3+
# Distributed under the Boost Software License, Version 1.0. (See accompanying
4+
# file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5+
6+
name: coverage
7+
8+
on:
9+
push:
10+
branches: [ main, feature/** ]
11+
pull_request:
12+
types: [opened, synchronize, reopened]
13+
workflow_dispatch:
14+
15+
jobs:
16+
coverage:
17+
name: ubuntu-24.04 / llvm-cov
18+
runs-on: ubuntu-24.04
19+
timeout-minutes: 6
20+
21+
steps:
22+
- uses: actions/checkout@v5
23+
24+
- name: Set up APT package cache
25+
run: |
26+
mkdir -p ~/.cache/apt/archives/partial
27+
echo "Dir::Cache::archives \"$HOME/.cache/apt/archives\";" \
28+
| sudo tee /etc/apt/apt.conf.d/99user-cache
29+
30+
- name: Cache APT packages
31+
uses: actions/cache@v5
32+
with:
33+
path: ~/.cache/apt/archives
34+
key: apt-ubuntu-24.04-clang-22-${{ hashFiles('.github/workflows/coverage.yml') }}
35+
restore-keys: apt-ubuntu-24.04-clang-22-
36+
37+
- name: Install Clang 22
38+
run: |
39+
wget -q https://apt.llvm.org/llvm.sh
40+
sudo bash llvm.sh 22 all
41+
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-22 200
42+
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-22 200
43+
44+
- name: Install Ninja
45+
run: sudo apt-get install -y ninja-build
46+
47+
- name: Fix APT cache permissions
48+
if: always()
49+
run: sudo rm -rf ~/.cache/apt/archives/lock ~/.cache/apt/archives/partial
50+
51+
- name: Configure (coverage)
52+
run: |
53+
cmake --preset dev-clang -B build/coverage \
54+
-DCMAKE_CXX_FLAGS="-fprofile-instr-generate -fcoverage-mapping" \
55+
-DCMAKE_EXE_LINKER_FLAGS="-fprofile-instr-generate"
56+
57+
- name: Build
58+
run: cmake --build build/coverage --config Debug
59+
60+
- name: Test
61+
run: |
62+
LLVM_PROFILE_FILE="${GITHUB_WORKSPACE}/build/coverage/cov-%p.profraw" \
63+
ctest --test-dir build/coverage --build-config Debug \
64+
--output-on-failure --no-compress-output
65+
66+
- name: Merge profile data
67+
run: |
68+
llvm-profdata-22 merge -sparse build/coverage/cov-*.profraw \
69+
-o build/coverage/coverage.profdata
70+
71+
- name: Coverage report
72+
run: |
73+
mapfile -t objects < <(find build/coverage -path "*/Debug/*" -type f -perm /111)
74+
first="${objects[0]}"
75+
obj_args=()
76+
for o in "${objects[@]:1}"; do obj_args+=("-object=$o"); done
77+
llvm-cov-22 report "$first" "${obj_args[@]}" \
78+
-instr-profile=build/coverage/coverage.profdata \
79+
-use-color=false src include/eggs 2>/dev/null
80+
81+
- name: Generate HTML report
82+
run: |
83+
mapfile -t objects < <(find build/coverage -path "*/Debug/*" -type f -perm /111)
84+
first="${objects[0]}"
85+
obj_args=()
86+
for o in "${objects[@]:1}"; do obj_args+=("-object=$o"); done
87+
llvm-cov-22 show "$first" "${obj_args[@]}" \
88+
-instr-profile=build/coverage/coverage.profdata \
89+
-format=html \
90+
-output-dir=build/coverage/html \
91+
-show-line-counts-or-regions \
92+
src include/eggs 2>/dev/null
93+
94+
- name: Upload coverage report
95+
uses: actions/upload-artifact@v6
96+
with:
97+
name: coverage-report-llvm-cov
98+
path: build/coverage/html/
99+
retention-days: 7
100+
101+
coverage-gcov:
102+
name: ubuntu-24.04 / gcov
103+
runs-on: ubuntu-24.04
104+
timeout-minutes: 6
105+
106+
steps:
107+
- uses: actions/checkout@v5
108+
109+
- name: Set up APT package cache
110+
run: |
111+
mkdir -p ~/.cache/apt/archives/partial
112+
echo "Dir::Cache::archives \"$HOME/.cache/apt/archives\";" \
113+
| sudo tee /etc/apt/apt.conf.d/99user-cache
114+
115+
- name: Cache APT packages
116+
uses: actions/cache@v5
117+
with:
118+
path: ~/.cache/apt/archives
119+
key: apt-ubuntu-24.04-gcc-16-${{ hashFiles('.github/workflows/coverage.yml') }}
120+
restore-keys: apt-ubuntu-24.04-gcc-16-
121+
122+
- name: Install GCC 16
123+
run: |
124+
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
125+
sudo apt-get update -q
126+
sudo apt-get install -y gcc-16 g++-16 lcov
127+
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-16 100 \
128+
--slave /usr/bin/g++ g++ /usr/bin/g++-16
129+
130+
- name: Install Ninja
131+
run: sudo apt-get install -y ninja-build
132+
133+
- name: Fix APT cache permissions
134+
if: always()
135+
run: sudo rm -rf ~/.cache/apt/archives/lock ~/.cache/apt/archives/partial
136+
137+
- name: Configure (coverage)
138+
run: |
139+
cmake --preset dev-gcc -B build/coverage-gcc \
140+
-DCMAKE_CXX_FLAGS="--coverage" \
141+
-DCMAKE_EXE_LINKER_FLAGS="--coverage"
142+
143+
- name: Build
144+
run: cmake --build build/coverage-gcc --config Debug
145+
146+
- name: Test
147+
run: |
148+
find build/coverage-gcc -name "*.gcda" -delete
149+
ctest --test-dir build/coverage-gcc --build-config Debug \
150+
--output-on-failure --no-compress-output
151+
152+
- name: Collect coverage
153+
run: |
154+
lcov --capture \
155+
--gcov-tool gcov-16 \
156+
--ignore-errors mismatch \
157+
--directory build/coverage-gcc \
158+
--output-file build/coverage-gcc/coverage.info
159+
lcov --extract build/coverage-gcc/coverage.info \
160+
'*/src/*' '*/include/eggs/*' \
161+
--ignore-errors unused \
162+
--output-file build/coverage-gcc/coverage.info
163+
164+
- name: Coverage report
165+
run: |
166+
lcov --list build/coverage-gcc/coverage.info
167+
168+
- name: Generate HTML report
169+
run: |
170+
genhtml build/coverage-gcc/coverage.info \
171+
--output-directory build/coverage-gcc/html \
172+
--quiet
173+
174+
- name: Upload coverage report
175+
uses: actions/upload-artifact@v6
176+
with:
177+
name: coverage-report-gcov
178+
path: build/coverage-gcc/html/
179+
retention-days: 7

0 commit comments

Comments
 (0)