TeamCity和cppcheck输出模板

时间:2015-07-29 05:41:51

标签: teamcity cppcheck

我在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很好地显示错误消息?显然,如果分析失败,我可以让它失败,但我希望概述页面显示有意义的数据 - 错误数量,新数量,错误列表等等(类似于失败的测试)。

2 个答案:

答案 0 :(得分: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">
      <file>
        <xsl:attribute name="name">
          <xsl:value-of select="current-grouping-key()"/>
        </xsl:attribute>
        <xsl:for-each select="current-group()">
          <error line="{location/@line}" 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 XML report processing setup

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

Teamcity build failure setup

请注意,它使用“最新成功构建”作为参考点,因此,如果某人解决了一些老问题,您将获得新的(较低的)参考计数,以与后续构建进行比较。

答案 1 :(得分:0)

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