背景
我有大型C++应用程序,具有复杂的目录结构。结构是如此之深,以至于代码存储库无法存储在Jenkins工作空间中,而是某个根目录,否则由于路径长度限制被破坏,构建会失败。
现在,由于应用程序是在不同的环境中进行测试的,因此测试应用程序将在不同的计算机上运行。应用程序和所有资源都被压缩并复制到测试机器,在其中使用OpenCppCoverage
运行测试,结果产生了Cobertura xml。
现在,由于需要显示原始结果的源代码,因此将xml复制回构建机器,然后提供给Jenkins Cobertura插件。
问题
覆盖率报告仅显示模块或源代码的百分比结果。不显示代码内容,但显示此错误消息:
现在,我发现this SO answear很有希望:
问题是:
[Cobertura] Publishing Cobertura coverage report...
FATAL: Unable to find coverage results
java.io.IOException: Expecting Ant GLOB pattern, but saw 'C:/build_coverage/Products/MyMagicProduct/Src/test/*Coverage.xml'. See http://ant.apache.org/manual/Types/fileset.html for syntax
这是xml结果的一部分(修改之前):
<?xml version="1.0" encoding="utf-8"?>
<coverage line-rate="0.63669186741173223" branch-rate="0" complexity="0" branches-covered="0" branches-valid="0" timestamp="0" lines-covered="122029" lines-valid="191661" version="0">
<sources>
<source>c:</source>
<source>C:</source>
</sources>
<packages>
<package name="C:\jenkins\workspace\MMP_coverage\MyMagicProduct\src\x64\Debug\MMPServer.exe" line-rate="0.63040511358728513" branch-rate="0" complexity="0">
<classes>
<class name="AuditHandler.cpp" filename="build_coverage\Products\MyMagicProduct\Src\Common\AuditHandler.cpp" line-rate="0.92682926829268297" branch-rate="0" complexity="0">
<methods/>
<lines>
<line number="18" hits="1"/>
<line number="19" hits="1"/>
<line number="23" hits="1"/>
<line number="25" hits="1"/>
<line number="27" hits="1"/>
....
</lines>
</class>
....
最大的问题是,我不确定xml的位置是否确实存在问题,因为插件未报告尝试获取/查找相应源代码时遇到的问题的详细信息。 Cobertura的第二个子弹可以解释问题,这完全令人困惑:
我还尝试了什么
filename
包含相对于以下路径:jenkins工作区,具有覆盖率报告的xml文件所在的路径到目前为止没有运气。
更新:
突然(我不确定自己做了什么)对我的帐户有效。问题是它仅对我有效,所有其他用户都遇到相同的问题。这清楚地表明该问题必须是安全的。
最佳答案
当我必须为非常庞大的C++客户端开发CI管道时,我遇到了一个非常相似的问题。如果我避免使用Cobertura Plugin,而是使用HTML Publisher Plugin,则效果最佳。我遇到的主要问题还在于查找源文件。
OpenCppCoverage
结果转换为HTML 这一步很容易。您必须将参数
--export_type=html:<outputPath>
(请参阅Commandline-reference)添加到OpenCppCoverage
调用中。mkdir CodeCoverage
OpenCppCoverage.exe --export_type=html:CodeCoverage <GoogleTest.exe>
上面的命令应在
<jenkins_workspace>/CodeCoverage/index.html
目录中生成一个html文件为此,我们使用上面提到的
HTML Publisher Plugin
。 reportDir
是在第一步中创建的目录,其中包含我们的html文件。它的路径是相对于Jenkins工作区的。 publishHTML target: [
allowMissing: false,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: 'CodeCoverage',
reportFiles: 'index.html',
reportName: 'Code Coverage'
]
为了确保每个人都可以在本地下载并检查结果,我们将
OpenCppCoverage
的结果归档: archiveArtifacts artifacts: 'CodeCoverage/*.*'
您现在可以在管道的边栏中
Code Coverage
下看到结果,结果将如下所示:这是对我有用的解决方案。
我希望这至少可以有所帮助。我只能建议不要使用
Cobertura Plugin
。我浪费了太多时间尝试修复它并识别我的来源...