Статья также доступна на украинском (перейти к просмотру).

Оглавление
- Основные подходы к тестированию ПО
- Характеристики статического анализатора SonarQube
- Развертывание SonarQube на сервере Ubuntu 22.04
- Создание пользователя с привилегиями sudo
- Обновление системы
- Установка OpenJDK 11
- Установка и настройка БД PostgreSQL
- Загрузка и установка SonarQube
- Настройка SonarQube
- Работа с собственным проектом
- Запуск сканера для анализа кода проекта
- Просмотр и анализ результатов сканирования кода
- Настройка профилей качества
- Расширение возможностей SonarQube
Статический анализ кода де-факто стал обязательным этапом при разработке большинства программно-аппаратных систем и устройств с встроенным программным обеспечением (ПО). Он позволяет минимизировать количество ошибок и несогласованностей в коде еще на начальной стадии разработки, поэтому спрос на соответствующий инструментарий постоянно растет. SonarQube является одним из инструментов статического анализа, основанного на использовании плагинов для подключения новых языков и сервисов. Рассмотрим его свойства и главные принципы использования.
Основные подходы к тестированию ПО
Общие принципы тестирования ПО подразумевают наличие трех основных этапов: ревизия кода, статический анализ, динамический анализ.
Ревизия кода или Program understanding, обычно проводится специалистом по тестированию ПО в режиме просмотра на предмет обнаружения в коде явных ошибок, нарушений в стиле кода и других несоответствий.
Статический анализ подразумевает проверку исходного кода без его выполнения. Он применяется на начальных стадиях разработки и предусматривает использование специального ПО для обнаружения ошибок, работающего в автоматическом режиме. Его можно сравнить с анализом, выполняемым над программой при «прохождении» обычного компилятора, но на более глубоком уровне. Можно выделить следующие типичные ошибки, которые могут обнаруживаться на этом уровне:
- Переполнение буфера;
- Неопределенности в коде;
- Ошибки в функциях форматированного ввода/вывода;
- Ошибки в повторяющихся фрагментах кода;
- Ошибки, ведущие к уязвимости кода, то есть связаны с безопасностью его использования (SAST);
- Утечки памяти и других машинных ресурсов.
Некоторые из указанных ошибок, например некоторые виды неопределенностей могут быть обнаружены компилятором. Остальные легче выявить на этапе динамического анализа. В частности, это касается утечек машинных ресурсов. Но львиная часть ошибок все же оказывается именно на этом этапе. Особенно эффективно его применение для обнаружения SAST-ошибок.
Некоторые из наиболее известных инструментов статического анализа:
- PC-Lint;
- BLAST;
- PVS-Studio;
- Visual Code Grepper;
- YASCA;
- JsHint;
- Pylint;
- Pycodestyle;
- SonarQube.
Часть из них ориентирована на работу только на одном языке, например JsHint (JavaScript). Другие могут работать с несколькими разными технологиями, например, YASCA (Java, .NET, PHP, Python).
Динамический анализ проводится над рабочей версией программы при выполнении кода на реальной или виртуальной машине. Основная его цель – выявление функциональных ошибок программы в рабочем режиме. При этом должны быть обеспечены определенные условия – наличие нужных библиотек, подача входных данных и т. п. Только в этом случае может быть получено достаточное покрытие кода для получения правильных результатов. Он требует значительных затрат ресурсов, то есть является ресурсоемким и выполняется только над готовым программным продуктом.
Еще несколько лет назад эти этапы тестирования были разделены между собой и выполнялись отдельными подразделениями специалистов. Однако в последнее время существует тенденция к их объединению в целостный комплекс разработки и тестирования. DevOps, что также включает в себя инструментарий CI/CD. Примером здесь может стать решение Azure DevOps Server, которая, в частности, предоставляет возможность интеграции с инструментами анализа сторонних разработчиков.
Характеристики статического анализатора SonarQube
Сервис распространяется по GNU LGPL-лицензии, созданный на языке Java и имеет открытый исходный код. Он обеспечивает выполнение непрерывного анализа кода (Continuous inspection) и измерение его качества в соответствии с известными семью показателями (Seven Axes of Quality):
- Качество стиля кода;
- Выявление потенциальных ошибок;
- Комментарии;
- Тестирование;
- Дублирование фрагментов кода;
- Степень сложности;
- Архитектура и проектирование.
Соответствует стандартам MITRE/CWE, MISRA C/C++, CERT Secure Coding Standards и некоторым неформализованным международным требованиям.
Сервис обеспечивает мгновенную связь с разработчиком при работе в IDE-системе, что позволяет в реальном режиме времени исправлять ошибки еще до их фиксации в коде.
Программа использует систему плагинов, которая позволяет интегрироваться с любым IDE и расширить список языков программирования. В настоящее время поддерживается около 30 языков. В частности, для свободно распространяемой версии программы поддерживаются следующие языки и технологии:
- JavaScript;
- Java;
- AWS;
- Ruby;
- Scala;
- Python;
- HTML;
- PHP;
- Visual Basic;
- C Sharp;
- XML;
- Kotlin;
- Go;
- та деякі інші.
Профессиональная версия программы имеет гораздо больший список технологий, в частности дополнительно поддерживаются Objective-C, C++, PL/SQL и другие.
Развертывание SonarQube на сервере Ubuntu 22.04
Для запуска программы необходимо выполнить предварительные условия и подготовить программную среду сервера. Укажем основные подготовительные этапы:
- Создание пользователя с привилегиями sudo;
- Обновление системы;
- Установка OpenJDK 11;
- Установка и настройка БД PostgreSQL;
- Загрузка и установка SonarQube;
- Настройка SonarQube.
Выполним поочередно каждый из этапов.
Создание пользователя с привилегиями sudo
Создадим нового пользователя с именем testing_sonar. Для этого введем в терминале:
$ adduser testing_sonar

