我有大型C ++应用程序,具有复杂的目录结构。结构是如此之深,无法将代码存储库存储在Jenkins工作空间中,而是存储在某个根目录中,否则由于路径长度限制被破坏,因此构建失败。
现在,由于应用程序是在不同的环境中进行测试的,因此测试应用程序将在不同的计算机上运行。将应用程序和所有资源压缩并复制到使用进行测试的测试机上,OpenCppCoverage
从而生成Cobertura xml。
现在,由于需要显示原始结果的源代码,因此将xml复制回构建机器,然后提供给Jenkins Cobertura插件。
覆盖率报告仅显示模块或源代码的百分比结果。不显示代码内容,但是显示此错误消息:
资源
源代码不可用。一些可能的原因是:
- 这不是最新版本(为了节省磁盘空间,此插件仅保留最新版本的源代码)。
- Cobertura找到了源代码,但没有提供足够的信息来定位源代码。
- Cobertura找不到源代码,因此该插件没有找到它的希望。
- 您没有足够的权限来查看此文件。
现在,我发现了这种有希望的SO answear:
输出的xml文件必须与
coverage
运行位置在同一文件夹中,因此:coverage xml -o coverage.xml
将放置对源文件夹的引用,
coverage.xml
并且如果将输出文件放置在另一个文件夹中,则对源文件夹的引用将不正确。
问题是:
[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的第二个子弹可以解释问题,这完全令人困惑:
Cobertura找到了源代码,但没有提供足够的信息来定位源代码。
filename
包含相对于以下路径:jenkins工作区,具有覆盖率报告的xml文件所在的路径到目前为止没有运气。
突然(我不确定自己做了什么)对我的帐户有效。问题是它仅对我有效,所有其他用户都遇到相同的问题。这清楚地表明该问题必须是安全的。
好的,我已经找到了这个插件有问题的原因。
xml fromopenCppCoverage
是正确的。此处无需进行任何更改即可使其工作(只要源位于pdb文件所指向的位置即可)。Jenkins工作区之外的资源在这里不是问题。当我将可执行文件从构建计算机复制到测试计算机,然后使用运行测试openCppCoverage
并将结果复制回构建计算机时,就很好了。
在作业配置中,任何应查看代码覆盖率的用户都必须有权访问Job/workspace
安全性部分。就我而言,我已为所有登录用户启用了此功能。这涵盖了错误消息的最后一个要点。
最重要的是:构建必须成功。我的意思是表格从头到尾。不计量包含对cobertura插件的调用的步骤是否成功。如果任何步骤(甚至在将来的步骤中)失败,则cobertura将不会显示此覆盖运行的代码。在我的情况下,由于其中一项测试超时,因此构建工作失败。这是由openCppCoverage
开销造成的,导致开销降低了因数3
。我的脚本正在检测超时并杀死其中一项测试。
我发现构建不成功是偶然的问题。在实验期间,我注意到cobertura显示源代码的两种情况:
如果构建不成功,则不播种覆盖范围是合理的(如果测试失败,则很可能是错误的代码分支),但是UI应该以不同的方式表明这一点。
这是一个很好的例子,向用户报告错误并提供准确的详细信息非常重要,出了什么问题以及原因。我至少浪费了全部精力来弄清楚实际出了什么问题,哪个错误消息实际上是我的情况。实际上,来自插件的错误消息并未涵盖不显示代码的所有原因。
我将报告该插件应给出更好的解释,以解决问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句