背景

我有大型C++应用程序,具有复杂的目录结构。结构是如此之深,以至于代码存储库无法存储在Jenkins工作空间中,而是某个根目录,否则由于路径长度限制被破坏,构建会失败。

现在,由于应用程序是在不同的环境中进行测试的,因此测试应用程序将在不同的计算机上运行。应用程序和所有资源都被压缩并复制到测试机器,在其中使用OpenCppCoverage运行测试,结果产生了Cobertura xml。

现在,由于需要显示原始结果的源代码,因此将xml复制回构建机器,然后提供给Jenkins Cobertura插件。

问题

覆盖率报告仅显示模块或源代码的百分比结果。不显示代码内容,但显示此错误消息:



现在,我发现this SO answear很有希望:



问题是:

  • 我已经在另一台机器上运行了测试(可以通过修改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的第二个子弹可以解释问题,这完全令人困惑:



    我还尝试了什么
  • 我已经确保任何人都可以阅读源代码(以避免访问问题)
  • 我已经修改了xml,所以filename包含相对于以下路径:jenkins工作区,具有覆盖率报告的xml文件所在的路径
  • 将我的源代码复制到了多个位置,甚至因为something like this I've found in plugin source code
  • 也包含“cobertura”目录
  • 我尝试通过检查源代码来了解此问题。
  • 我发现了一些(有点旧)github project,这可能是如何修复的提示-目前,我正在研究其确切功能(我不想将此项目导入到我的构建结构中)。

  • 到目前为止没有运气。

    更新:

    突然(我不确定自己做了什么)对我的帐户有效。问题是它仅对我有效,所有其他用户都遇到相同的问题。这清楚地表明该问题必须是安全的。

    最佳答案

    当我必须为非常庞大的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文件
  • 发布OpenCppCoverage结果

  • 为此,我们使用上面提到的HTML Publisher PluginreportDir是在第一步中创建的目录,其中包含我们的html文件。它的路径是相对于Jenkins工作区的。
        publishHTML target: [
          allowMissing: false,
          alwaysLinkToLastBuild: true,
          keepAll: true,
          reportDir: 'CodeCoverage',
          reportFiles: 'index.html',
          reportName: 'Code Coverage'
          ]
    

    为了确保每个人都可以在本地下载并检查结果,我们将OpenCppCoverage的结果归档:
       archiveArtifacts artifacts: 'CodeCoverage/*.*'
    

    您现在可以在管道的边栏中Code Coverage下看到结果,结果将如下所示:

    c&#43;&#43; - 使用Cobertura用Jenkins中的源代码显示代码覆盖率(来自其他计算机的运行结果)-LMLPHP
    c&#43;&#43; - 使用Cobertura用Jenkins中的源代码显示代码覆盖率(来自其他计算机的运行结果)-LMLPHP

    这是对我有用的解决方案。

    我希望这至少可以有所帮助。我只能建议不要使用Cobertura Plugin。我浪费了太多时间尝试修复它并识别我的来源...

    09-26 20:39
    查看更多