Пользователя создано. Добавим его в группу sudo:
$ adduser testing_sonar sudo

Результат: Adding user testing_sonar to group sudo Done, то есть пользователь был успешно добавлен в группу.
Изменим текущий аккаунт:
$ su -l testing_sonar

Обновление системы
Обновим индекс пакетов нашей системы в соответствии с содержанием репозитория:
$ sudo apt update

Результат: 47 пакетов могут быть обновлены. Сделаем это с помощью следующей команды:
$ sudo apt upgrade -y


Обновление прошло успешно.
Установка OpenJDK 11
Программа кроссплатформенная, то есть не зависит от типа операционной системы, но для своей работы требует наличия виртуальной машины JVM, и поэтому установим необходимые для этого библиотеки:
$ sudo apt install -y openjdk-11-jdk

Результат: openjdk-11-jdk is already the newest version (11.0.22+7-0ubuntu2~22.04.1), openjdk-11-jdk set to manually installed. То есть библиотеки уже установлены в системе.
Установка и настройка БД PostgreSQL
Сервис может сохранять результаты анализа в одной из известных баз данных:Microsoft SQL Server, PostgreSQL и Oracle. Кроме того, он имеет устроенную H2 базу,но ее желательно использовать только в процессе предварительного тестирования, а не в производственной среде. Для этого установим и настроим для нашего проекта базу PostgreSQL.
Прежде всего, добавим репозиторий PostgreSQL в список разрешенных источников данных для нашего пакетного менеджера:
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'

После этого добавим ключ подписи PostgreSQL с помощью следующей команды:
$ wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -

Инициируем процесс установки программы:
$ sudo apt install -y postgresql postgresql-contrib


Результат: Setting up postgresql-contrib (программа успешно установлена).
Настроим автоматический запуск при каждой перезагрузке:
$ sudo systemctl enable postgresql

Запустим сервер баз данных:
$ sudo systemctl start postgresql

Изменим пароль доступа к базе, установленный по умолчанию:
$ sudo passwd postgres

Пароль успешно изменен.
Переключимся на стандартного пользователя базы:
$ su - postgres

Можно убедиться, что пользователь изменился, что видно по виду приглашения командной строки:
postgres@dedicated:~$
Создадим пользователя сервиса SonarQube:
$ createuser sonar

Подключимся к интерфейсу командной строки PostgreSQL:
$ psql

Можно убедиться, что вид приглашения командной строки изменился:
postgres=#
Установим надежный пароль пользователя сервиса:
# ALTER USER sonar WITH ENCRYPTED password 'guVnWwyf';

Создадим базу с именем SonarQube и назначим ее владельцем созданного нами пользователя sonar:
# CREATE DATABASE sonarqube OWNER sonar;

