TeamCity和cppcheck输出模板

TeamCity和cppcheck输出模板,teamcity,cppcheck,Teamcity,Cppcheck,我在TeamCity中对我的代码运行cppcheck,并希望将其错误报告为构建问题。因此,我将cppcheck输出格式更改为 "##teamcity[buildProblem\tdescription='{file}({line}):\t{severity}:\t{message}']" 总的想法是可以的。但问题是,某些消息包含字符“并且这会导致解析输出时出错,因为TeamCity需要转义撇号。例如,下面是我的构建日志的摘录: [17:20:05][Step 2/2] Checking ..\

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

"##teamcity[buildProblem\tdescription='{file}({line}):\t{severity}:\t{message}']"
总的想法是可以的。但问题是,某些消息包含字符“并且这会导致解析输出时出错,因为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很好地显示错误消息?显然,如果分析失败,我可以让它使构建失败,但我希望概览页面显示有意义的数据——错误数量、新错误数量、错误列表等(类似于失败的测试)。

我最后编写了一个脚本,对输出进行后期处理:

还有另一种可能性,我在中写到过。您可以使用cppcheck及其所有相关功能(“代码检查”选项卡、度量、自动更改跟踪),但您需要将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>
Teamcity配置以处理生成的XML:

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

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


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

如果您可以将主要见解从外部链接移到文章中,以便在将来保持其可复制性,那就太好了。对于某些错误,Cppcheck会生成多个行/文件条目。这会导致多次报告相同的错误,并导致连接行号,例如,
line=“123 345”
。我们通过修改XSLT来修复它,只使用每个错误的第一个条目:
groupby=“(location/@file)[1]”
line=“{(location/@line)[1]}”
@AMA:我对这个XSLT做了一些修复,但我不太记得是哪一个,而且这些天我根本没有使用Teamcity,所以我很难检查与之相关的任何东西。请随意编辑帖子以修复它,我会批准更改。完成(不需要批准,呵呵)