Анализ кода с помощью SonarQube

1. Обзор

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

Давайте начнем с основного вопроса - зачем анализировать исходный код в первую очередь? Проще говоря, для обеспечения качества, надежности и ремонтопригодности в течение всего срока службы проекта; плохо написанная кодовая база всегда дороже в обслуживании.

Хорошо, теперь давайте начнем с загрузки последней версии LTS SonarQube со страницы download и настройки нашего локального сервера, как описано в этом https://docs.sonarqube org/display/SONAR/Начало работы за две минуты[краткое руководство пользователя].

2. Анализ исходного кода

,

Мы будем использовать токен позже при анализе наших проектов. Нам также нужно выбрать основной язык (Java) и технологию сборки проекта (Maven).

Давайте определим плагин в pom.xml :

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.sonarsource.scanner.maven</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
                <version>3.4.0.905</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

Последняя версия плагина доступна https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.sonarsource.scanner.maven%22%20AND%20a%3A%22sonar-maven -plugin% 22[здесь].

Теперь нам нужно выполнить эту команду из корня каталога нашего проекта, чтобы отсканировать ее:

mvn sonar:sonar -Dsonar.host.url=http://localhost:9000
  -Dsonar.login=the-generated-token

Нам нужно заменить the-генерированный-токен токеном сверху

  • Проект, который мы использовали в этой статье, доступен по адресу here .** .

Мы указали URL хоста сервера SonarQube и логин (сгенерированный токен) в качестве параметров для плагина Maven.

После выполнения команды результаты будут доступны на информационной панели Projects - по адресу http://localhost : 9000 .

Есть другие параметры, которые мы можем передать плагину Maven или даже установить из веб-интерфейса; _sonar.host . url, sonar.projectKey и sonar.sources_ являются обязательными, а другие необязательными.

Другие параметры анализа и их значения по умолчанию - https://docs.sonarqube.org/display/SONAR/Analysis Parameters[здесь].

Также обратите внимание, что у каждого языкового плагина есть правила для анализа совместимого исходного кода.

3. Результат анализа

Теперь, когда мы проанализировали наш первый проект, мы можем перейти к веб-интерфейсу по адресу http://localhost : 9000 и обновить страницу.

Там мы увидим сводку отчета:

ссылка:/uploads/9029390__overview-1024x123.jpg%201024w[]

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

Кроме того, проблемы могут иметь один из пяти уровней серьезности:

blocker ,ritical, major, minor и info. Прямо перед названием проекта находится значок, который отображает статус Quality Gate - пройден (зеленый) или не пройден (красный).

Нажав на название проекта, вы попадете на специальную панель инструментов, где мы сможем более подробно изучить проблемы, связанные с проектом.

Мы можем увидеть код проекта, действия и выполнить задачи администрирования на панели инструментов проекта - каждая из них доступна на отдельной вкладке.

Хотя есть глобальная вкладка Issues , вкладка Issues на панели инструментов проекта отображает проблемы, характерные только для данного проекта:

ссылка:/uploads/383732889__issues-1024x479.jpg%201024w[]

На вкладке «Проблемы» всегда отображаются категория, уровень серьезности, тег (ы) и рассчитанное усилие (относительно времени), которое потребуется для устранения проблемы.

На вкладке «Проблемы» можно назначить проблему другому пользователю, прокомментировать ее и изменить уровень серьезности. Нажатие на саму проблему покажет более подробную информацию о проблеме.

Вкладка выпуска содержит сложные фильтры слева. Это хорошо для точного определения проблем. Так как же узнать, достаточно ли кодовая база для развертывания в производство? Вот для чего нужны Quality Gate.

4. SonarQube Quality Gate

В этом разделе мы рассмотрим ключевую функцию SonarQube - Quality Gate. Затем мы увидим пример того, как настроить пользовательский.

4.1. Что такое ворота качества?

Quality Gate - это набор условий, которым должен соответствовать проект, прежде чем он сможет претендовать на выпуск продукции. Он отвечает на один вопрос: могу ли я отправить свой код в производство в его текущем состоянии или нет?

Обеспечение качества кода «нового» кода при исправлении существующих является одним из хороших способов поддерживать хорошую кодовую базу во времени. ,

Условия, заданные в контроле качества, по-прежнему влияют на неизмененные сегменты кода. Если мы сможем предотвратить возникновение новых проблем, со временем мы решим все проблемы.

Этот подход сопоставим с https://docs.sonarqube.org/display/SONAR/Fixing the Water Leak[устранение утечки воды]из источника. Это подводит нас к определенному термину - Период утечки. Это период между двумя анализами/версиями проекта .

Если мы повторно запустим анализ в том же проекте, вкладка обзора панели мониторинга проекта покажет результаты за период утечки:

ссылка:/uploads/36326789289 leak period-1024x470.jpg%201024w[]