Результат: CREATE DATABASE (база успешно создана).
Установим администраторские права доступа для sonar к базе:
# GRANT ALL PRIVILEGES ON DATABASE sonarqube to sonar;

Выйдем из командного режима управления PostgreSQL:
# \q

При этом вид приглашения командной строки изменился:
postgres@dedicated:~$
Вернемся к аккаунту пользователя системы Ubuntu с именем testing_sonar:
$ exit

Результат: Logout. При этом вид приглашения изменился:
testing_sonar@dedicated:~$
Загрузка и установка SonarQube
Для начала установим zip-архиватор, необходимое для выполнения операций с архивом программы. Для этого введем в терминале:
$ sudo apt install -y zip

Результат: Setting up zip (утилита успешно установлена).
На сайте разработчиков сервиса SonarQube находим ссылку на скачивание файлов дистрибутива последней версии программы и начинаем процесс загрузки архива:
$ sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.4.87374.zip

Результат:
--2024-02-27 12:03:17-- https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.4.87374.zip Resolving binaries.sonarsource.com (binaries.sonarsource.com)... 18.172.242.16, 18.172.242.17, 18.172.242.114, ... Connecting to binaries.sonarsource.com (binaries.sonarsource.com)|18.172.242.16|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 294636324 (281M) [binary/octet-stream] Saving to: ‘sonarqube-9.9.4.87374.zip’ sonarqube-9.9.4.87374.zip 100%[==========================================================>] 280.99M 11.5MB/s in 25s 2024-02-27 12:03:42 (11.2 MB/s) - ‘sonarqube-9.9.4.87374.zip’ saved [294636324/294636324]
Программа была успешно загружена на сервер.
Распаковываем архив:
$ sudo unzip sonarqube-9.9.4.87374.zip


Перенесем полученные файлы в отдельный каталог:
$ sudo mv sonarqube-9.9.4.87374 /opt/sonarqube

Создадим группу сервиса SonarQube с именем sonar:
$ sudo groupadd sonar

Создадим пользователя сервиса с именем sonar:
$ sudo useradd -d /opt/sonarqube -g sonar sonar
Здесь директория /opt/sonarqube установлена ??в качестве домашнего каталога нового пользователя.

Установим полные права доступа пользователя sonar в директорию /opt/sonarqube:
$ sudo chown sonar:sonar /opt/sonarqube –R

Настройка SonarQube
Настройка сервиса заключается в установке нужных параметров конфигурации в файле sonar.properties, который находится в системном каталоге conf. Откроем указанный файл с помощью редактора и выставим в нем параметры, необходимые для подключения к базе данных:
$ sudo nano /opt/sonarqube/conf/sonar.properties
Параметры и их значение:
sonar.jdbc.username=sonar sonar.jdbc.password=guVnWwyf sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonarqube
Здесь прописаны имя пользователя базы данных, пароль входа и адрес jdbc-драйвера для подключения к базе PostgreSQL.
Внесем в файл указанные изменения, как показано ниже, и сохраним его на диске.

Отредактируем файл сценария для запуска программы, добавив к нему значение нужного параметра:
$ sudo nano /opt/sonarqube/bin/linux-x86-64/sonar.sh
Изменим значение параметра RUN_AS_USER, как показано ниже.

Сохраним внесенные изменения и выйдем из редактора.
Создадим служебный файл systemd для запуска сервиса при загрузке системы с помощью редактора nano:
$ sudo nano /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

Сохраним внесенные изменения и закроем файл.
Сервис использует Elasticsearch для хранения индексов в MMap FS, что требует внесения изменений в системные настройки. Для этого отредактируем конфигурационный файл sysctl:
$ sudo nano /etc/sysctl.conf
Добавим следующие параметры и их значение:
vm.max_map_count=262144 fs.file-max=65536 ulimit -n 65536 ulimit -u 4096
После изменения изменений содержимое файла будет выглядеть так, как показано ниже.

Закроем файл и перезагрузим систему:
$ sudo reboot
Включим автоматический запуск сервиса при загрузке системы:
$ sudo systemctl enable sonar

В результате была создана символическая ссылка:
Created symlink /etc/systemd/system/multi-user.target.wants/sonar.service → /etc/systemd/system/sonar.service.
Запустим службу SonarQube с помощью следующей команды:
$ sudo systemctl start sonar
![]()
После запуска службы мы можем открыть Панель управления программой, которая находится по веб-адресу: http://localhost:9000 .

Работа с собственным проектом
Создать и настроить проект можно с помощью уже запущенной Панели управления. Для входа в нее по умолчанию используется значение admin в качестве имени пользователя и пароля.
После входа выбираем команду «Создать новый проект» во вкладке «Проекты».
ВВводим значения параметров «Ключ проекта» и «Имя проекта», после чего кликаем по кнопке «Настроить».
Выбираем метод анализа для проекта – утилиту сканер SonarQube.
После этого загружаем и устанавливаем выбранный сканер в соответствии с управляющими сообщениями Панели управления.
Создадим в корневом каталоге проекта конфигурационный файл sonar-project.properties, в котором пропишем определенные параметры и их значение.
Создадим файл с помощью редактора nano:
$ sudo nano /opt/sonarqube/sonar-project.properties
Добавим к нему следующий список параметров:
sonar.projectKey=FgfH_hfEfdy sonar.projectName=test sonar.projectVersion=1.0 sonar.sources=src sonar.language=java sonar.sourceEncoding=UTF-8

Сохраним внесенные изменения и выйдем из редактора.
Запуск сканера для анализа кода проекта
Сканер представляет собой отделенную утилиту, которую можно запустить как с командной строки, так и из Панели управления. После этого начнется процесс анализа кода выбранного проекта, например с именем test, как в нашем случае. После его завершения должно появиться сообщение, вроде следующего «EXECUTION SUCCESS», после чего можно переходить к анализу результатов.
Просмотр и анализ результатов сканирования кода
Результаты сканирования кода можно просмотреть в Панели управления. Для этого достаточно в разделе «Проекты» выбрать нужный проект. В нашем случае это проект с именем test.

В появившемся окне можно увидеть несколько разделов, позволяющих просмотреть результаты анализа с нескольких позиций. К примеру, сканер сортирует ошибки по степени значимости по следующим категориям: Информационные, Незначительные, Серьезные, Критические и Блокирующие. Можно также просмотреть более подробно некоторые из ошибок, выбрав их в окне программы, как показано ниже.


Настройка профилей качества
Сервис включает в себя набор правил или профилей качества для каждого из поддерживаемых им языков программирования. Однако он также позволяет настроить профили под потребности конкретного проекта. Для этого необходимо в Панели управления выполнить следующие действия:
- Перейти в раздел Профили качества;
- Выбрать нужный язык;
- Выбрать команду Создать в случае создания нового профиля, или Копировать при необходимости получить копию существующего;
- Сохраните профиль под новым уникальным именем.
На вкладке Правила нового профиля можно использовать командами активации/деактивации и возможностями механизма фильтрации правил, чтобы выбрать те правила, которые нужны. Также можно установить определенную степень значимости для отдельных правил.
После создания нового профиля необходимо перейти на вкладку Администрирование, где в разделе Профили качества выбрать созданный профиль для выбранного языка и нажать кнопку Установить по умолчанию. После этого профиль качества для выбранного языка будет обновлен.


Расширение возможностей SonarQube
Сервис позволяет автоматизировать процесс анализа кода путем интеграции с известными CI/CD инструментами Jenkins, Gradle, Azure Devops, GitLab CI и другими. Более подробно о вопросах интеграции с инструментами разработки можно ознакомиться в документации к программному продукту. Доступный набор плагинов и расширений для расширения возможностей сервиса можно посмотреть на SonarQube Marketplace.
Дата-центр FREEhost.UA предоставляет услуги облачных серверов для задач любой сложности. Наш VPS хостинг можно использовать как для собственных экспериментов, так и для размещения проектов с большой нагрузкой. Две локации размещения ВВС, ежедневный бекап, выделенный IPv4 адрес, круглосуточная техническая поддержка гарантируют Вам качественную и комфортную работу.
Подписывайтесь на наш телеграмм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Мы в чем ошиблись, или что-то пропустили?
Напишите об этом в комментариях, мы с удовольствием ответим и обсуждаем Ваши замечания и предложения.
|
Дата: 04.03.2024 Автор: Александр Ровник
|
|

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus