1С. SonarQube в Docker для анализа качества кода

Покажу установку SonarQube для анализа кода проектов 1С.

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

Зачем нужен анализ кода и как решать управленческие вопросы, в статье не рассматриваю. Дальше инструкция, как всё поднять за несколько минут.

Архитектура и структура

Всё необходимое работает в контейнерах Docker: SonarQube и СУБД PostgreSQL. Также будет задействован контейнер SonarScanner. Его образ сохранится при первом запуске, а при каждом запуске будет создаваться новый контейнер и удаляться по завершении работы. Если честно, тут просто захотелось поиграться.

Вместе с  SonarQube будут установлены плагины: SonarQube 1C (BSL) Community Plugin и SonarQube Russian Language Pack.

Теперь о структуре каталогов. Весь проект назвал CodeQualityAnalysis и разместил в каталоге Projects домашней директории. Далее везде использую этот путь, если нужно меняйте.

Остановился на структуре, где инфраструктура Docker отделена от анализируемых проектов.

~/Projects/CodeQualityAnalysis/          # Корень
├── sonarqube-docker/                    # Docker-инфраструктура
│   ├── docker-compose.yml               # Конфигурация сервисов в Docker
│   └── extensions/
│       └── plugins/                     # Плагины SonarQube
├── ConfigurationFiles/                  # Каталог проектов 1С
│   └── ИмяПроекта/                      # Директория конкретного проекта
│       ├── sonar-project.properties     # Настройки анализа
│       └── src/                         # Исходный код (.bsl/.os файлы)
└── scan.sh                              # Скрипт запуска анализа

Это позволяет легко добавлять новые проекты, достаточно создать ещё один каталог и файл описания проекта.

Рекурсивно создаю каталоги проекта:

mkdir -p ~/Projects/CodeQualityAnalysis/sonarqube-docker/extensions/plugins
mkdir -p ~/Projects/CodeQualityAnalysis/ConfigurationFiles

Установка Docker

Если Docker уже установлен, этот шаг можно пропустить

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

Временные файлы после работы нужно удалить, сохраняем порядок!

# Устанавливаю Docker
curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
sudo sh /tmp/get-docker.sh
rm /tmp/get-docker.sh

# Добавляю пользователя в группу docker и применяем изменения
sudo usermod -aG docker $USER
newgrp docker

# Проверяю результат установки
docker --version
docker compose version

Подготовка и развертывание контейнеров

Настройка docker-compose.yml

Создаю файл ~/Projects/CodeQualityAnalysis/sonarqube-docker/docker-compose.yml с содержимым:

services:
  sonarqube:
    image: sonarqube:community
    container_name: sonarqube
    hostname: sonarqube
    restart: unless-stopped
    ports:
      - "9000:9000"
    environment:
      - SONAR_JDBC_URL=jdbc:postgresql://sonarqube-db:5432/sonarqube
      - SONAR_JDBC_USERNAME=sonar
      - SONAR_JDBC_PASSWORD=ПарольОтPostgreSQL
      - SONAR_SEARCH_JAVAOPTS=-Xmx512m -Xms512m -XX:+HeapDumpOnOutOfMemoryError
      - SONAR_WEB_JAVAOPTS=-Xmx512m -Xms512m -XX:+HeapDumpOnOutOfMemoryError
      - SONAR_CE_JAVAOPTS=-Xmx512m -Xms512m -XX:+HeapDumpOnOutOfMemoryError
    volumes:
      - ./extensions/plugins:/opt/sonarqube/extensions/plugins
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    depends_on:
      sonarqube-db:
        condition: service_healthy
    ulimits:
      nofile:
        soft: 131072
        hard: 131072
      nproc:
        soft: 8192
        hard: 8192
      memlock:
        soft: -1
        hard: -1

  sonarqube-db:
    image: postgres:15-alpine
    container_name: sonarqube-db
    restart: unless-stopped
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=ПарольОтPostgreSQL
      - POSTGRES_DB=sonarqube
    volumes:
      - postgresql_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U sonar -d sonarqube"]
      interval: 10s
      timeout: 5s
      retries: 10
      start_period: 30s

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql_data:

Пароль ПарольОтPostgreSQL используется в двух местах. При смене пароля меняйте одновременно.

Подготовка плагинов 1C (BSL) и Русского я зыка

Предварительно выясняю ссылки на актуальные версии плагинов на GitHub:  SonarQube 1C (BSL) Community Plugin и SonarQube Russian Language Pack. Скачиваю их в каталог с плагинами

cd ~/Projects/CodeQualityAnalysis/sonarqube-docker

# Скачиваю плагин для анализа 1C (BSL)
wget -P ./extensions/plugins/ \
https://github.com/1c-syntax/sonar-bsl-plugin-community/releases/download/v1.15.0/sonar-communitybsl-plugin-1.15.0.jar

# Скачиваю плагин Русского языка
wget -P ./extensions/plugins/ \
https://github.com/1c-syntax/sonar-l10n-ru/releases/download/v25.7/sonar-l10n-ru-plugin-25.7.jar

Запуск SonarQube

Перехожу в каталог с файлом docker-compose.yml и запускаю контейнеры:

cd ~/Projects/CodeQualityAnalysis/sonarqube-docker
docker compose up -d

При первом запуске контролирую готовность:

docker compose logs -f

Дожидаюсь строки SonarQube is operational. Теперь можно переходить в веб-интерфейс.

Первый вход и настройка

Веб-интерфейс расположен по адресу http://localhost:9000. Если установка производится на удаленной машине без графического окружения, подключаюсь по IP-адресу.

Веб интерфейс приветствует формой авторизации. По умолчанию логин: admin, пароль: admin.

