CI: Add code coverage reporting

Add CODE_COVERAGE option to enable coverage instrumentation in builds.

Add new CI job to upload coverage reports to CodeCov.io.

Reports can be found by navigating the codecov.io UI, or by going to
the URL printed at the end of the "Code Coverage" CI job. More CodeCov
integration could be set up later once we have coverage reporting on the
main branch.
This commit is contained in:
Alastair Robertson 2023-02-03 01:47:57 -08:00 committed by Alastair Robertson
parent 5c5bfd315c
commit 397b798235
2 changed files with 61 additions and 1 deletions

View File

@ -13,6 +13,9 @@ workflows:
name: test-gcc name: test-gcc
requires: requires:
- build-gcc - build-gcc
- coverage:
requires:
- test-gcc
- build: - build:
name: build-clang name: build-clang
@ -72,6 +75,8 @@ jobs:
environment: environment:
CC: << parameters.cc >> CC: << parameters.cc >>
CXX: << parameters.cxx >> CXX: << parameters.cxx >>
working_directory:
/tmp/object-introspection
steps: steps:
- run: - run:
name: Install dependencies name: Install dependencies
@ -110,7 +115,7 @@ jobs:
- run: - run:
name: Build name: Build
command: | command: |
cmake -G Ninja -B build/ -DWITH_TESTS=On cmake -G Ninja -B build/ -DWITH_TESTS=On -DCODE_COVERAGE=On
cmake --build build/ cmake --build build/
# Testing rubbish: # Testing rubbish:
cp test/ci.oid.toml build/testing.oid.toml cp test/ci.oid.toml build/testing.oid.toml
@ -123,6 +128,8 @@ jobs:
test: test:
executor: big-boy executor: big-boy
working_directory:
/tmp/object-introspection
steps: steps:
- attach_workspace: - attach_workspace:
at: . at: .
@ -147,3 +154,50 @@ jobs:
--output-junit results.xml --output-junit results.xml
- store_test_results: - store_test_results:
path: build/test/results.xml path: build/test/results.xml
- persist_to_workspace:
# Save code coverage data
root: .
paths:
- build/*
coverage:
executor: ubuntu-docker
working_directory:
/tmp/object-introspection
steps:
- run:
name: Install dependencies
command: |
apt-get update
apt-get install -y \
curl \
git \
gpg \
lcov
- attach_workspace:
at: .
- run:
name: Code Coverage
when: always
command: |
lcov --directory . --capture --rc lcov_branch_coverage=1 --output-file coverage.info
lcov --extract coverage.info '/tmp/object-introspection/src/*' '/tmp/object-introspection/include/*' --rc lcov_branch_coverage=1 --output-file coverage.info
lcov --list --rc lcov_branch_coverage=1 coverage.info
curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import
curl -Os https://uploader.codecov.io/latest/linux/codecov
curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM
curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM.sig
gpgv codecov.SHA256SUM.sig codecov.SHA256SUM
shasum -a 256 -c codecov.SHA256SUM
chmod +x codecov
# It appears that codecov wants to scan through all directories
# other than "build", looking for files to upload, even if we
# specify a file name on the command line.
#
# "extern" is huge and makes uploading the coverage report take
# forever. Delete it for a speedup.
rm -rf extern
./codecov -Z -f coverage.info

View File

@ -21,6 +21,7 @@ include(cmake/CompilerWarnings.cmake)
option(STATIC_LINK "Statically link oid" OFF) option(STATIC_LINK "Statically link oid" OFF)
option(ASAN "Enable address sanitizer" OFF) option(ASAN "Enable address sanitizer" OFF)
option(CODE_COVERAGE "Enable code coverage" OFF)
option(WITH_TESTS "Build with tests" Off) option(WITH_TESTS "Build with tests" Off)
option(FORCE_BOOST_STATIC "Build with static boost" On) option(FORCE_BOOST_STATIC "Build with static boost" On)
option(FORCE_LLVM_STATIC "Build with static llvm and clang" On) option(FORCE_LLVM_STATIC "Build with static llvm and clang" On)
@ -30,6 +31,11 @@ if (ASAN)
add_link_options(-fsanitize=address) add_link_options(-fsanitize=address)
endif() endif()
if (CODE_COVERAGE)
add_compile_options(--coverage)
add_link_options(--coverage)
endif()
## System checks ## System checks