1

我正在尝试使用 Jenkins 的 gcovr 生成代码覆盖率报告,但无济于事,它不会产生结果,但如果我从终端运行它,它工作正常。这是我通过 jenkins 执行以生成相同的命令:

gcovr -r /path/to/sourcefiles --object-directory=/Users/testinganywhere1/pathtogcdafile -x -b -e /Developer 1> html/coverage.xml 2>/tmp/Error.txt

如果我通过终端运行相同的程序,它可以正常工作!

谢谢您的帮助!

PS:我在主机上运行詹金斯并指示它在从机上执行作业。

4

4 回答 4

1

在执行之前必须先进入对象目录

 cd /Users/testinganywhere1/pathtogcdafile;
 gcovr -r /path/to/sourcefiles --object-directory=/Users/testinganywhere1/pathtogcdafile -x -b -e /Developer 1> html/coverage.xml 2>/tmp/Error.txt
于 2014-03-28T12:23:27.407 回答
0

对于遇到此问题的其他任何人,对我来说,结果证明这是从命令行以 Jenkins 用户身份运行时设置的路径与实际通过 Jenkins 运行时设置的路径不同。

因此,尝试在 Jenkins 中运行“echo $PATH”并从命令行手动运行,然后比较两者。

于 2015-03-28T05:46:25.087 回答
0

将 JENKINS 路径设置到正确的 GCOV.EXE 是不够的!

您必须添加另一个运行时选项,以确保 python 脚本知道 gcov.exe 在哪里执行新任务。

因此,有效的附加命令行选项是:

--gcov-executable (PATH TO THE GCOV EXECUTABLE THAT RELATES TO YOUR INVOCATION OF GCC)

GCOVR 文档明确表明您需要运行正确版本的 gcov.exe 才能使 gcovr 正常工作。尚不清楚的是,在 Jenkins 上将 Jenkins PATH 设置为正确的 gcov.exe 位置是不够的。

于 2021-06-16T10:29:39.220 回答
0

我最近为JenkinsSonarQube运行了这个。该配置旨在通过社区 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% 的覆盖率 - 但它的数据路径目前很重要......

于 2017-06-14T15:54:16.500 回答