Как обеспечить качество кода с SonarQube в Ubuntu 16.04

Автор выбралElectronic Frontier Foundation для получения пожертвования в рамках программыWrite for DOnations.

Вступление

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

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

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

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

Предпосылки

Прежде чем начать это руководство, вам потребуется следующее:

  • Один сервер Ubuntu 16.04 с памятью2GB or more, настроенный в соответствии с этимUbuntu 16.04 initial server setup tutorial, включая пользователя sudo без полномочий root и брандмауэр.

  • Oracle Java 8, установленный на сервере, настроен в соответствии с разделом Oracle JDK вthis Oracle JDK installation tutorial.

  • Nginx и MySQL, настроенные в соответствии с разделами Nginx и MySQL вthis LEMP installation guide.

  • Certbot (клиент Let’s Encrypt), настроенный следующим образомHow to Set Up Let’s Encrypt with Nginx server blocks on Ubuntu 16.04.

  • Полное доменное имя и запись A, указывающая на сервер, на который вы будете устанавливать SonarQube. Если вы используете службу DNS DigitalOcean,this DNS record setup guide поможет вам ее настроить. В этом руководстве мы будем использоватьsonarqube.example.com.

[[step-1 -—- prepare-for-the-install]] == Шаг 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 упакованы в заархивированный формат, поэтому установите утилиту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;

Теперь, когда у нас есть пользователь и каталог, давайте загрузим и установим сам SonarQube.

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

Начните с изменения текущего рабочего каталога на каталог установки SonarQube:

cd /opt/sonarqube

Затем перейдите кSonarQube downloads page и возьмите ссылку для загрузки 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:

/opt/sonarqube/sonarqube-7.0/conf/sonar.properties

    ...

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

    ...

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

/opt/sonarqube/sonarqube-7.0/conf/sonar.properties

    ...

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

    ...

Наконец, скажите SonarQube работать в режиме сервера и слушать только локальный адрес:

/opt/sonarqube/sonarqube-7.0/conf/sonar.properties

    ...

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

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

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

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

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

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

/etc/systemd/system/sonarqube.service

[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 вUnderstanding Systemd Units and Unit Files.

Закройте и сохраните файл, затем запустите службу 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, который будет обратным прокси-сервером и HTTPS-терминатором для нашего экземпляра SonarQube.

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

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

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

/etc/nginx/sites-enabled/sonarqube

server {
    listen 80;
    server_name sonarqube.example.com;

    location / {
        proxy_pass http://127.0.0.1:9000;
    }
}

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

Затем убедитесь, что в вашем файле конфигурации нет синтаксических ошибок:

sudo nginx -t

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

sudo service nginx restart

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

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

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

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

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

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

Шаг 5 - Защита SonarQube

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

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

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

SonarQube users administration tab

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

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

Затем создайте токен для конкретного пользователя, нажав кнопку в столбце «Жетоны» и присвоив этому токену имя. Этот токен понадобится вам позже при запуске сканера кода, поэтому обязательно запишите его в безопасном месте.

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

SonarQube Force authentication switch

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

Шаг 6 - Настройка сканера кода

Сканер кода SonarQube - это отдельный пакет, который вы можете установить на другой компьютер, отличающийся от того, на котором запущен сервер SonarQube, например на локальную рабочую станцию ​​разработки или сервер непрерывной доставки. Существуют пакеты для Windows, MacOS и Linux, которые вы можете найти по адресуSonarQube web site.

В этом руководстве мы установим сканер кода на тот же сервер, на котором размещен наш сервер SonarQube.

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

sudo mkdir /opt/sonarscanner
cd /opt/sonarscanner

Затем загрузите сканер SonarQube для Linux, используяwget:

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:

/opt/sonarscanner/sonar-scanner-3.0.3.778-linux/conf/sonar.properties

    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 example projects. Это примеры проектов, созданных командой 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 Dashboard

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

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

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

nano sonar-project.properties

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

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

sonar-project.properties

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

    ...

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

sonar-project.properties

    ...

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

    ...

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

sonar-project.properties

    # 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 Scanner documentation, чтобы узнать, как выполнять анализ на локальной машине разработки или как часть процесса сборки.

Related