РАЗРАБОТКА

Анализ и измерение качества программного кода с помощью SonarQube

Павел Зуев
Технический директор
Случается, что разработчикам не хватает опыта, квалификации или сроков, чтобы вовремя предоставить заказчику необходимый функционал. Поэтому они могут идти на компромисс с качеством, а это приводит к неоптимальному коду и потенциальным ошибкам.
Чтобы повысить качество кода, мы используем инструмент для автоматической проверки и анализа программной части — SonarQube.

Что такое SonarQube и зачем он нужен

SonarQube — это инструмент для непрерывного статистического анализа и измерения качества программного кода, который поддерживает множество языков программирования.
Платформа использует различные готовые инструменты, но результаты сводит в единую информационную панель — дашборд и ведет историю прогонов, тем самым позволяя в динамике увидеть тенденции изменения качества кода.
Что такое SonarQube и зачем он нужен
Дашборд на главной
Зачем анализировать и измерять качество кода?
  • чтобы улучшить общее качество кода;
  • предотвратить уязвимости и исправить ошибки;
  • повысить стабильность и безопасность проекта;
  • снизить влияние человеческого фактора.
Инструмент позволяет анализировать код на некачественное оформление, наличие ошибок и багов, находить возможные проблемы.
Самые распространенные проблемы:
  1. Дублирование кода.
  2. Текущие и потенциальные баги.
  3. Нарушение стандартов кодирования.
  4. Недостаточное покрытие кода модульными тестами.
  5. Слишком большое или малое количество комментариев.
  6. Плохо спроектированный и слабо структурированный код, запутанный и сложный для понимания — спагетти-код.
Кроме того, важная функция инструмента — поиск уязвимостей программного обеспечения, самые распространенные из которых.
  • Инъекции.
  • Небезопасная конфигурация.
  • Межсайтовый скриптинг — XSS.
  • Недочеты системы аутентификации и хранения сессий.
  • Небезопасные прямые ссылки на объекты.
  • Незащищенность критичных данных.
  • Отсутствие функций контроля доступа.
  • Межсайтовая подделка запроса.
  • Использование компонентов с известными уязвимостями.
  • Непроверенные переадресации и пересылки.
SonarQube позволяет разработчикам писать более безопасный и чистый код. Благодаря непрерывному контролю, сервис дает возможность оперативно анализировать ветви кода и обнаруживать некачественные участки.

Принципы работы платформы

Основа модели качества SonarQube — это реализация методологии SQALE — Software Quality Assessment based on Lifecycle Expectations, с определенными дополнениями.
SonarQube модифицировали модель качества и создали собственную — Quality Gate SonarQube.
Согласно ей, код успешно прошел контроль, если получил следующие метрики:
  • 0 новых багов;
  • 0 новых уязвимостей
  • покрытие нового кода проверками не ниже 80%;
  • коэффициент технического долга на новом коде <= 5%.
Принципы работы платформы SonarQube
Пример успешного прохождения проверки
Модель качества кода SonarQube делает упор на нескольких важных моментах:
  1. Модель качества должна быть максимально проста в использовании.
  2. Уязвимости и баги не должны теряться среди проблем сложности поддержки.
  3. Если в коде есть серьезные баги и уязвимости, то требования к качеству не выполнены.
  4. Проблемы поддержки кода также важны, и их нельзя игнорировать.
  5. Необходимо выполнять вычисление стоимости устранения проблем.

Что умеет SonarQube

Поддерживает языки программирования: Java, C Sharp, JavaScript/TypeScript, AWS CloudFormation, Terraform, Docker, Kubernetes, Kotlin, Ruby, Go, Scala, Flex, Python, PHP, HTML, CSS, XML, Visual Basic .NET, C, C++, Objective-C, Swift, ABAP, Transact-SQL и PL/SQL, Cobol, PL/I, Apex, RPG и Visual Basic 6.
Языки программирования SonarQube
Языки программирования
Также платформа поддерживает анализ кода и поиск ошибок на базе стандартов программирования CERT Secure Coding Standards, MISRA C, MISRA C++ и MITRE/CWE. Кроме того, распознает ошибки из списков OWASP Топ-10 и CWE/SANS Топ-25 ошибок программирования.
SonarQube измеряет качество кода по семи показателям качества программного обеспечения и соответствующим метрикам, которые в разработке называют Seven Axes of Quality.
  1. Архитектура и проектирование.
  2. Стиль программирования.
  3. Потенциальные ошибки.
  4. Повторения участков кода.
  5. Сложность.
  6. Комментарии.
  7. Тесты.