В веб-интерфейсе на вкладке Quality Gates можно получить доступ ко всем заданным параметрам качества. По умолчанию SonarQube way предустановлен вместе с сервером.

Конфигурация по умолчанию для SonarQube way помечает код как сбойный, если:

  • покрытие по новому коду составляет менее 80%

  • процент повторяющихся строк в новом коде больше 3

  • ремонтопригодность, надежность или рейтинг безопасности хуже, чем у

С этим пониманием мы можем создать пользовательские ворота качества.

4.2. Добавление пользовательских ворот качества

Сначала нам нужно нажать на вкладку Quality Gates , а затем нажать кнопку Create , которая находится слева от страницы. Нам нужно дать ему имя - baeldung .

Теперь мы можем установить необходимые нам условия:

ссылка:/uploads/create-custom-gate-1-1024x411.png%201024w[]

  • Из раскрывающегося списка Add Condition выберите Blocker Issues ** ; он сразу же появится в списке условий.

Мы будем указывать больше чем как Operator, устанавливать ноль (0) для столбца Error и проверять столбец Over Leak Period :

ссылка:/uploads/create-custom-gate-2-1024x412.png%201024w[]

  • Затем мы нажмем кнопку Add , чтобы внести изменения ** . Давайте добавим еще одно условие, следуя той же процедуре, что и выше.

Мы выберем issues из раскрывающегося списка Add Condition _ и проверим столбец Over Leak Period_ .

Значение столбца O __perator будет установлено на « is меньше чем» , и мы добавим один (1) в качестве значения для столбца Error . Это означает, что если число проблем в добавленном новом коде меньше 1, отметьте Quality Gate как неуспешный .

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

  • Последний шаг, нам нужно прикрепить проект к нашим таможенным воротам качества.

Мы можем сделать это, прокрутив страницу вниз до раздела «Проекты». **

Там нам нужно нажать на Все, а затем отметить наш проект по выбору. Мы также можем установить его как ворота качества по умолчанию в верхнем правом углу страницы.

Мы снова просканируем исходный код проекта, как мы делали это раньше с помощью команды Maven. Когда это будет сделано, мы перейдем на вкладку проектов и обновим.

На этот раз проект не будет соответствовать критериям Quality Gate и потерпит неудачу. Зачем? Потому что в одном из наших правил мы указали, что он не должен работать, если нет новых проблем.

Давайте вернемся на вкладку «Качество» и изменим условие для issues на больше, чем . Нам нужно нажать кнопку обновления, чтобы применить это изменение.

Новое сканирование исходного кода пройдет на этот раз.

5. Интеграция SonarQube в CI

Сделать SonarQube частью процесса непрерывной интеграции возможно.

Это автоматически провалит сборку, если анализ кода не удовлетворяет условию Quality Gate.

Для достижения этой цели мы будем использовать SonarCloud , которая является облачной версией сервера SonaQube. Мы можем создать учетную запись here .

В разделе Моя учетная запись> Организации мы можем увидеть организационный ключ, и он обычно будет иметь вид xxxx-github или xxxx-bitbucket .

Также из My Account> Security мы можем сгенерировать токен, как мы это делали в локальном экземпляре сервера. Запишите и токен, и организационный ключ для последующего использования.

В этой статье мы будем использовать Travis CI и создадим аккаунт here с существующим профилем Github. Он загрузит все наши проекты, и мы можем включить любой из них, чтобы активировать Travis CI.

Нам нужно добавить токен, который мы сгенерировали в SonarCloud, в переменные среды Travis. Мы можем сделать это, нажав на проект, который мы активировали для CI.

Затем нажмите «Дополнительные параметры»> «Настройки», а затем прокрутите вниз до «Переменные среды»

ссылка:/uploads/travis-ci-1-768x167.png%20768w[]

Мы добавим новую запись с именем SONAR TOKEN__ и будем использовать сгенерированный токен в SonarCloud в качестве значения. Travis CI будет шифровать и скрывать его от общественности:

ссылка:/uploads/travis-ci-2-768x401.png%20768w[]

Наконец, нам нужно добавить файл .travis.yml в корень нашего проекта со следующим содержимым:

language: java
sudo: false
install: true
addons:
  sonarcloud:
    organization: "your__organization__key"
    token:
      secure: "$SONAR__TOKEN"
jdk:
  - oraclejdk8
script:
  - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.sonar/cache'

Не забудьте заменить ключ своей организации на ключ организации, описанный выше. Передача нового кода и отправка в репозиторий Github вызовет сборку Travis CI и, в свою очередь, также активирует сканирование гидролокатора.

6. Заключение

В этом руководстве мы рассмотрели, как настроить сервер SonarQube локально, и как использовать Quality Gate для определения критериев пригодности проекта для промышленного выпуска.

SonarQube documentation содержит больше информации о других аспектах платформы.