TeamCity 和 cppcheck 输出模板

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

最佳答案

还有另一种可能性,我在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

Teamcity 配置来处理生成的 XML:

Teamcity XML report processing setup

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

Teamcity build failure setup

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

关于TeamCity 和 cppcheck 输出模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31692012/

相关文章:

teamcity - 在系统帐户和用户帐户下运行有什么区别?

docker - 无法连接到AWS中TeamCity构建代理上的Docker守护程序

xcode - 如何在 Xcode 中显示 cppcheck 输出?

c++ - cppcheck : possible null point dereference

c++ - 收到错误 "scanf without field width limits can crash with huge input data on some versions of libc"

git - 强制执行代码审查并保持集成分支原始状态的工作流(git、Stash、TeamCity)

c# - TeamCity 和 Selenium WebDriver

asp.net-mvc-3 - 在 TeamCity 中构建时找不到 CompareAttribute(在 Windows Server 2012 RC 上)

c++ - 为 cppcheck 编写自定义规则

c++ - 资源泄漏 : fExclfile