Оценивает код по следующим метрикам:
  • Issues — ошибки.
  • Reliability — надежность.
  • Security — безопасность.
  • Maintainability — поддерживаемость.
  • Coverage — покрытие тестами.
  • Duplications — дублирование.
  • Size — размер базы кода.
  • Complexity — цикломатическая сложность.
  • Documentation — документирование кода.
За счет такого подхода тесты оцениваются не только с точки зрения успешности исполнения, но и по покрытию исходного кода.
Особенности:
  • Оценивает качество кода в режиме реального времени.
  • Поддерживает +30 языков программирования.
  • Составляет отчеты о безопасности.
  • Выявляет ошибки, которые трудно обнаружить.
  • Обладает высокой степенью интеграции с продукцией DevOps.
  • Имеет настраиваемый механизм анализа SAST.
  • Предоставляет отчет о безопасности OWASP/SANS.
Специальный плагин SonarQube измеряет качество в соответствии с концепцией технического долга — technical debt, который вычисляется в человеко-днях, долларах, а также процентах по типам показателей.

В чем польза для разработчиков

  • Обеспечивает интеграцию с внешними инструментами, такими как JIRA, Mantis, LDAP, Fortify и другими.
  • Собирает и хранит историю отслеживаемых метрик и строит график их изменения, что позволяет отслеживать показатели в динамике.
  • Предоставляет отчеты о соблюдении стандартов кодирования, дублирования, покрытия модульными тестами, подсвечивает возможные ошибки, показывает плотность комментариев в коде и отображает технический долг.
  • Позволяет интегрироваться с такими IDE, как Visual Studio, IntelliJ IDEA и Eclipse с помощью плагина SonarLint.
  • Для оценки технического долга применяет методологию SQALE.
  • Обеспечивает полностью автоматизированный анализ с Ant, Maven, Gradle и другими распространенными системами непрерывной интеграции.
  • С помощью встроенных плагинов можно добавить поддержку Git, SVN, Mercurial, Team Foundation Version Control, ClearCase, настроить авторизацию через LDAP, GitHub, Bitbucket, Azure Active Directory, импортировать результаты работы сторонних анализаторов.

Что дает проекту

1. Устойчивость программной части проекта.
Позволяет снизить сложность кода, сократить возможные уязвимости и дублирование участков кода, тем самым оптимизирует программную часть.
2. Повышение производительности.
Позволяет сократить временные затраты на изменение кода, обслуживание и поиск рисков приложения.
3. Качественный код.
Контроль качества кода — обязательный процесс разработки, который гарантирует работоспособность проекта.
4. Поиск и исправление ошибок.
Находит ошибки и выдает автоматические предупреждения для разработчиков перед отправкой данных на вывод.
5. Повышение согласованности.
Определяет, где нарушаются критерии качества кода, и сообщает об этом, благодаря чему команда разработки может работать более согласованно.
6. Масштабирование проекта.
С помощью сервиса можно обслуживать любое количество проектов.
7. Повышение квалификации разработчиков.
Регулярные оценки качества кода помогают разработчикам избегать типовых ошибок и писать более чистый код.

Когда стоит внедрять SonarQube

Внедрение платформы SonarQube оправдано на крупных проектах, которые требуют значительных ресурсов и имеют продолжительный жизненный цикл. Причем внедрение инструмента принесет пользу на любом этапе развития проекта.
Оптимальным подходом будет внедрение SonarQube на ранних этапах, что позволит команде с самого начала контролировать качество кода, и быть уверенными, что они соблюдают заданные стандарты качества.
Внедрение на более поздних этапах может вылиться в значительные затраты, если выяснится информация о большом количестве ошибок, размере технического долга, отсутствии покрытия тестами и т. д.

Функциональные возможности

Главная

Здесь отображается список проектов с краткой статистикой: дата последнего анализа, версия сборки, количество строк кода, багов, уязвимостей и признаков плохого кода.
Главная SonarQube
Интерфейс главной страницы

Метрики проекта

Здесь представлена информация о метриках кода: надежности, безопасности, поддерживаемости, покрытии тестами, дублировании, цикломатической сложности, ошибках и документировании кода.
Метрики проекта SonarQube
Метрики проекта

Reliability — надежность

Здесь сообщается об общем количестве и новых багах, которые были обнаружены во время последнего анализа, а также рейтинг от A до E, где E — это худшая оценка, которая говорит о том, что был найден хотя бы один блокирующий баг.
Также указывается время, которое необходимо на устранение всех найденных ошибок.
Метрики надежности кода SonarQube
Метрики надежности кода

Security — безопасность

Здесь доступна информация об общем количестве и новых уязвимостях, рейтинге безопасности и времени, которое понадобится для устранения проблем.
Показатели безопасности SonarQube
Показатели безопасности

Maintainability — поддерживаемость

Эта вкладка содержит информацию о техническом долге в проекте.
Размер технического долга по проекту SonarQube
Размер технического долга по проекту

Coverage — покрытие тестами

Здесь представлена информация о покрытии кода тестами.
Объем покрытия кода тестами SonarQube
Объем покрытия кода тестами

Duplications — дублирование

Страница содержит информацию о дублировании кода в проекте. С помощью этой метрики можно легко обнаружить повторяющиеся строки, блоки кода и даже целые файлы.
Объем дублирования в коде SonarQube
Объем дублирования в коде

Size — размер базы кода

Страница содержит информацию о размере проекта: количестве строк кода, выражений, функций, классов, файлов и директорий.
Количество строк кода на проекте SonarQube
Количество строк кода на проекте

Complexity — цикломатическая сложность

Здесь представлена информация о суммарной цикломатической сложности проекта, а также о средней сложности функций и файлов.
Показатель цикломатической сложности SonarQube
Показатель цикломатической сложности

Documentation — документирование кода

Страница предоставляет информацию о комментариях в коде: отношение строк с комментариями к общему количеству строк в проекте, количество строк с комментариями, количество публичных API и уровень документирования публичных API.
Данные о документировании SonarQube
Данные о документировании

Issues — ошибки

Вкладка содержит общее количество найденных проблем в коде (сумма количества багов, уязвимостей и code smells), а также распределение проблем по состоянию: открытые, переоткрытые, подтвержденные, ложные срабатывания и won't fix — статус для ошибок, которые не будут исправляться в силу различных причин.
Количество ошибок SonarQube
Количество ошибок

Навигация по коду и ошибкам

В разделе Issues представлены все найденные проблемы в коде с широкими возможностями для фильтрации. Это позволяет определить приоритеты и сфокусироваться на важных проблемах.
Навигация по коду и ошибкам SonarQube
Список важных ошибок
Дважды кликнув на сообщение, можно перейти к участку кода, где была найдена ошибка. Также есть детальное описание ошибки и рекомендация, как ее исправить.
Рекомендации по исправлению ошибок SonarQube
Рекомендации по исправлению ошибок
Благодаря интеграции с системами контроля версий можно увидеть, кто и когда внес изменения в код, которые вызвали срабатывание анализатора.
Автор бага и дата изменения SonarQube
Автор бага и дата изменения
Интеграция с системами контроля версий также позволяет автоматически назначать баги на тех разработчиков, которые их допустили. Также баги можно назначать вручную и изменять их тип, важность, добавлять теги и комментарии.

Как мы проводим анализ качества кода на SonarQube

Этапы анализа

  1. Создание копии кода.
  2. Развертывание на нашем сервере и добавление сайта в GIT.
  3. Добавление сайта в SonarQube.
  4. Тестирование по метрикам качества кода.
  5. Анализ полученной информации.
  6. Создание отчетов.
Срок проверки и анализа качества программного кода — 10 часов отдела разработки.

Этапы проверки кода

Контролем качества кода занимается тимлид проекта.
  1. Проводит анализ проекта и периодическую полную проверку.
  2. Просматривает критичные ошибки, при необходимости составляет отчет для менеджера проекта (клиента) для согласования работ по исправлению.
  3. Вносит предложения по настройке общих и правил на конкретном проекте.
  4. Перед переносом изменений на продуктивный сервер проверяет пулл-реквест, который ранее разработчик должен был проверить на наличие ошибок, принимает решение о переносе или исправлении ошибок.
  5. Принимает решение по спорным ситуациям в случае появления нестандартных или спорных ошибок при проверке.

Настройка проекта в SonarQube

Настройка SonarQube начинается с создания главной ветки, относительно которой будет происходить расчет изменений в коде, она называется master.
Главная ветка в проекте SonarQube
Главная ветка в проекте
Затем необходимо выдать права пользователям, которые будут иметь доступ к проекту.
Следующим шагом необходимо настроить профили качества quality profile — наборы правил для используемых языков в проекте. По этим правилам проводится анализ кода и определяется приоритет ошибок. Например, такими могут быть уязвимости безопасности или баги.
Набор ошибок SonarQube
Набор ошибок
Также есть категория code smell — небольшие огрехи, которые относятся к культуре кода и его оформлению.
В целом настройка профилей качества не является обязательной, поскольку SonarQube самостоятельно определяет языки программирования после первой проверки и для каждого из них назначает профиль качества по умолчанию, который можно отредактировать.
Следующим шагом нужно настроить границы качества, quality gate — пороговые значения метрик проекта.
По умолчанию границы качества имеют следующие значения:
  • coverage, покрытие тестами — не менее 80%;
  • duplicate lines, дублирование кода — не более 3%;
  • maintainability, рейтинг поддерживаемости — не ниже класса A;
  • security, безопасность — не ниже класса A;
  • reliability, надежность — не ниже класса A.
