Mar*_*k R 6 c++ code-coverage cobertura jenkins
我有具有复杂目录结构的大型 C++ 应用程序。结构如此之深以至于代码存储库无法存储在 Jenkins 工作区中,而是某个根目录,否则构建将失败,因为路径长度限制被破坏。
现在由于应用程序在不同的环境中测试,测试应用程序在不同的机器上运行。应用程序和所有资源都被压缩并复制到测试机器,在那里使用测试运行OpenCppCoverage,从而产生 Cobertura xml。
现在因为需要源代码来显示 covarage 结果 xml 被复制回构建机器,然后提供给 Jenkins Cobertura 插件。
覆盖率报告仅显示模块或源代码的百分比结果。不显示代码内容,但显示此错误消息:
来源
源代码不可用。一些可能的原因是:
- 这不是最新的构建(为了节省磁盘空间,此插件仅保留最新构建的源代码)。
- Cobertura 找到了源代码,但没有提供足够的信息来定位源代码。
- Cobertura 找不到源代码,所以这个插件没有找到它的希望。
- 您没有足够的权限查看此文件。
现在我发现这个 SO answear很有希望:
输出 xml 文件必须与
coverage运行所在的文件夹位于同一文件夹中,因此:Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
这是 xml 结果的一部分(修改前):
coverage xml -o coverage.xml
Run Code Online (Sandbox Code Playgroud)
最大的问题是我不确定 xml 的位置是否真的是一个问题,因为插件没有报告尝试获取/查找相应源代码时遇到的问题的详细信息。来自 Cobertura 的第二个可以解释问题的子弹完全令人困惑:
Cobertura 找到了源代码,但没有提供足够的信息来定位源代码。
filename包含相对于的路径:jenkins 工作区,带有覆盖报告的 xml 文件所在的路径到目前为止没有运气。
突然(我不确定我做了什么)它适用于我的帐户。问题是它只对我有用,所有其他用户都有同样的问题。这清楚地表明问题必须是证券。
当我必须为一个非常大的 C++ 客户端开发 CI 管道时,我遇到了一个非常类似的问题。如果我避免使用Cobertura 插件并使用HTML Publisher 插件,我会得到最好的结果。我遇到的主要问题也是找到源文件。
OpenCppCoverage结果转换为 HTML这一步非常简单。您必须将参数--export_type=html:<outputPath>(请参阅Commandline-reference)添加到OpenCppCoverage调用中。
mkdir CodeCoverage
OpenCppCoverage.exe --export_type=html:CodeCoverage <GoogleTest.exe>
Run Code Online (Sandbox Code Playgroud)
上面的命令应该会在目录中生成一个 html 文件<jenkins_workspace>/CodeCoverage/index.html
为此,我们使用HTML Publisher Plugin上面提到的方法。reportDir是在第一步中创建的目录,其中包含我们的 html 文件。它的路径是相对于 Jenkins 工作区的。
publishHTML target: [
allowMissing: false,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: 'CodeCoverage',
reportFiles: 'index.html',
reportName: 'Code Coverage'
]
Run Code Online (Sandbox Code Playgroud)
为了确保每个人都可以在本地下载并检查结果,我们归档了以下结果OpenCppCoverage:
archiveArtifacts artifacts: 'CodeCoverage/*.*'
Run Code Online (Sandbox Code Playgroud)
您现在可以在管道的侧栏中看到结果Code Coverage,结果如下所示:
这是对我有用的解决方案。
我希望这至少有一点帮助。我只能建议避免Cobertura Plugin。我浪费了很多时间尝试修复它并识别我的来源......
好吧,我已经找到了这个插件出现问题的原因。
xml fromopenCppCoverage是正确的。这里不需要进行任何更改即可使其工作(只要 pdb 文件指向的源就在那里)。Jenkins 工作区之外的资源不是这里的问题。当我将可执行文件从构建机器复制到测试机器,然后运行测试并将openCppCoverage结果复制回构建机器时,就很好了。
在作业配置中,任何应该查看代码覆盖率的用户都必须有权访问Job/workspace安全部分。就我而言,我已为所有登录用户启用此功能。
这涵盖了错误消息的最后一个要点。
最重要的是:构建必须成功。我的意思是从开始到结束的形式。不计量包含调用 cobertura 插件的步骤是否成功。如果任何步骤(甚至在未来的步骤中)失败,那么 cobertura 将不会显示此覆盖率运行的代码。就我而言,由于其中一项测试超时,构建工作失败。这是由openCppCoverage开销引起的,它会减慢测试速度3。我的脚本正在检测超时并终止其中一项测试。
我偶然发现构建不成功是一个问题。在实验过程中,我注意到 cobertura 显示源代码的两种情况:
如果构建不成功,则不播种覆盖范围是合理的(如果测试失败,则很可能采用了错误的代码分支),但 UI 应该以不同的方式指示这一点。
这是一个很好的例子,说明向用户报告错误并提供错误详情和原因的重要性。我至少浪费了全部精力来弄清楚到底出了什么问题,错误消息的哪个要点实际上是我的情况。事实上,来自插件的错误消息并不涵盖不显示代码的所有原因。
我将提交报告,该插件应该给出更好的解释出了什么问题。
| 归档时间: |
|
| 查看次数: |
2290 次 |
| 最近记录: |