В поддержку PVS-Studio часто поступают предложения от пользователей по улучшению продукта. Многие из них мы с радостью берёмся реализовывать. Одно из последних таких предложений было связано с доработкой утилиты автоматического оповещения разработчиков (Blame Notifier). Нас попросили научить ее извлекать дату/ревизию кода, на который анализатор выдал сообщение, с помощью blame информации из системы контроля версий. Такая доработка позволила расширить возможности утилиты, о которых мы и поговорим в этой статье.
Один из наших клиентов написал в поддержку о том, что у него есть необходимость различать предупреждения анализатора на свежие и найденные ранее. В переписке выяснилось, что ему нужно было сосредоточиться на предупреждениях на новый или только-только изменённый код. Мы поспешили сообщить, что это возможно осуществить при помощи SonarQube в связке с нашим плагином. Ответ клиента не заставил себя долго ждать. Он заметил, что пользоваться сторонним и достаточно массивным инструментом, таким как SonarQube, для этих целей нецелесообразно.
Так как у клиента большая кодовая база, мы предложили логически разделить использование статического анализатора на до и после внедрения статического анализа, временно подавив ранее найденные предупреждения при помощи нашего механизма подавления. После чего анализатор бы выдавал предупреждения только на новый или измененный код. И в дополнение к этому рассказали о внедрении Blame Notifier, чтобы сразу же оповещать всех причастных лиц о новых предупреждениях. Предложение заинтересовало клиента, но из-за того, что ему хотелось видеть в отчёте как старые, так и новые предупреждения, такой режим работы показался пользователю не очень удобным. Помимо этого, он дал обратную связь по Blame Notifier: "было бы круто, чтобы предупреждения в оповещениях были поинформативней, например добавить дату и номер ревизии".
И тут нас озарило. Ранее мы думали, что для более умного и информативного оповещения нужно создавать собственную базу данных. Отталкиваясь от неё, мы могли бы отслеживать жизненный цикл каждого предупреждения и, соответственно, определять, какие из них являются новыми. Но после замечания клиента мы пришли к выводу, что система контроля версий и есть та самая база данных, из которой можно получать всю необходимую актуальную информацию. Ведь через привязку к номерам ревизий коммитов мы можем вычислить и их привязку ко времени модификации соответствующих строк кода. Более того, мы уже достаём эту информацию через blame – осталось лишь воспользоваться ей.
Мы предложили клиенту следующий вариант:
На этом мы и сошлись!
Предназначение Blame Notifier – автоматизировать процесс оповещения разработчиков, на код которых выдал предупреждение PVS-Studio, например, после ночных сборок. Утилита позволяет формировать HTML-отчёт как для конкретного разработчика только с его предупреждениями, так и для супер-пользователя, который получает полный отчёт со всеми предупреждениями. Полный отчёт по умолчанию представляет собой сгруппированные предупреждения по разработчикам, а те, в свою очередь, отсортированы в алфавитном порядке. Такая функциональность крайне полезна, так как сразу же будет сигнализировать о новых срабатываниях анализатора всем заинтересованным лицам. Как можно догадаться из названия данной утилиты, она работает на основе blame информации, получаемой для проверяемых анализатором файлов из системы контроля версий пользователя.
Кто незнаком с данной утилитой, подробнее можно познакомиться с ней в этой статье.
Из blame информации, помимо имени разработчика, теперь извлекается дата и ревизия последнего изменения кода, на который ругается PVS-Studio. Дополнительная извлекаемая информация позволила нам добавить в утилиту новые опции:
Примечание. Извлечение даты/ревизии поддержано для следующих систем контроля версий: SVN, Git и Mercurial.
Формат HTML-отчёта утилиты по умолчанию выглядит следующим образом:
Новый HTML-отчёт, отсортированный по дате:
Новые опции позволяют имитировать поведение SonarQube, когда загружается отчёт анализатора при помощи 'sonar-scanner'. Об этом поподробней.
Примечание. Если вы уже используете PVS-Studio в связке с SonarQube, то описанное ниже применение будет для вас неактуальным, так как соответствующая обработка новых предупреждений в SonarQube уже встроена. А вот если вы используете PVS-Studio отдельно и нет возможности\желания воспользоваться SonarQube, то это может вас заинтересовать.
Начнем с того, что у SonarQube используется подход к качеству кода, называемый 'Clean as You Code'. Его суть в том, что разработчики должны уделять повышенное внимание надежности и безопасности нового кода, который был только-только добавлен или изменен. Старый код, который уже годами доказывает свою работоспособность в 'production', сместить на второй план и сосредоточиться на том, что происходит "сегодня", тем самым предотвращая появление новых проблем. А к давно существующим проблемам периодически возвращаться и исправлять. С этим подходом подробней можно ознакомиться в блоге разработчиков SonarQube.
Данный подход реализован следующим образом. На главной странице проекта есть выделенная область с новыми проблемами за настраиваемый промежуток времени. Для новых проблем настраивается 'Quality Gate', так называемый индикатор соответствия нового кода заданным пороговым метрикам. Например:
Например, каждое утро будет загружаться свежий отчёт анализатора, и если пороговое значение какой-либо метрики превышено, то 'Quality Gate' будет сигнализировать вам об этом.
Визуальное представление подхода 'Clean as You Code' интуитивно понятное. Вот пример, как это выглядит в SonarQube 7.9.4:
SonarQube – профессиональный инструмент, предоставляющий функциональность, которая позволяет удобно и эффективно контролировать качество программного продукта. Например:
Если SonarQube уже используется, то, чтобы интегрировать с ним результаты работы анализатора PVS-Studio, вам нужно ознакомиться со статьей.
А вот что делать, если вы ещё не используете SonarQube?
Если у вас есть возможность, то можно установить его, но для этого необходимо предварительно провести процедуру развёртывания, установки и первичной настройки SonarQube, что вполне может вызвать определенные трудности. Например, при:
Однако далеко не каждой команде разработчиков требуются все возможности, предоставляемые SonarQube. И поэтому долгая и достаточно трудозатратная процедура по развёртыванию и поддержанию работы данной системы вполне может оказаться избыточной.
И здесь-то как раз на помощь приходит наша утилита Blame Notifier. Она и раньше уже могла заместить часть возможностей SonarQube в области уведомления разработчиков. С новыми же возможностями утилиты теперь можно имитировать облегченную версию подхода 'Clean as You Code', где основной метрикой качества кода будет появление новых предупреждений анализатора. В таком режиме рассылка будет содержать предупреждения на код, дата изменения которого меньше N дней от даты текущего запуска утилиты.
Повторим поведение SonarQube. Для этого укажем 10 дней для опции '-d' и отсортируем предупреждения (-S) по дате изменения кода, вызвавшего предупреждение. В таком случае HTML-отчёт будет следующим:
Как видно, отчёт содержит 11 новых предупреждений за последние 10 дней. Выглядит практически так же, как и в SonarQube, но получить такую отчётность в разы легче.
У такого "облегченного" подхода, конечно, есть и свои недостатки:
Стоит также упомянуть, что использование утилиты Blame Notifier и PVS-Studio плагина для SonarQube доступно только в Enterprise лицензии PVS-Studio.
Внедрение технологии статического анализа в разработку подразумевает не только запуск анализатора и получение отчёта. Обычно рука об руку со статическим анализатором идут вспомогательные утилиты/плагины, использование которых позволяет легко и удобно поддерживать качество вашего кода.
Например, PVS-Studio имеет множество плагинов (для Visual Studio, SonarQube, Jenkins, Gradle/Maven/IntelliJ IDEA), утилиту для более удобной конвертации отчётов PlogConverter, утилиту оповещения разработчиков blame-notifier. Команда PVS-Studio, опираясь на свой опыт и на обратную связь пользователей, постоянно совершенствует свой продукт. Чтобы не пропустить все изменения и идти в ногу с инструментом, не забывайте следить за блогом на официальном сайте.
Новый режим работы Blame Notifier позволяет "легковесно" выполнять часть функционала, который раньше был доступен в нашем продукте только в связке с SonarQube. Однако, хочется ещё раз повторить – мы ни в коем случае не призываем отказываться от использования SonarQube. Новый режим позволяет лишь значительно проще попробовать такой подход к работе со статическим анализом. Мы верим, что для многих команд данный режим будет актуален.
Если у вас есть предложения по улучшению нашего продукта, не вздумайте откладывать это в долгий ящик и сразу же пишите нам.