与詹金斯合作的gcovr并不起作用

时间:2014-03-25 09:23:28

标签: jenkins cobertura gcov gcovr

我正在尝试使用来自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

如果我通过终端运行相同的工作grt!

感谢您的帮助!

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

对于有这个问题的其他人来说,对我来说,这在从命令行作为Jenkins用户运行而在实际运行Jenkins时设置的路径中存在差异。

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

答案 2 :(得分:0)

我最近在 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&#39;的限制。

然后<output-xml>包含Cobertura格式的XML覆盖,其文件路径相对于<project-root>

使用 Cobertura插件将它们导入Jenkins。在我们的例子中,我们使用管道脚本,并在&#34;管道语法&#34;页面插件显示为step代码段的子选项:

step([
    $class: 'CoberturaPublisher',
    coberturaReportFile: '<output-xml>',
    failNoReports: false,
    failUnhealthy: false,
    failUnstable: false,
    maxNumberOfBuilds: 100
])

您的选项可能会有所不同,我们会将该文件指定为通配符。

然后,该报道出现在Jenkins的项目页面中,作为摘要图表和“覆盖率报告”的链接&#39;这似乎很准确。

XML格式包含<source>标记,其中列出了Jenkins使用的<project-root>的绝对路径。如果这是相对于工作空间,那将是更好的,但这是另一天。然后,文件名相对于此<source>位置。

SonarQube插件很痛苦,因为它忽略了<source>标记,并且要求文件名只是相对于<project-root>(调用了声纳跑步者)。

我现在对我用来锻炼这个模板的项目显示1%的覆盖率 - 但它的数据路径目前非常重要......

答案 3 :(得分: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 位置是不够的。