【发布时间】:2020-01-21 13:55:29
【问题描述】:
背景
我有一个具有复杂目录结构的大型 c++ 应用程序。结构太深以至于代码库不能存储在 Jenkins 工作空间中,而是某个根目录,否则构建失败,因为路径长度限制被破坏。
现在由于应用程序在不同的环境中进行测试,测试应用程序在不同的机器上运行。应用程序和所有资源都被压缩并复制到使用OpenCppCoverage 运行测试的测试机器上,结果生成了 Cobertura xml。
现在由于需要源代码来显示协变结果,因此将 xml 复制回构建机器,然后馈送到 Jenkins Cobertura 插件。
问题
覆盖率报告仅显示模块或源代码的百分比结果。代码内容不显示,但显示此错误信息:
来源
源代码不可用。一些可能的原因是:
- 这不是最新版本(为了节省磁盘空间,此插件仅保留最新版本的源代码)。
- Cobertura 找到了源代码,但没有提供足够的信息来定位源代码。
- Cobertura 找不到源代码,所以这个插件没有希望找到它。
- 您没有足够的权限查看此文件。
现在我发现 this SO answear 很有希望:
输出 xml 文件必须与
coverage位于同一文件夹中 运行,所以:coverage xml -o coverage.xml对源文件夹的引用被放入
coverage.xml,如果 输出文件被放入另一个文件夹,引用 源文件夹将不正确。
问题是:
- 我已经在不同的机器上运行了测试(这可以通过修改 xml 路径的脚本来克服)。
- 我的源代码在构建期间不能位于工作区中
- Cobertura 插件不接受将 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 找到了源代码,但没有提供足够的信息来定位源代码。
我还尝试了什么
- 我已确保任何人都可以阅读源代码(以避免访问问题)
- 我已经修改了 xml,所以
filename包含相对于:jenkins 工作区,带有覆盖率报告的 xml 文件所在的路径 - 将我的源代码复制到不同的位置,甚至包含“cobertura”目录,因为something like this I've found in plugin source code
- 我已尝试通过检查源代码来了解问题。
- 我发现了一些(有点旧)github project,这可能是如何修复它的提示 - 目前我正在尝试研究它的确切作用(我不想将此项目导入我的构建结构) .
到目前为止还没有运气。
更新:
突然(我不确定我做了什么)它适用于我的帐户。问题是它只对我有用,所有其他用户都有同样的问题。这清楚地表明该问题必须是证券。
【问题讨论】:
-
路径长度限制是 windows 的事情,而不是 Jenkins 的事情。您可以使用符号链接制作更短的路径吗?像 mklink src C:\jenkins\workspace\MMP_coverage\MyMagicProduct\src 之类的东西?
-
@Mzzl:是的,我知道这一点。我只需要使用不同的路径(在 Jenkins 工作区之外)来避免这个 Windows 问题。我不确定这是否会破坏 Jenkins 插件的行为。
标签: c++ jenkins code-coverage cobertura