Шаблон вывода TeamCity и cppcheck

Я запускаю cppcheck для своего кода в TeamCity и хочу сообщить об ошибках как о проблемах сборки. Поэтому я изменил формат вывода 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.']

О второй ошибке сообщается, а о первой нет. Я думаю, это потому, что первый содержит «идентификатор канала», и это сбивает синтаксический анализатор.

Как я могу заставить TeamCity красиво отображать сообщения об ошибках? Очевидно, я могу заставить его завершить сборку, если анализ не пройден, но я хочу, чтобы на странице обзора отображались значимые данные - количество ошибок, количество новых, список ошибок и т. д. (аналогично неудачным тестам).


person Dina    schedule 29.07.2015    source источник


Ответы (2)


Есть еще одна возможность, о которой я писал в своем блоге на русском языке. Вы можете использовать обработку XML-отчетов Teamcity и все связанные с ним функции ( вкладка «Проверка кода», метрики, автоматическое отслеживание изменений), но вам нужно преобразовать вывод XML cppcheck во что-то, понятное 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:

Настройка обработки XML-отчетов Teamcity

Интеграция cppcheck таким образом имеет некоторые преимущества (помимо вкладки «Проверка кода», которая просто имеет лучший интерфейс, чем обычная строка журнала), поскольку вы лучше контролируете поведение сборки. Используя «buildProblem», вы проваливаете сборку, и это, вероятно, нормально, когда вы имеете дело с жестко контролируемой небольшой чистой кодовой базой, но это точно не так, когда вы работаете с какой-то огромной устаревшей кодовой базой, имеющей тысячи предупреждений. (исправлять их все слишком дорого, а cppcheck тоже дает ложные срабатывания). Это позволяет вам создавать некоторые правила, такие как «счетчики предупреждений/ошибок не должны увеличиваться», и легко обнаруживать новые проблемы, например:

Настройка ошибки сборки Teamcity

Обратите внимание, что он использует «последнюю успешную сборку» в качестве точки отсчета, поэтому, если кто-то исправит какую-то старую проблему, у вас будет новый (меньший) счетчик ссылок, с которым будут сравниваться последующие сборки.

person Roman Khimov    schedule 19.09.2018
comment
Для некоторых ошибок Cppcheck создает несколько строк/файлов. Это приводит к тому, что одна и та же ошибка сообщается несколько раз, а номера строк объединяются, например, line="123 345". Мы исправили это, изменив XSLT, чтобы использовать только первую запись каждой ошибки: group-by="(location/@file)[1]", line="{(location/@line)[1]}". - person AMA; 31.10.2019
comment
@AMA: У меня были некоторые исправления для этого XSLT, но я не совсем помню, какие из них, и в эти дни я вообще не использую Teamcity, поэтому мне было бы трудно проверить что-либо, связанное с этим. Не стесняйтесь редактировать сообщение, чтобы исправить это, я одобрю изменения. - person Roman Khimov; 06.11.2019
comment
Готово (одобрение не требовалось, хе-хе) - person AMA; 06.11.2019

В итоге я написал скрипт, который выполняет пост-обработку вывода: http://blogs.microsoft.co.il/dinasil/2015/08/31/more-on-code-quality/

person Dina    schedule 22.11.2015
comment
Было бы здорово, если бы вы могли перенести основные идеи из внешней ссылки в пост, чтобы сохранить их воспроизводимость в будущем. - person AMA; 01.10.2019