Контроль качества кода с помощью SonarQube в Ubuntu 16.04

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

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

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

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

Требования

1: Подготовка к установке

Перед установкой SonarQube нужно сделать несколько подготовительных шагов. Поскольку SonarQube – это Java-приложение, оно будет работать как сервис; а запускать сервисы в качестве пользователя root, безусловно, не лучшая идея. Потому нужно создать другого системного пользователя специально для запуска сервиса SonarQube. Затем мы создадим каталог для установки и настроим доступ к нему, а затем создадим базу данных MySQL и пользователя для SonarQube.

Итак, создайте пользователя sonarqube:

sudo adduser --system --no-create-home --group --disabled-login sonarqube

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

Затем создайте каталог, в котором будут храниться файлы SonarQube:

sudo mkdir /opt/sonarqube

После этого обновите привилегии, чтобы пользователь sonarqube мог читать и изменять файлы в этом каталоге:

sudo chown -R sonarqube:sonarqube /opt/sonarqube

Релизы SonarQube упакованы в ZIP-формате. Установите утилиту unzip с помощью менеджера пакетов, чтобы извлечь файлы дистрибутива:

sudo apt-get install unzip

Далее нужно создать базу данных и учетные данные, которые будет использовать SonarQube. Войдите на сервер MySQL как root:

mysql -u root -p

Создайте БД для SonarQube:

CREATE DATABASE sonarqube;
EXIT;

Теперь создайте учетные данные, которые SonarQube сможет использовать для доступа к БД.

CREATE USER sonarqube@'localhost' IDENTIFIED BY 'some_secure_password';
GRANT ALL ON sonarqube.* to sonarqube@'localhost';

Затем предоставьте пользователю права, чтобы он мог вносить изменения в базу данных SonarQube:

GRANT ALL ON sonarqube.* to sonarqube@'localhost';

Сбросьте привилегии и выйдите из консоли MySQL:

FLUSH PRIVILEGES;
EXIT;

2: Загрузка и установка SonarQube

Из текущего каталога перейдите в каталог для SonarQube:

cd /opt/sonarqube

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

Получив ссылку, скачайте файл:

sudo wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-7.0.zip

Распакуйте его:

sudo unzip sonarqube-7.0.zip

После распаковки файлов удалите загруженный zip-файл, так как он вам больше не нужен:

sudo rm sonarqube-7.0.zip

Теперь, когда все файлы на месте, пришло время настроить SonarQube.

3: Настройка сервера SonarQube

В конфигурационном файле SonarQube нужно отредактировать несколько моментов. А именно:

  • нужно указать имя пользователя и пароль, который сервер SonarQube будет использовать для подключения к базе данных.
  • настроить SonarQube для использования MySQL в качестве базы данных.
  • запускать SonarQube в режиме сервера, что приведет к повышению производительности.
  • настроить SonarQube для прослушивания только адреса локальной сети (мы будем использовать обратный прокси-сервер).

Откройте конфигурации SonarQube:

sudo nano sonarqube-7.0/conf/sonar.properties

Сначала укажите имя пользователя и пароль, которые SonarQube будет использовать для доступа к базе данных (их вы создали для доступа к MySQL):

...
sonar.jdbc.username=sonarqube
sonar.jdbc.password=some_secure_password
...

Затем настройте SonarQube для поддержки БД MySQL:

...
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
...

Теперь включите запуск SonarQube в режиме сервера и настройте для прослушивания только локальной сети:

...
sonar.web.host=127.0.0.1
sonar.web.javaAdditionalOpts=-server

Обновив эти поля, сохраните и закройте файл.

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

Создайте сервис-файл:

sudo nano /etc/systemd/system/sonarqube.service

Добавьте в файл следующее содержимое, которое определяет, как будет запускаться и останавливаться сервис SonarQube:

[Unit]
Description=SonarQube service
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh stop
User=sonarqube
Group=sonarqube
Restart=always
[Install]
WantedBy=multi-user.target

Читайте также: Управление сервисами и юнитами Systemd с помощью Systemctl

Сохраните и закройте файл, а затем запустите сервис SonarQube:

sudo service sonarqube start

Проверьте состояние сервиса SonarQube, чтобы убедиться, что он запущен и работает должным образом:

service sonarqube status

Если сервис был успешно запущен, вы увидите строку «Active»:

