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

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

Вступление

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

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

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

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

Предпосылки

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

  • Один сервер Ubuntu 18.04 с памятью3GB or more, настроенный в соответствии с этимInitial Server Setup with Ubuntu 18.04, включая пользователя 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 Secure Nginx with Let’s Encrypt on Ubuntu 18.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 упакованы в заархивированный формат, поэтому установите утилитуunzip, которая позволит вам извлекать эти файлы.

sudo apt-get install unzip

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

sudo mysql -u root -p

Затем создайте базу данных SonarQube:

CREATE DATABASE sonarqube;

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

CREATE USER sonarqube@'localhost' IDENTIFIED BY 'some_secure_password';

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

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

Затем примените изменения разрешений и выйдите из консоли MySQL:

FLUSH PRIVILEGES;
EXIT;

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

[[шаг-2 -—- загрузка-и-установка-sonarqube]] == Шаг 2. Загрузка и установка SonarQube

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

cd /opt/sonarqube

Затем перейдите вSonarQube downloads page и возьмите ссылку для загрузки SonarQube 7.5 Community Edition. Существует множество версий и вариантов SonarQube, доступных для загрузки на странице, но в этом конкретном руководстве мы будем использовать SonarQube 7.5 Community Edition.

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

sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.5.zip

Распакуйте файл:

sudo unzip sonarqube-7.5.zip

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

sudo rm sonarqube-7.5.zip

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

sudo chown -R sonarqube:sonarqube /opt/sonarqube

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

[[step-3 -—- configuring-the-sonarqube-server]] == Шаг 3 - Настройка сервера SonarQube

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

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

  • Мы также должны указать SonarQube использовать MySQL для нашей внутренней базы данных.

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

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

Начните с открытия файла конфигурации SonarQube:

sudo nano sonarqube-7.5/conf/sonar.properties

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

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

    ...

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

    ...

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

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

    ...

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

    ...

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

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

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

    ...

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

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

Затем вы будете использоватьSystemd, чтобы настроить 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.5/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/sonarqube-7.5/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 Sat 2019-01-05 19:00:00 UTC; 2s ago

Затем настройте службу SonarQube для автоматического запуска при загрузке:

sudo systemctl enable sonarqube

На этом этапе серверу SonarQube потребуется несколько минут для полной инициализации. Вы можете проверить, запущен ли сервер, запросив порт HTTP:

curl http://127.0.0.1:9000

После завершения процесса инициализации вы можете перейти к следующему шагу.

[[step-4 -—- configuring-the-reverse-proxy]] == Шаг 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.

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

[[step-5 -—- securing-sonarqube]] == Шаг 5 - Обеспечение безопасности SonarQube

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

Начните с посещения URL вашей установки и войдите в систему, используя учетные данные по умолчанию. Если будет предложено начать обучение, просто щелкнитеSkip this tutorial, чтобы перейти на панель управления.

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

SonarQube users administration tab

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

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

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

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

SonarQube Force authentication switch

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

[[шаг-6 -—- настройка-сканера-кода]] == Шаг 6 - Настройка сканера кода

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

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

Начните с создания каталога для сканера:

sudo mkdir /opt/sonarscanner

Затем перейдите в этот каталог:

cd /opt/sonarscanner

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

sudo wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.2.0.1227-linux.zip

Далее извлеките сканер:

sudo unzip sonar-scanner-cli-3.2.0.1227-linux.zip

Затем удалите файл архива zip:

sudo rm sonar-scanner-cli-3.2.0.1227-linux.zip

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

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

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

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

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

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

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

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

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

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

[[step-7 -—- running-a-test-scan-on-sonarqube-example-projects]] == Шаг 7. Запуск тестового сканирования на примерах проектов SonarQube

Если вы хотите просто покопаться в 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: 14.128 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 21.776s
INFO: Final Memory: 17M/130M
INFO: ------------------------------------------------------------------------

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

SonarQube Dashboard

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

[[step-8 -—- running-a-scan-on-your-own-code]] == Шаг 8 - Запуск сканирования вашего собственного кода

Чтобы 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