TeamCity 和 cppcheck 输出模板

Posted

技术标签:

【中文标题】TeamCity 和 cppcheck 输出模板【英文标题】:TeamCity and cppcheck output template 【发布时间】:2015-07-29 05:41:51 【问题描述】:

我在 TeamCity 中对我的代码运行 cppcheck,并希望将其错误报告为构建问题。所以我把cppcheck输出格式改成

"##teamcity[buildProblem\tdescription='file(line):\tseverity:\tmessage']"

总体思路还可以。但问题是某些消息包含字符 ',这会导致解析输出时出错,因为 TeamCity 需要转义撇号。例如,这是我的构建日志的摘录:

[17:20:05][Step 2/2] Checking ..\..\..\services_package\Services\FaultsManager\FaultsManager.c...
[17:20:14][Step 2/2] ##teamcity[buildProblem    description='..\..\..\services_package\Services\FaultsManager\FaultsManager.c(83):  style:  The scope of the variable 'channelID' can be reduced.']
[17:20:15]
[Step 2/2] Property value not found
Valid property list format is (name( )*=( )*'escaped_value'( )*)* where escape symbol is "|"
[17:20:14][Step 2/2] ##teamcity[buildProblem description='..\..\..\services_package\Services\FaultsManager\CommonDef.h(32): warning:    Redundant code: Found a statement that begins with numeric constant.']

报告了第二个错误,但没有报告第一个错误。我认为这是因为第一个包含“channelID”,这会使解析器感到困惑。

如何让 TeamCity 很好地显示错误消息?显然,如果分析失败,我可以让它构建失败,但我希望概览页面显示有意义的数据 - 错误数量、新错误数量、错误列表等(类似于失败的测试)。

【问题讨论】:

【参考方案1】:

还有另一种可能性,我在my blog post in Russian 中写过。您可以使用Teamcity XML report processing 及其所有相关功能(“代码检查”选项卡、指标、自动更改跟踪),但您需要将 cppcheck 的 XML 输出转换为 Teamcity 可以理解的内容。我为此使用了 XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="UTF-8" indent="yes" method="xml"></xsl:output>
<xsl:template match="/">
  <checkstyle>
    <xsl:attribute name="version">
      <xsl:value-of select="results/cppcheck[@version]"/>
    </xsl:attribute>
    <xsl:for-each-group select="results/errors/error" group-by="(location/@file)[1]">
      <file>
        <xsl:attribute name="name">
          <xsl:value-of select="current-grouping-key()"/>
        </xsl:attribute>
        <xsl:for-each select="current-group()">
          <error line="(location/@line)[1]" message="@msg" severity="@severity" source="@id" />
        </xsl:for-each>
      </file>
    </xsl:for-each-group>
  </checkstyle>
</xsl:template>
</xsl:stylesheet>

生成 Checkstyle XML。它是这样使用的:

$ cppcheck --enable=all --xml --xml-version=2 . 2>cppcheck-report.xml
$ saxonb-xslt cppcheck-report.xml cppcheck-2-to-checkstyle.xslt >cppcheck-checkstyle.xml

处理生成的 XML 的 Teamcity 配置:

以这种方式集成 cppcheck 有一些优势(除了“代码检查”选项卡,它的界面比普通日志行更好),因为您可以更好地控制构建行为。使用“buildProblem”会导致构建失败,当您处理严格控制的小型干净代码库时,这可能没问题,但当您处理某种具有数千条警告的巨大遗留代码库时,情况肯定不是这样(修复所有这些都太昂贵了,而且 cppcheck 也有误报)。它允许您制定一些规则,例如“警告/错误计数器不应增加”并轻松捕获新问题,如下所示:

请注意,它使用“最新成功构建”作为参考点,这样如果有人修复了一些旧问题,您就有新的(较低的)引用计数,将与连续构建进行比较。

【讨论】:

对于某些错误,Cppcheck 会生成多个行/文件条目。这会导致多次报告相同的错误并连接行号,例如line="123 345"。我们通过将 XSLT 修改为仅使用每个错误的第一个条目来修复它:group-by="(location/@file)[1]"line="(location/@line)[1]" @AMA:我对此 XSLT 进行了一些修复,但我不太记得哪些修复了,这些天我根本没有使用 Teamcity,所以我很难检查任何东西与它有关。随意编辑帖子以修复它,我会批准更改。 完成(不需要批准,呵呵)【参考方案2】:

我最终编写了一个脚本来对输出进行后处理:http://blogs.microsoft.co.il/dinazil/2015/08/31/more-on-code-quality/

【讨论】:

如果您可以将主要见解从外部链接移到帖子中,以便将来可重复使用,那就太好了。 @Dina 现在链接失效了。

以上是关于TeamCity 和 cppcheck 输出模板的主要内容,如果未能解决你的问题,请参考以下文章

覆盖模板时 TeamCity 中的 VCS 标签

is_same 上的 Cppcheck 语法错误与模板

cppcheck 输出路径似乎错误

如何在 cppcheck 中抑制库代码的输出?

cppcheck 跳过 .hpp 文件

CPPCheck 在输出中打印无效字符