sonarqube.service - SonarQube service
Loaded: loaded (/etc/systemd/system/sonarqube.service; enabled; vendor preset
Active: active (running) since Sun 2018-03-04 01:29:44 UTC; 1 months 14 days

Затем добавьте сервис SonarQube в автозагрузку:

sudo systemctl enable sonarqube

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

4: Настройка обратного прокси-сервера

Теперь, когда у вас есть запущенный сервер SonarQube, пришло время настроить Nginx, который будет обратным прокси для экземпляра SonarQube.

Сначала создайте новый конфигурационный файл Nginx для данного сайта:

sudo nano /etc/nginx/sites-enabled/sonarqube

Добавьте в файл эту конфигурацию, чтобы Nginx мог направлять входящий трафик на SonarQube:

server {
listen 80;
server_name sonarqube.example.com;
location / {
proxy_pass http://127.0.0.1:9000;
}
}

Сохраните и закройте файл.

Проверьте ошибки в файле:

sudo nginx -t

Если вы видите ошибки, исправьте их и повторите проверку. Когда ошибок не будет, перезапустите прокси-сервер:

sudo service nginx restart

В качестве быстрого теста вы можете посетить http://sonarqube.example.com в веб-браузере. Вас встретит веб-интерфейс SonarQube.

Теперь нужно использовать Let’s Encrypt для создания HTTPS-сертификатов, чтобы данные между сервером и вашим локальным компьютером передавались по зашифрованному каналу. Используйте certbot , чтобы получить сертификат для Nginx:

sudo certbot --nginx -d sonarqube.example.com

Если вы впервые запрашиваете сертификат Let’s Encrypt, Certbot запросит ваш адрес электронной почты и соглашение EULA. Введите адрес электронной почты и примите лицензионное соглашение.

Затем Certbot спросит, как настроить параметры безопасности. Выберите опцию, которая перенаправит все запросы в HTTPS (тогда любые запросы, отправленные на ваш сервер, будут зашифрованы).

Завершив настройку обратного прокси-сервера, вы можете перейти к защите сервера SonarQube.

5: Защита SonarQube

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

Для начала посетите URL вашей установки и войдите в систему, используя учетные данные по умолчанию.

После входа в систему нажмите вкладку Administration, в выпадающем списке выберите Security и нажмите Users.

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

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

Затем создайте токен для пользователя, нажав кнопку в столбце Tokens и присвоив этому токену имя. Он понадобится вам позже при запуске сканера кода, поэтому обязательно сохраните его в безопасном месте.

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

6: Настройка сканера кода

Сканер кода SonarQube – это отдельный пакет, который вы можете установить на другой компьютер (на котором не запущен сервер SonarQube), например, на вашей локальной машине разработки или на сервере непрерывной доставки. Для Windows, MacOS и Linux доступны пакеты, которые вы можете найти на веб-сайте SonarQube.

В этом мануале мы установим сканер кода на тот же сервер, на котором находится сервер SonarQube.

Для начала создайте каталог для сканера и перейдите в него:

sudo mkdir /opt/sonarscanner
cd /opt/sonarscanner

Загрузите сканер SonarQube для Linux:

sudo wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip

Распакуйте сканер, затем удалите архив zip:

sudo unzip sonar-scanner-cli-3.0.3.778-linux.zip
sudo rm sonar-scanner-cli-3.0.3.778-linux.zip

После этого нужно изменить некоторые настройки, чтобы сканер мог взаимодействовать с сервером. Откройте файл конфигурации:

sudo nano sonar-scanner-3.0.3.778-linux/conf/sonar-scanner.properties

Для начала определите, куда сканеру следует отправлять результаты анализа кода. Раскомментируйте строку, начинающуюся с sonar.host.url, и установите URL-адрес сервера SonarQube:

sonar.host.url=https://sonarqube.example.com

Сохраните и закройте файл. Сделайте бинарный файл сканера исполняемым:

sudo chmod +x sonar-scanner-3.0.3.778-linux/bin/sonar-scanner

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

sudo ln -s /opt/sonarscanner/sonar-scanner-3.0.3.778-linux/bin/sonar-scanner /usr/local/bin/sonar-scanner

Теперь можно запустить первое сканирование кода.

7: Тестовое сканирование

Если вы хотите просто поэкспериментировать с SonarQube, чтобы посмотреть, на что он способен, вы можете запустить тестовое сканирование на образцах проектов SonarQube. Это созданные командой SonarQube примеры проектов, которые содержат много проблем, и SonarQube должен их обнаружить и сообщить о них в отчете.

Создайте новый рабочий каталог в домашнем каталоге, затем перейдите в него:

cd ~
mkdir sonar-test && cd sonar-test

Загрузите образец:

wget https://github.com/SonarSource/sonar-scanning-examples/archive/master.zip

Распакуйте архив и удалите файл:

unzip master.zip
rm master.zip

Перейдите в каталог образца проекта:

cd sonar-scanning-examples-master/sonarqube-scanner

Запустите сканер, указав свой токен, который вы создали ранее:

sonar-scanner -D sonar.login=your_token_here

В результате в консоли вы увидите примерно такой вывод:

INFO: Task total time: 9.834 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 14.076s
INFO: Final Memory: 47M/112M
INFO: ------------------------------------------------------------------------

Отчет о сканировании проекта будет на панели инструментов SonarQube.

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

Перенесите свой проект на сервер или выполните шаги, описанные в разделе 6 (чтобы установить и настроить сканер SonarQube на рабочей станции и настроить его так, чтобы он указывал на сервер SonarQube).

Затем в root каталоге проекта создайте конфигурационный файл SonarQube:

nano sonar-project.properties

Используйте этот файл, чтобы сообщить SonarQube несколько вещей о вашем проекте.

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

# Unique ID for this project
sonar.projectKey=foobar:hello-world
...

Затем укажите имя и версию проекта, чтобы SonarQube мог отобразить эту информацию в панели:

...
sonar.projectName=Hello World Project
sonar.projectVersion=1.0
...

Теперь укажите расположение, где SonarQube будет искать файлы кода. Обратите внимание, что это относится к каталогу, в котором находится файл конфигурации. Установите такой путь:

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
sonar.sources=.

Сохраните и закройте файл.

Теперь можно запустить анализ качества кода. Запустите sonar-scanner и укажите свой токен:

sonar-scanner -D sonar.login=your_token_here

Вы увидите такой результат:

INFO: Task total time: 5.417 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 9.659s
INFO: Final Memory: 39M/112M
INFO: ------------------------------------------------------------------------

Отчет о коде проекта будет в панели SonarQube.

Заключение

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

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

Tags: , ,