В современной разработке все чаще предъявляются высокие требования к качеству кода и неукоснительному следованию стандартам качества кода в командах. Обеспечение качества кода, а также решение многих других задач, связанных с разработкой и поддержанием «чистого» кода, берёт на себя популярный инструмент анализа — SonarQube.
Меня зовут Николай, я 1С-разработчик в SimbirSoft и в этой статье хочу подробно рассказать о процессе установки и настройки SonarQube в ОС Linux.
Введение
SonarQube — платформа с открытым исходным кодом для непрерывного анализа и измерения качества программного кода. Она поддерживает около 30 языков программирования, включая 1С.
Основные задачи, которые решает SonarQube:
статический анализ кода;
оценка сложности кода;
поиск потенциальных уязвимостей и ошибок в коде;
интеграция в конвейеры непрерывной интеграции (CI/CD).
Преимущества использования SonarQube:
Автоматизация анализа кода – кодовая база периодически проверяется на соответствие принятым стандартам используемого языка программирования и проекта.
Поиск потенциальных ошибок, неоптимальных решений и уязвимостей в коде.
Оценка цикломатической и когнитивной сложности кода.
Оценка «технического долга» и расчет времени, необходимого на его устранение.
Анализ дублирования кода.
Экономия времени сотрудников на поддержание здоровья кодовой базы, улучшения кода и его рефакторинг.
Душевное спокойствие технического руководителя проекта.
В разработке ПО SonarQube помогает выявлять ошибки, устранять их на ранних этапах и следить за ключевыми показателями качества кода. Установка и использование SonarQube будет хорошим вложением в инфраструктуру вашей компании или проекта.
В статье я продемонстрировал установку SonarQube на операционной системе Linux. Использование этой ОС зачастую является хорошим выбором с точки зрения скорости работы, быстродействия и безопасности. В то же время в Linux часто требуется установка и настройка программ и дополнительных компонентов. В статье я предоставил подробное руководство по установке и базовой настройке платформы SonarQube.
Подготовительные действия к установке SonarQube
Прежде чем установить SonarQube, потребуется установить программы, без которых работа SonarQube будет невозможна или крайне затруднительной — это виртуальная машина Java и сервер баз данных PostgreSQL.
Для работы SonarQube нам понадобится Java 17-ой версии.
sudo apt install openjdk-17-jdk -y
Проверим, что установка Java прошла успешно:
java --version

Далее установим версию PostgreSQL Pro с патчами для 1С с сайта.
wget https://repo.postgrespro.ru/pg1c-16/keys/pgpro-repo-add.sh
sudo sh pgpro-repo-add.sh
sudo apt-get install -y postgrespro-1c-16
С установкой закончили, запустим службу:
sudo systemctl start postgrespro-1c-16
Проверим статус службы:
sudo service postgrespro-1c-14 status

Надеюсь, вы получили такой же результат — это значит, что установка PostgreSQL прошла успешно, и можно двигаться дальше.
Создадим базу данных для SonarQube:
sudo passwd postgres
su - postgres
createuser sonar
psql
ALTER USER sonar WITH ENCRYPTED password 'sonar';
CREATE DATABASE sonarqube OWNER sonar;
grant all privileges on DATABASE sonarqube to sonar;
\q
exit

Перейдем к настройкам системы. Для работы SonarQube необходимо настроить лимиты аппаратных ресурсов операционной системы. Откроем системный файл limits.conf под суперпользователем:
sudo vim /etc/security/limits.conf
Добавим следующие строки в конец файла:
sonarqube - nofile 65536
sonarqube - nproc 4096
Эти параметры увеличивают лимит открытых файлов и создание дочерних процессов. Без этих настроек при работе над большими проектами можно получить ошибки:
Too many files или Cannot create new thread.
Следующая настройка, которую необходимо поместить в конец файла sysctl.conf
sudo vim /etc/sysctl.conf
vm.max_map_count = 262144
Она отвечает за то, как SonarQube использует Elasticsearch для хранения и поиска данных. Elasticsearch активно использует memory mappings для работы с индексами. Если лимит слишком низкий, это может привести к ошибкам, например:
max virtual memory areas vm.max_map_count [65530] is too low
Установка и настройка SonarQube
Скачиваем последний релиз SonarQube версию Community следующей командой:
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.0.65466.zip
Если нет пакета unzip для распаковки zip-архивов, устанавливаем
sudo apt install unzip
Размещаем в домашнюю папку текущего пользователя и перенесем в папку постоянной дислокации приложения:
sudo unzip sonarqube-25.3.0.104237.zip -d ~
sudo mv sonarqube-25.3.0.104237 /opt/sonarqube
Создадим отдельного пользователя sonar для запуска SonarQube, а также группу sonar и дадим новому пользователю права на папку /opt/sonarqube. SonarQube не может быть запущен под правами суперпользователя.
sudo groupadd sonar
sudo useradd -c "user to run SonarQube" -d /opt/sonarqube -g sonar sonar
Установим права на папку с распакованным дистрибутивом SonarQube для нового пользователя:
sudo chown sonar:sonar /opt/sonarqube -R
Осталось только настроить приложение, для этого внесем изменения в конфигурационный файл sonar.properties
Настроим подключение к базе данных, которую мы создали ранее:
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube
Укажем пути размещения данных и временных файлов:
sonar.path.data=/opt/sonarqube/data
sonar.path.temp=/opt/sonarqube/temp
Установим некоторые настройки сервиса ComputeEngine
sonar.ce.javaOpts=-Xmx4G -Xms1G -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError
SonarQube готов к работе. Попробуем запустить — сделать это можно командой, которая запустит наш экземпляр SonarQube в режиме приложения:
/opt/sonarqube/bin/linux-x86-x64/sonar.sh console
Давайте проверим наш SonarQube и войдем на веб-сервер SonarQube, по умолчанию доступным сетевым адресом сервера будет http://<IP-адрес сервера>:9000

Логин и пароль по умолчанию: admin admin
После входа будет предложено поменять пароль, устанавливаем его и входим в панель управления SonarQube.

Создадим нового пользователя, под ним sonarscanner будет подключаться к SonarQube


Добавим нового пользователя в группу администраторов:

Добавим токен, он понадобится для подключения sonarscanner к SonarQube:

Вводим любое имя, Expires in — No expiration:

Записываем токен, чтобы не забыть. Он появляется только один раз при создании!


Пока не закрыли окно веб-интерфейса, установим плагин 1С, который и позволит добавить поддержку языка 1С в SonarQube. Сделать это можно двумя способами:
Непосредственно из Маркетплейса.
Скачав плагин с сайта разработчика и установив его вручную.
Перейдем в раздел Administration — Marketplace:


Если после нажатия кнопки Install вы увидите надпись Install Pending, это означает, что плагин успешно скачан и будет установлен при перезапуске службы SonarQube.

Перезапустить службу можно из веб-интерфейса, перейдя в раздел меню Administration — System — Restart Server и дождаться завершения перезапуска.

После этого зайдите в Marketplace, чтобы убедиться что плагин успешно установлен.

Установить его также можно вручную, для этого — скачанный плагин необходимо поместить в папку /opt/sonarqube/extensions. После перезапуска он окажется в папке plugins.

Плагин успешно установлен, перейдем в его настройки: Administration — Configuration. 1C (BSL). В большинстве случаев имеет смысл установить Пропускать расчет диагностик в модулях «на поддержке» в значение with support locked плагин не будет анализировать модули на поддержке и если в модуле не разрешены изменения.

Осталось установить sonarscanner — инструмент, который будет сканировать исходный код и передавать результаты проверки в SonarScanner. Загрузить sonarscanner можно по ссылке:
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-7.0.2.4839-linux-x64.zip
Распаковать ее в папку /opt можно командой:
unzip ~/sonar-scanner-cli-7.0.2.4839-linux-x64.zip -d /opt/
cd /opt/
sudo mv sonar-scanner-7.0.2.4839-linux-x64/ /opt/sonarscanner/
После выполнения вышеприведенных команд каталог с файлами sonarscanner должен располагаться в папке /opt/sonarscanner.
Как использовать sonarscanner? Для сканирования кода проекта с помощью sonarscanner необходимо запустить файл sonar-scanner из каталога bin, указав в аргументах запускаемого файла параметры для уточнения параметра сканирования файлов с исходным кодом. Вместо указания параметров непосредственно в командной строке допускается создать конфигурационный файл, в котором можно описать все необходимые параметры сканирования.
Подробнее о параметрах ты можешь прочитать на сайте SonarScanner CLI | SonarQube Server Documentation.
Приведу пример конфигурационного файла и запуска sonar-scanner:
# идентификатор проекта, используется для связи результатов анализа с конкретным проектом на сервере, обязательный параметр
sonar.projectKey=your_project
sonar.login= ваш_токен
# URL сервера на который будут отправлены результаты сканирования проекта
sonar.host.url=http://localhost:9000
# корневой каталог к файлам проекта
sonar.projectBaseDir=/opt/sonarqube/projects/unf
# указание папки с исходным кодом проекта
sonar.sources=src
# указание фильтра какие файлы необходимо сканировать
sonar.inclusions=**/*.bsl, **/*.os
# задает понятное имя проекта которое будет отображаться в интерфейсе SonarQube
sonar.projectName=Ваш проект
# кодировка файлов
sonar.sourceEncoding=utf-8
# фильтр файлов для исключения из сканирования
sonar.exclusions=**/*.html,**/Ext/Help.xml,**/Ext/Template.xml,**/Templates/**/*.xml,**/Ext/Predefined.xml,sonar.lang.patterns.xml=**/*.xsd,**/*.xsl
# Пропускать файлы на поддержке поставщика без возможности редактирования со статусом "Не редактируется"
sonar.bsl.skipVendorSupportedObjects=true
Пример запуска sonar scanner
sonar-scanner -X -Dproject.settings=/path/to/config/project.properties
Напоследок, установим SonarQube как службу, отредактируем файл
sudo vim /etc/systemd/system/sonar.service
Добавим следующее содержимое
[Unit]
Description=SonarQube service
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop
User=sonar
Group=sonar
Restart=always
LimitNOFILE=65536
LimitNPROC=4096
[Install]
WantedBy=multi-user.target
и установим SonarQube как службу
sudo systemctl start sonar
sudo systemctl enable sonar
sudo systemctl status sonar
Проверим логи новоиспеченной службы, все ли в порядке?!
sudo tail -f /opt/sonarqube/logs/sonar.log
Подведем итоги
Итак, мы подробно рассмотрели процесс установки и настройки SonarQube.
В результате мы выполнили следующие важные шаги:
Установили базу данных PostgreSQL для хранения результатов сканирования.
Подготовили среду исполнения: установили и настроили Java.
Развернули и сконфигурировали сервер SonarQube.
Добавили плагин для поддержки анализа кода на языке 1С.
Настроили Sonar Scanner и изучили принципы создания конфигурационных файлов для сканирования проектов.
Надеюсь, это руководство окажется полезным в твоей работе. Спасибо за внимание! Подписывайся на наши соцсети и блог, где мы публикуем другие полезные материалы, в том числе и для 1С-специалистов:
Re1ter
Небольшое дополнение: если вы запускаете сканирование где-то в CI, а затем отправляете результаты на сервер, который использует самоподписанный сертификат, то сертификат нужно будет добавить в локальное хранилище
sonarscanner
, что делается несколько нетривиально:keytool -importcert -file /usr/local/share/ca-certificates/mycert.crt -keystore $SONAR_USER_HOME/ssl/truststore.p12 -storepass changeit -noprompt
ashkraba
Ну и к Вашему комментарии небольшое уточнение) Нужно добавить в хранилище не sonarсканера, а в хранилище сертификатов java, и такое же поведение будет у всех javabased приложений))) Просто у sonara задан такой путь до truststore, но он может быть и другим.
Re1ter
Ну, я разворачивал сонар на проектах .net, и конечно же добавлял сертификаты в системное хранилище (безуспешно), поэтому такое поведение мне совсем не показалось очевидным.