Контроль качества кода с помощью SonarQube в Ubuntu 16.04
Java, Ubuntu | Комментировать запись
Качество кода – это приблизительный показатель того, насколько полезен конкретный фрагмент кода и возможно ли его поддерживать. Качественный код облегчает задачу поддержки и расширения приложения. Контроль качества кода позволяет уменьшить количество ошибок при внесении изменений в будущем.
SonarQube – это инструмент с открытым исходным кодом, который анализирует качество кода и составляет отчеты. Он сканирует ваш исходный код в поисках потенциальных ошибок, уязвимостей и проблем с поддержкой, а затем представляет результаты в отчете, который позволит вам выявить потенциальные проблемы в приложении.
Инструмент SonarQube состоит из двух субприложений: механизма анализа, который устанавливается локально на компьютере разработчика, и централизованного сервера для ведения учета и отчетности. Один экземпляр сервера SonarQube может поддерживать несколько сканеров, что позволяет централизовать отчеты о качестве кода от многих разработчиков.
В этом мануале вы научитесь развертывать сервер и сканер SonarQube для анализа вашего кода и создания отчетов о качестве кода. Затем вы протестируете свою машину, отсканировав ее с помощью SonarQube.
Требования
- Сервер Ubuntu 16.04, настроенный по этому мануалу (2 Гб памяти минимум).
- Oracle Java 8. Установить этот инструмент можно с помощью этого мануала (следуйте разделу для Oracle JDK)
- Nginx и MySQL, установить которые можно по соответствующим разделам этого мануала.
- Certbot, клиент Let’s Encrypt (читайте Создание сертификата Let’s Encrypt для виртуального хоста Nginx в Ubuntu 16.04).
- Полностью зарегистрированное доменное имя и запись А, указывающая на ваш сервер SonarQube. В мануале мы будем использовать условный домен sonarqube.example.com.
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: SonarQube, Ubuntu, Ubuntu 16.04