当一个项目集成到 gitlab CI 管道中时,该管道通常分为几个步骤:
这些测试可以在运行器池上执行,每个步骤可能在不同的服务器/运行器上
我的问题是代码覆盖率。 据我了解,代码覆盖率分析遵循以下步骤:
当所有这些都在单个运行器上的单个作业中完成时,一切都会顺利进行。 然而,当您开始在不同的作业之间分割步骤时,您会遇到路径问题。
CMake 在 .gcno 文件中生成绝对路径。因此,当您去运行测试时,引用的绝对路径可能不存在,并且您将无法生成覆盖率报告。
您如何解决这个问题?
我尝试使用
万一有人偶然发现这个问题,我们终于找到了解决这个问题的方法,到目前为止已经在一个小项目上进行了测试
build:
stage: build
artifacts:
paths:
- ./build/
script:
- PROJECT_DIR=$PWD
- mkdir build && cd build
- cmake ../ -DCMAKE_BUILD_TYPE=COVERAGE
# Kludge : Patch absolute paths into relative paths
- find . -name build.make -exec sed "s|-c $PROJECT_DIR|-c ..|g" -i {} \;
- make -j8
unit_tests:
stage: test
coverage: '/^TOTAL.*\s+(\d+\%)$/'
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage.xml
script:
- export GCOV_PREFIX=$PWD
# Typical shell runner path is /home/runner/builds/<runner_id>/0/<group>/<project>
- export GCOV_PREFIX_STRIP=7
- cd build
- ./tests
- gcovr -r ../ . --txt --cobertura ../coverage.xml