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

Вступ
- Основні підходи до тестування ПЗ
- Характеристики статичного аналізатора 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