Если после проведения анализа хотя бы одна метрика не соответствует указанным значениям, то весь код считается неподходящим для развертывания. Так же как и с профилями, границы качества можно изменять или задавать собственные значения пороговых метрик для отдельных проектов.
Границы качества кода SonarQube
Границы качества кода

Процесс проверки кода на качество в SonarQube

Мы работаем с платформой SonarQube через GitLab.
Мы работаем с платформой SonarQube через GitLab
В интерфейсе платформы доступны проекты, на которых уже внедрен SonarQube, а на первом экране дашборд с основной информацией.
Основной дашборд SonarQube
Основной дашборд
Запускаем проверку.
Запуск проверки в SonarQube
Запуск проверки в SonarQube
Получаем результат.
Список ошибок и уязвимостей SonarQube
Список ошибок и уязвимостей
В логах выводится ссылка на результаты текущей проверки.
В логах выводится ссылка на результаты текущей проверки. SonarQube
После проверки создается перечень ошибок и уязвимостей
После повторного сканирования добавятся общие отличия от текущей версии: «Новый код→ Весь код».
Результаты повторной проверки SonarQube
Результаты повторной проверки
Выводятся замечания с различными фильтрами по типам, критичности и т. д.
Список замечаний SonarQube
Список замечаний
Для просмотра замечания нужно выбрать его из списка
Выбранное замечание SonarQube
Выбранное замечание
Замечания устраняются до тех пор, пока не будет достигнут порог качества.
Результат доработки кода SonarQube
Результат доработки кода

Профили качества

Мы специализируемся на интернет-магазинах на «Битрикс», поэтому, чтобы ускорить и упростить себе работу, создали четыре типовых профиля качества, которые используются на проектах по умолчанию:
  1. CSS_BITRIX.
  2. HTML_BITRIX.
  3. JavaScript_BITRIX.
  4. PHP_BITRIX.
Согласно профилям, на проекте проверяется качество кода в CSS, HTML, JavaScript и PHP.
Профили для «Битрикс» SonarQube
Профили для «Битрикс»
Изменения в данные профили вносятся только по согласованию с Техническим директором.
При необходимости мы создаем свои профили качества для отдельных проектов. Для этого необходимо скопировать профиль либо из профиля по умолчанию, либо из профиля для «1С-Битрикс».
Профили качества для проверки кода на отдельных проектах SonarQube
Профили качества для проверки кода на отдельных проектах
В профиле качества можно отключать правила и изменять критичность ошибки.
Отредактированный профиль SonarQube
Отредактированный профиль

Проверка пулл-реквеста

После создания пулл-реквеста доступен пайплайн с проверкой кода, для запуска проверки необходимо в него перейти и запустить вручную.
Запуск проверки SonarQube
Запуск проверки
После проверки будет доступна ссылка на просмотр результатов.
Ссылка на результаты проверки SonarQube
Ссылка на результаты проверки
После перехода по ссылке отобразится результат проверки.
Результат проверки — пройдена SonarQube
Результат проверки — пройдена

Какие результаты получит заказчик

1. По итогам анализа вы получите текстовый документ, который содержит:
  • количественные и качественные данные, собранные в процессе анализа;
  • выводы и рекомендации на основе полученных данных.
2. Сформируете целостную картину проблем в качестве кода.
3. Поймете, за счет каких действий:
  • улучшить качество кода;
  • предотвратить уязвимости;
  • повысить уровень безопасности и стабильности проекта;
  • снизить влияние человеческого фактора.
Чтобы избежать проблем в коде, разработчики должны следовать практике качественного кодирования. Поэтому, чтобы обеспечить непрерывную интеграцию и развертывание, специалистам нужен инструмент, который отслеживает и контролирует код для высокого качества программной части.
Получайте полезный контент от KISLOROD в любой из мессенджеров
При переходе в одну из указанных социальных сетей, вы автоматически соглашаетесь с политикой конфиденциальности
Спасибо, что дочитали до конца.
Если информация была полезна, поделитесь статьёй. Вам не сложно, нам приятно ;)

Рекомендованные статьи

Скачайте 17 точек роста и 100 + чекеров для роста конверсии и прибыли интернет-магазина
При переходе в одну из указанных социальных сетей, вы автоматически соглашаетесь с политикой конфиденциальности
Мы проанализировали ведущие интернет-магазины, результаты исследований, свой опыт и собрали важные моменты в одно руководство. Делаем e-commerce лучше, поэтому не только пользуемся сами, но и делимся с вами.
Выберите удобный мессенджер и получите чек-лист прямо сейчас: