Чистим Java код используя SonarQube и PMD

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

В самом начале пути у многих новичков программистов есть много пробелов, даже в базовых вещах. Для выявления таких проблем существует бесплатное решение - SonarQube, которое позволяет довольно быстро обнаруживать множество ошибок и уязвимостей. Здесь мы разберемся, как воспользоваться этим инструментом.

Какие технологии помогают анализировать код на ошибки и уязвимости?

Существует несколько решений, которые позволяют проводить различные виды анализа, но чаще всего у них есть много общего. Популярные решения:

  • SonarQube

  • FindBugs

  • PMD

  • SpotBugs

  • Checkstyle

  • Snyk

  • JArchitect

  • Graudit

В данной статье мы рассмотрим SonarQube и PMD.

SonarQube настройка, установка, запуск.

SonarQube - довольно популярное решение, хотя, по моему мнению, изначальные правила проверок лучше немного перенастроить. SonarQube предоставляет бесплатную версию, которая может быть запущена из-под Docker в одну команду. Все, что вам потребуется, это сервер с 2 ГБ оперативной памяти (но чем больше, тем лучше). Как настраивать и арендовать сервер я писал вот тут.

Запускаем Sonar используя Docker.

Запускаем докер одной командой:

docker run -d --name sonarqube -p 9002:9000 -p 9092:9092 sonarqube

Первый логин проходит под admin/admin

После запуска следует подождать примерно пять минут и затем открыть ваш сервер. Первый вход потребует использования имени и пароля admin/admin, после чего система попросит изменить пароль. На данном этапе мы пропустим этот шаг.

Процесс создания проекта и генерации токена.

Существуют разные способы интеграции с SonarQube. Самый простой — интегрировать зависимость в Maven/Gradle вашего проекта и затем выполнить одну команду в командной консоли. Ниже я постараюсь упростить процесс генерации токена и проекта до шести команд:

6 шагов для генерации имени проекта, ключа и токена. Все они нужны для отправки вашего кода сонару

После выполнения всех 6 шагов у нас есть:

  • Имя проекта pikabu

  • Имя ключа pikabu

  • имя токена

Чтобы Sonar проводил более подробную аналитику, рекомендуется установить плагины. Для этого перейдите в раздел Administration => Marketplace и выберите плагины по вашему желанию:

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

Плагины имеют много общих правил и настроить профиль без пересечений это головная боль.

Настраиваем Maven и добавляем Sonar плагин.

Для настройки мавен проекта достаточно добавить плагин в pom.xml:

<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.9.1.2184</version>
</plugin>

Теперь мы готовы к анализу нашего кода.

Напишем код с наиболее популярными ошибками в Java.

Я приведу далеко не все классические ошибки, но для оценки базовой функциональности этого будет достаточно:

Несколько популярных ошибок среди триллиона возможных.

Все настроено. Погнали.

Если в файле pom.xml добавлен Sonar плагин, и имя проекта, ключ и токен готовы, после сборки проекта можно запустить команду для передачи результатов в SonarQube:

mvn sonar:sonar -Dsonar.projectKey=pikabu -Dsonar.projectName=pikabu -Dsonar.host.url=http://IP_СЕРВЕРА:9002 -Dsonar.login=sqp_4d542b25...

Анализируем результаты

После запуска заходим в проект (в моем случае pikabu) и нажимаем Overall Code

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

Я подключил слишком много правил поэтому среди найденных проблем есть дубликаты.

Результаты

  • Обнаружено 6 багов.

  • Покрытие составляет 0% (для более точного анализа покрытия, рекомендуется интегрировать Jococo плагин).

  • Выявлено 49 вонючих строк кода.

Поскольку я включил более 1000 правил (по умолчанию их всего 400), некоторые проблемы среди 49 являются просто дубликатами. Давайте рассмотрим самые важные, а именно баги:

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

Часть проблем была найдена, но не все.

В результате часть багов была отловлена, но некоторые например незакрытый стрим или итерация через итератор - нет.

Также можно выбрать файл и посмотреть всю аналитку:

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

Слишком много правил я выбрал, сонар не анализирует а уже душнит.

Какие выводы можно сделать?

С учетом того что сонар ставится без оплаты и лишь имеет ряд ограничений - утилита хороша. Среди вещей которые я бы отметил:

  • Сонар однозначно отлавливает много багов но не все.

  • Во много качество сонара определяется настроеными правилами (Quality profiles) которые затем и используются во время анализа. Подружить их все - довольно непросто.

  • Слишком большое количество правил руинит весь смысл анализа.

Двигаемся дальше. PMD анализатор кода.

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

бесплатный, опенсорный.

Sonar не является чем-то уникальным. Давайте рассмотрим другое бесплатное решение - PMD. Кстати, правила PMD могут быть скачены и запущены в Sonar, но с первой попытки у меня это не получилось из-за проблемы с соответствием версий PMD/SONAR/JAVA.

Ставим PMD

Чтобы поставить PMD достаточно скачать с их сайта pmd-dist-7.0.0-rc4-bin.zip и распаковать. Затем добавить в PATH bin папку и запусить команду:

>pmd check -d C:\cleancode -R rulesets/java/quickstart.xml -f html -r report.html

В команде C:\cleancode является папкой проекта где лежит ваш Java код. Результатом работы будет созданный report.html. Вот результаты его работы:

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

Коротко и по делу.

И так результаты PMD мне зашли. Он нашел почти все проблемы, часть которых Sonar пропустил (точнее тысяча правил которые я подключил из стандартных наборов).

Всем кому интересна разработка на Java и смежный мир технологий добро пожаловать в мой телеграм канал. Всем спасибоо за внимание.