1С. SonarQube в Docker. Авторизация

После авторизации будет предложено сменить пароль. Затем появится предупреждение для подтверждения установки плагинов.

1С. SonarQube в Docker. Установка плагинов

Проверяю установленные плагины. Перехожу AdministrationMarketplaceInstalled или Администрирование → Магазин → Установлено, вижу установленные плагины.

1С. SonarQube в Docker. Установденные плагины

Установка выполнена успешно, идем дальше.

Скрипт для запуска анализа качества кода

Пишу скрипт, который запустит контейнер SonarScanner в Docker и выполнит анализ указанного проекта. Если проект не указан, выведет подсказку и список доступных проектов. Если проект найден, выводится сообщение о начале анализа, а после о завершении.

Скрипт расположен в файле ~/Projects/CodeQualityAnalysis/scan.sh

#!/bin/bash

# Корень проектов
BASE_PATH="$HOME/Projects/CodeQualityAnalysis/ConfigurationFiles"

# Имя проекта (обязательный аргумент)
PROJECT="${1}"

if [ -z "$PROJECT" ]; then
    echo "Ошибка: укажите имя проекта"
    echo "Использование: $0 <имя_проекта>"
    echo "Доступные проекты:"
    ls -d ${BASE_PATH}/*/ 2>/dev/null | xargs -n1 basename
    exit 1
fi

PROJECT_PATH="${BASE_PATH}/${PROJECT}"

if [ ! -d "$PROJECT_PATH" ]; then
    echo "Ошибка: проект '$PROJECT' не найден в $BASE_PATH"
    echo "Доступные проекты:"
    ls -d ${BASE_PATH}/*/ 2>/dev/null | xargs -n1 basename
    exit 1
fi

echo "============================================"
echo "Запуск анализа проекта: $PROJECT"
echo "Путь: $PROJECT_PATH"
echo "============================================"

# Запуск SonarScanner в Docker
docker run --rm \
  --network="host" \
  -v "${PROJECT_PATH}:/usr/src" \
  sonarsource/sonar-scanner-cli

echo "============================================"
echo "Анализ завершён!"
echo "Результат: http://localhost:9000/dashboard?id=${PROJECT}"
echo "============================================"

Делаю скрипт исполняемым

chmod +x ~/Projects/CodeQualityAnalysis/scan.sh

Все готово для добавления первого проекта и его анализа

Добавление проекта для анализа

Каталоги и настройки проекта

Рекурсивно создаю каталог проекта:

mkdir -p ~/Projects/CodeQualityAnalysis/ConfigurationFiles/ИмяПроекта/src

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

Создаю файл настроек ~/Projects/CodeQualityAnalysis/ConfigurationFiles/ИмяПроекта/sonar-project.properties с содержимым:

# Основные настройки
sonar.projectKey=ИмяПроекта
sonar.projectName=ИмяПроекта
sonar.projectVersion=1.0

# Язык и кодировка
sonar.language=bsl
sonar.sourceEncoding=UTF-8

# Пути к исходникам
sonar.sources=src

# Настройки BSL
sonar.bsl.language-server.enabled=true
sonar.bsl.language-server.diagnostic-language=ru

# Анализировать только .bsl и .os файлы
sonar.inclusions=**/*.bsl, **/*.os

# Исключить только служебные файлы конфигурации
sonar.exclusions=**/*.cf, **/*.epf, **/*.bin, **/*.png, **/*.jpg, **/*.form, **/*.xml, **/*.mdo, **/ConfigDumpInfo.xml, **/Configuration.xml

# Токен доступа (замени на свой)
sonar.token=ТокенДоступаКПроекту

Токен доступа для  сканера

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

Перехожу в веб-интерфейс SonarQube, в правом верхнем углу нажимаю на иконку пользователя и перехожу в меню Мой аккаунт → Безопасность. Указываю имя, тип токена, срок и нажимаю Сгенерировать. Копирую токен и указываю его в файле настроек проекта вместо ТокенДоступаКПроекту и сохраняю в файл.

Копирую файлы проекта для анализа в каталог ~/Projects/CodeQualityAnalysis/ConfigurationFiles/ИмяПроекта/src

Запуск анализа проекта

Для запуска анализа выполняю скрипт scan.sh с именем проекта:

~/Projects/CodeQualityAnalysis/scan.sh ИмяПроекта

Если не передать имя проекта, будет выведена ошибка и список доступных проектов:

 ~/Projects/CodeQualityAnalysis/scan.sh
Ошибка: укажите имя проекта
Использование: /home/guesto/Projects/CodeQualityAnalysis/scan.sh <имя_проекта>
Доступные проекты:
ИмяПроекта

При успешном запуске вывод консоли будет таким:

~/Projects/CodeQualityAnalysis/scan.sh TestProject
============================================
Запуск анализа проекта: TestProject
Путь: /home/guesto/Projects/CodeQualityAnalysis/ConfigurationFiles/TestProject
============================================
04:49:55.351 INFO Scanner configuration file: /opt/sonar-scanner/conf/sonar-scanner.properties
04:49:55.358 INFO Project root configuration file: /usr/src/sonar-project.properties
04:49:55.378 INFO SonarScanner CLI 8.0.1.6346
04:49:55.385 INFO Linux 6.17.0-29-generic amd64
...
04:50:08.322 INFO Analysis total time: 7.327 s
04:50:08.323 INFO SonarScanner Engine completed successfully
04:50:08.414 INFO EXECUTION SUCCESS
04:50:08.415 INFO Total time: 13.070s
============================================
Анализ завершён!
Результат: http://localhost:9000/dashboard?id=TestProject
============================================

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

1С. SonarQube в Docker. Результат анализа

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: