我最近为Jenkins和SonarQube运行了这个。该配置旨在通过社区 CXX 插件将数据导入 SonarQube,但覆盖文件也可以由 Jenkins 的 Cobertura 插件使用。
有问题的部分是在 XML 报告中正确获取源文件名。对于 SonarQube,它们应该与“项目根”相关,即“sonar-project.properties”所在的位置,或者调用 SonarQube 的“运行器”的位置。在我们的例子中,这与工作空间的根不同。
我们需要的“gcovr”版本是当前的 HEAD 版本(2017-06-14),因为发布的 3.3 版本对我们不起作用。此外,我必须在 gcovr 的 'process_gcov_data' 函数中规范化文件路径,在确定之后,但在应用过滤之前。对于我们提取的版本,在第 524 行添加了以下内容:
fname = os.path.normpath (fname);
'gcovr' 有一个限制,它只能在根目录和对象目录之间的文件夹中查找文件 - 一维搜索。但是,如果 gcov 数据包含相对文件名规范,例如头文件,则可能会出现此行之外的文件。我用 gcovr 提出了一张票来搜索根目录的子目录,但我不会屏住呼吸。
我们对“gcovr”的调用是:
cd <project-root> && gcovr \
<object-directory> \
--root=<project-root> \
--xml-pretty \
--exclude-unreachable-branches \
-o <output-xml>
<object-directory>
包含目标文件和覆盖数据的位置在哪里,<project-root>
是我们项目的基础。都是绝对路径,<object-directory>
都在<project-root>
.
在我们的例子中,被测源位于和之间的目录中<project-root>
——<object-directory>
尽管我不喜欢“gcovr”的这种限制。
然后<output-xml>
包含 Cobertura 格式的 XML 覆盖,文件路径相对于<project-root>
.
这些是使用Cobertura Plugin导入 Jenkins 的。在我们的例子中,我们使用管道脚本,并且在“管道语法”页面中,插件显示为step
片段的子选项:
step([
$class: 'CoberturaPublisher',
coberturaReportFile: '<output-xml>',
failNoReports: false,
failUnhealthy: false,
failUnstable: false,
maxNumberOfBuilds: 100
])
您的选项可能会有所不同,我们将文件指定为通配符。
然后,覆盖范围出现在 Jenkins 中的项目页面上,既作为摘要图,又作为似乎准确的“覆盖报告”链接。
XML 格式包含一个<source>
标签,其中列出了<project-root>
Jenkins 使用的绝对路径。如果这与工作空间相关,那就更好了,但那是另一天。然后文件名相对于该<source>
位置。
SonarQube 插件很痛苦,因为它忽略了<source>
标签,并且要求文件名只是相对于<project-root>
(调用声纳运行器的位置)。
我现在展示了我用来锻炼这个模板的项目的 1% 的覆盖率 - 但它的数据路径目前很重要......