Мастер-класс SonarQube. В омут с головой

19.05.22

Разработка - Рефакторинг и качество кода

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

Сначала мы попробуем проанализировать «Библиотеку стандартных подсистем» и найти в ней пару интересных замечаний. Вообще последние версии БСП написаны очень качественно, ребята за этим хорошо следят, и что-то критичное действительно будет тяжело найти.

А в конце я покажу, как работать с исходниками конфигураций 1С в Git:

  • как подготовить нашу конфигурацию к Git;

  • как натравить на нее утилиту под названием gitsync, которая поможет регулярно получать изменения из хранилища конфигурации;

  • и как с помощью планировщика Windows настроить, чтобы это происходило регулярно – возможно, не на каждый коммит (как это следовало бы сделать, если бы у вас был полноценный сервер сборок), но, тем не менее, каждое утро вы сможете получать полезный результат.
     

Содержание

Что такое SonarQube?
Установка серверной части SonarQube
Установка Java
Как запустить SonarQube
Какие могут быть проблемы при запуске
    Отсутствие Java на машине
    Закрытие окна терминала с зависанием процесса Java
    Занятые порты, на которых работает SonarQube
    Недостаток свободного места
    Проблемы использования встроенной базы данных
Подключение PostgreSQL
Sonar-Scanner
Установка плагинов
Базовые настройки сервера SonarQube
Из чего вообще состоит SonarQube
Анализ исходников БСП с помощью sonar-scanner
Ошибка с нехваткой свободного места
Что у нас есть на дашборде SonarQube
Какие настройки нужно сделать для выключения файлов на поддержке
Замечания по коду
Работа с Git
Результат исключения файлов на поддержке
Работа с Gitsync
Создание файла версий
Создание файла авторов
Автозапуск gitsync с помощью планировщика заданий Windows
Результат анализа замечаний с назначенными ответственными по данным авторов кода в хранилище
Вопросы

 

Что такое SonarQube?

 

SonarQube – это платформа для непрерывного статического анализа программного кода, где «из коробки» в бесплатной версии поддерживается 15 языков программирования. Наиболее известные – Java, C#, Swift, C++, JavaScript и PHP.

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

Язык 1С – не исключение, на платформе SonarQube есть два плагина по поддержке кода 1С. Мы сегодня познакомимся с бесплатным плагином, попробуем его поставить и что-нибудь проанализировать.

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

 

Установка серверной части SonarQube

 

 

Скачать дистрибутив SonarQube можно на странице https://www.sonarqube.org/downloads/.

Здесь видно, что SonarQube поставляется в нескольких редакциях.

  • Есть бесплатная редакция Community Edition – ее достаточно для анализа небольшого количества проектов, если не требуется поддержка необычных языков, присутствующих только в платных редакциях SonarQube.

  • Если же вы планируете параллельно и одновременно анализировать много проектов, то можете столкнуться с ограничением количества фоновых задач на сервере. В этом случае вам потребуется апгрейд до Enterprise-редакции. Но до этого еще далеко, и для начала вам вполне хватит и Community Edition.

Поддержка нескольких веток в репозитории и декорирование пулл-реквестов заявлены только в Developer Edition, однако есть отдельный бесплатный плагин, реализующий эту функциональность в Community Edition. Но сегодня мы про него рассказывать не будем.

 

 

Каждая редакция поставляется с двумя версиями:

  • LTS (Long Term Support, версия с длинной поддержкой) – сейчас это версия 8.9.8;

  • и последняя, upstream-версия – сейчас это 9.2.

Выпуски upstream-версий выходят примерно каждые два месяца, а LTS выходит в среднем раз в год.

По умолчанию по кнопке «Download for free» вы скачаете последнюю версию (на момент написания данного материала – это 9.2). А чтобы скачать LTS-версию, вам нужно прокрутить окно чуть пониже.

 

 

Еще ниже есть кнопка на скачивание всех версий – если вы захотите посмотреть, как развивался продукт или как менялся его внешний вид, можете последовательно все это поставить.

 

 

После нажатия кнопки «Download for free» вам скачается обыкновенный ZIP-архив.

Когда мы его разархивируем, у нас появится папка с названием приложения и версии (например, sonarqube-8.5.1.38104).

Если вы собираетесь использовать дальше текущую установку SonarQube на постоянной основе, рекомендую сразу переименовать каталог с указанием версии просто в «sonarqube», чтобы вам не приходилось переписывать скрипты при установке новой версии. И разместить эту папку в приличном месте, где-то рядом с прочими приложениями.

 

Установка Java

 

SonarQube – это приложение, которое написано на Java, и для его запуска вам нужна Java. Проверить, стоит она у вас или нет, можно в окне терминала по команде:

java --version

Если будет выведено сообщение, что Java не обнаружена – вам нужно поставить Java.

Если обнаружится, что установлена Java с версией меньше, чем 11, SonarQube тоже не заработает, потому что для него сейчас нужна минимум 11-я версия.

На момент написания статьи SonarQube сервер (ни версия 8.9 LTS, ни 9.2) не поддерживает Java 17, которая сейчас является последней версией с длительной поддержкой (LTS), сервер на нем физически не запустится. Поэтому для работы сервера вам нужна либо официально поддерживаемая Java 11 (тоже являющаяся LTS-версией), либо версии с 12 по 15 (которые сейчас уже не поддерживаются). Если я вас утомил этими цифрами – просто запомните, что вам нужна Java 11.

Откуда можно взять Java? Наверное, сейчас, когда каждый второй разработчик пробовал ставить себе EDT и проходил все эти приключения с установкой LibericaJDK, скорее всего какая-то java у вас стоит. Если вы пользовались последними версиями EDT, то у вас уже должна стоять 11-я Java.

 

 

Я пользуюсь дистрибутивом под названием Eclipse Temurin от https://adoptium.net – здесь можно с помощью переключателей выбрать себе 11 Java и скачать последний релиз.

Если вы работаете из-под ОС Windows, по умолчанию запустится скачивание MSI – это установщик, который сразу пропишет все нужные вам переменные среды, и Java будет готова к работе. Возможно, вам нужно будет перезайти в систему, чтобы эти переменные обновились.

Также отсюда можно отдельно скачать ZIP-архив, распаковать, добавить путь к Java в переменные PATH и JAVA_HOME (инструкции, как это сделать, можно найти в интернете).

Если вы пользуетесь пакетным менеджером chocolatey, вы можете установить Java через команду choco – там в том числе доступны Temurin и LibericaJDK. Одной командой «choco install temurin11» вы поставите Java 11.

 

 

Еще может быть ситуация, когда у вас на машине стоит несколько версий Java – допустим, в качестве основной стоит Java 8, но кроме нее есть еще Java 11, Java 15 и т.д. Или у вас основная Java 11, но вы хотите, чтобы SonarQube у вас работал на Java 15, потому что она побыстрее и дает дополнительные преимущества.

В этом случае вы можете переопределить, какая Java будет использоваться для запуска – для этого нужно внести изменения в файл wrapper.conf, который находится в каталоге conf той папки, куда вы распаковали SonarQube.

Здесь самая первая настройка, которая не закомментирована (в начале строки нет #) – это как раз-таки путь к Java.

wrapper.java.command=java

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

 

Как запустить SonarQube

 

 

В папке bin есть разные варианты запуска для Linux, для Mac, для Windows. Нас сейчас интересует запуск для Windows. Здесь есть несколько батников:

  • для запуска из командной строки вам подойдет StartSonar.bat;

  • если вы хотите установить SonarQube как Windows-службу, вы можете выполнить StartNTService.bat с ключом install.

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

 

 

Запуск делается очень просто – вы в командной строке указываете батник StartSonar.bat, пытаетесь его запустить, пройдет немного времени и, если все хорошо, в конце появится строчка «SonarQube is up».

 

Какие могут быть проблемы при запуске

 

Разберем основные проблемы, которые могут помешать запуску SonarQube.

 

Отсутствие Java на машине

Самая частая проблема, которая может возникнуть – это отсутствие Java на машине. Как эту проблему диагностировать и решать – мы уже разобрались.

 

Закрытие окна терминала с зависанием процесса Java

Второй момент, который может вызвать проблему. Если вы запустили батник StartSonar.bat – не важно, двойным кликом по батнику в Проводнике или из Терминала – и после этого закроете Терминал «по крестику», то SonarQube не остановится, он останется у вас висеть в процессах, причем, будет три java-процесса, потому что SonarQube – это многокомпонентное приложение. Чтобы его остановить, вам придется «убивать» все эти три процесса из Диспетчера задач. Неудобно.

Стандартный сценарий остановки SonarQube – это в Терминале, где мы ранее увидели «SonarQube is up», нажать комбинацию клавиш Ctrl+C – и на Windows, и на Linux работает одинаково.

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

 

Занятые порты, на которых работает SonarQube

 

 

Следующая популярная проблема – это занятые порты, на которых работает SonarQube. Самое частое, что может быть – это занятый 9000 или 9001 порт. Для демонстрации этой проблемы я сейчас на локальном порту 9000 запущу в docker-контейнер с Ubuntu командой.

docker run --rm -p 127.0.0.1:9000:9000 -it ubuntu

И попробую снова запустить SonarQube.

 

 

Сначала он какое-то время подумает, потом запустит Elasticsearch – компонент, который используется для полнотекстового поиска, быстрого поиска замечаний, информации по коду и т.д.. А потом, когда будет пытаться запустить процесс web – веб-сервер для сайта, который должен вам отвечать по 9000 порту – вы неожиданно увидите сообщения:

Process[web] is stopped
Process[es] is stopped
SonarQube is stopped

Не понятно, что делать дальше, и куда копать. Но есть одна подсказка – какой процесс первым остановился, тот по факту и упал.

Ищем в папке sonarqube папку logs и смотрим, что написано в файле web.log.

 

 

В самом низу этого файла вы должны увидеть вполне корректное исключение Java, по которому можно косвенно догадаться, что он попытался что-то поднять на 9000 порту, и у него это не получилось.

 

 

Как проверить, чем занят 9000 порт?

Для этого вы можете использовать команду netstat с флагом -ano, который добавит дополнительную информацию по процессам и PID (команда netstat доступна и в Windows, и в Linux).

Чтобы отфильтровать в выводе команды только строки, имеющие отношение к порту 9000, попробуем через вертикальную черту передать тот самый порт 9000:

  • в случае Windows – на утилиту findstr, которая будет искать в выводе какую-то информацию;

  • в случае Linux – на grep.

Я выполняю команду:

netstat -ano | findstr 9000

Вывод команды показывает, что порт 9000 сейчас используется – он прослушивается (находится в статусе LISTENING) и занят процессом с PID 17888.

 

 

Дальше – открываем диспетчер задач, переходим на закладку «Подробности», упорядочиваем по колонке «ИД процесса» и ищем этот процесс.

Судя по всему, порт 9000 у меня занят docker-ом. В вашем случае это может быть что-то другое. Часто можно столкнуться с проблемой запуска Apache на 80-м порту, потому что его занимает Skype.

С помощью команды netstat вы можете узнать ИД процесса, который занимает выбранный вами порт, и понять, что конкретно нужно тормознуть. В случае docker – на каком порту остановить контейнер.

 

 

Освобожу порт 9000, который мешает серверу web – остановлю контейнер ubuntu.

 

 

Теперь запущу такой же контейнер на порту 9001, чтобы показать другую ошибку.

 

 

Снова запускаю SonarQube.

Теперь первым остановившимся процессом у нас стал Elasticsearch, значит, нам в каталоге logs нужно искать файлик es.log.

 

 

Также прокручиваем его вниз и видим ошибку failed to bind 9001 (не смог занять порт 9001, чтобы начать его слушать). То есть проблема та же самая.

 

 

Смотрим, кто у вас занял порт 9001. В моем случае это опять процесс 17888 – docker, а значит нужно опять остановить какой-то контейнер.

 

 

Я его останавливаю, и после этого SonarQube уже должен запуститься без ошибок.

 

Недостаток свободного места

Четвертая частая проблема, которая может быть при запуске SonarQube – это недостаток свободного места. В новых версиях SonarQube вы это обнаружите не сразу, а чуть позже. В ранних версиях SonarQube у вас рухнет StartSonar.bat сразу же при запуске.

На текущей машине стоит версия, которая на старте не рухнет, так что ошибку с недостатком свободного места я покажу вам чуть позже.

 

Проблемы использования встроенной базы данных

Дожидаемся, пока у нас стартанут все компоненты:

 

 

  • у нас запустился es – на этот раз без ошибок;

  • запустился web – без ошибок;

  • запустился третий компонент ce – compute engine, который обрабатывает фоновые задания в SonarQube;

  • и дальше мы видим заветную строчку «SonarQube is up».

 

 

Переходим в браузер, открываем адрес localhost:9000 и сразу видим веб-интерфейс SonarQube на английском языке.

 

 

Для входа в систему вводим данные авторизации (логин admin и пароль admin) и нажимаем на кнопку Log In.

 

 

Готово! Можем переходить в настройки администрирования, создавать новые проекты и т.д. Я бы мог дальше продолжить свой рассказ, если бы не одна большая страшная надпись внизу – в вольном переводе здесь написано, что встроенная база данных должна использоваться только для целей демонстрации или тестирования.

Если вы собираетесь текущим инстансом SonarQube пользоваться больше, чем один день – вы хотите регулярно анализировать свою конфигурацию, показать его своим коллегам, перенести на централизованный сервер внутри вашей компании – то текущая установка ни в коем случае не полная, и вам обязательно нужно подключить СУБД.

Дело в том, что, во-первых, встроенная база данных не очень производительная – на малых объемах она справляется достаточно хорошо, но, когда мы начинаем грузить сюда ERP с его 10 миллионами строк кода и сотнями тысяч замечаний, она начинает немного «проседать». Если вы грузите туда больше одного проекта, она начинает «проседать» все больше и больше.

А вторая проблема – самая страшная – встроенная база данных не поддерживает обновление версии SonarQube и какую-либо миграцию на другую СУБД.

Если вы начали активно использовать SonarQube и не переехали на СУБД, то вы на этой внутренней базе данных останетесь навечно (и потонете в легаси). Это прямо совсем не круто.

 

Подключение PostgreSQL

 

 

В качестве решения вы можете поднять PostgreSQL, например.

Я сейчас не буду поднимать инстанс PostgreSQL через инсталлятор, создавать базу через pgadmin и т.д. Я очень быстро – одной командой в Docker – запущу PostgreSQL под пользователем postgres с паролем postgres и автоматически создам базу с названием sonarqube:

docker run --name postgres --rm -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=sonarqube postgres

Если вы захотите запустить эту команду у себя, то обратите внимание, во-первых, на флаг удаления контейнера после его установки (--rm), а во-вторых, на отсутствие каких-либо примонтированных каталогов для сохранения данных. Так что будьте осторожны – если вы хотите все-таки использовать postgres в docker, все-таки почитайте документацию, как его поднимать, либо используйте postgres из инсталлятора. И желательно на Linux, т.к. PostgreSQL на нем работает лучше, чем на Windows.

 

 

Как нам натравить SonarQube на использование PostgreSQL?

Останавливаем текущий инстанс через Ctrl+C.

И открываем файл sonar.properties из каталога conf папки, куда установлен SonarQube.

Здесь есть очень-очень много настроек – они все детально задокументированы.

Но нас здесь сейчас интересует настройка подключения к базе данных – sonar.jdbc.url.

Обратите внимание, в файле есть примеры подключения к различным базам данных – это Oracle, PostgreSQL и MS SQL (MySQL больше не поддерживается).

Для PostgreSQL есть пример строки подключения – мы его чуть-чуть поменяем.

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

 

 

По умолчанию строка подключения к PostgreSQL выглядит так:

sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema

Это значит, что:

  • мы используем провайдер postgresql;

  • сервер у нас крутится на localhost;

  • СУБД, которая будет использоваться, называется sonarqube;

  • currentSchema – схема баз данных.

Поскольку у нас используется схема баз данных по умолчанию («public»), параметр currentSchema нужно удалить.

 

 

Вместо этого допишем данные авторизации:

sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?user=postgres&password=postgres

Естественно, в реальной инсталляции правильнее завести отдельного пользователя, раздать права и т.д., чтобы все было по-правильному.

Сохраняем файл sonar.properties.

 

 

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

Но если у вас этот инстанс уже использовался, вы уже делали там какие-то настройки, запускали анализ, я рекомендую вам в папке data удалить папку es6 – это данные полнотекстового поиска, который построил Elasticsearch внутри SonarQube. В случае наслоения данных разных БД (в том числе, внутренней и postgres), могут вылезать непонятные артефакты – вы можете увидеть проекты, которых на самом деле нет, или замечания, которые уже удалились.

Поэтому просто удаляете папку es6, перезапускаете сервер, при запуске он вам эту папку создаст заново и постарается подключиться к СУБД PostrgreSQL.

 

 

Как видите, сервер у нас поднялся, а страшная надпись пропала, значит, наш сервис уже более-менее готов к использованию.

 

Sonar-Scanner

 

SonarQube – многокомпонентное приложение, в нем есть:

  • отдельный компонент, который отвечает за серверную часть и складывает результат в базу данных;

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

  • и отдельный компонент, который отвечает за анализ исходников.

С серверной частью SonarQube мы уже разобрались, веб-интерфейс SonarQube увидели, теперь посмотрим, как происходит анализ на стороне клиента.

 

 

Компонент, который отвечает за анализ исходников, называется sonar-scanner, его можно скачать с сайта https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/.

Рекомендую вам обратить внимание на сайт docs.sonarqube.org – здесь очень много информации о том, как настроить SonarQube, как использовать sonar-scanner, какие есть параметры для анализа – иногда даже какие-то неочевидные вещи. В том числе здесь есть информация о том, как запускать Java-проекты, как запускать C#-проекты, как интегрировать это все с Jenkins, если вы его используете и т.д. Надеюсь, вам это будет полезно.

Обратите внимание, здесь в разделе загрузок есть несколько вариантов установки. Казалось бы, можно взять установщик на Windows 64-бита и радоваться жизни. Но ссылка Windows 64-bit отличается от ссылки Any (Requires a pre-installed JVM) тем, что в дистрибутивах, которые заточены под конкретную операционную систему, внутри запакована какая-то Java, причем, не самой первой свежести. Причем, насколько я помню, даже не с последними security-патчами.

Поэтому, если вы торопитесь, вы можете установить дистрибутив Windows 64-bit, но, поскольку Java у вас на машине уже стоит, лучше сразу скачать any-установку.

 

 

Скачанный архив мы распакуем также в каталог рядом с sonarqube, и для красоты переименуем его в просто sonar-scanner.

 

 

Структура каталога sonar-scanner примерно такая же, как у самого sonarqube:

  • в каталоге bin лежат файлы, которые непосредственно будут запускаться;

  • в каталоге conf лежат общие настройки sonar-scanner.

В файле sonar-scanner.properties вы можете прописать значения по умолчанию для всех анализов.

 

 

И в самом запускающем bat-нике (sonar-scanner.bat) можно, например, переопределить местонахождение Java (по умолчанию он ищет Java в переменной среды JAVA_HOME либо в переменной среды PATH, но вы можете это здесь поменять).

Чтобы у вас sonar-scanner запускался из командной строки без прямого пути, вы можете открыть свойства компьютера, дополнительные параметры системы, переменные среды, найти переменную среды PATH и добавить сюда каталог bin из папки sonar-scanner (например, под Windows 10):

 

 

После этого, когда вы сохраните значение переменной PATH и переоткроете командную строку (перезапустите cmd), у вас sonar-scanner будет доступен уже без прямого указания – просто по имени sonar-scanner.

 

Установка плагинов

 

Вернемся к веб-интерфейсу SonarQube. Что мы можем сделать, чтобы упростить себе работу?

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

Для этого нужно перейти в раздел Administration по гиперссылке Marketplace.

 

 

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

Первый же плагин в это списке – это плагин для поддержки 1С – 1C (BSL) Community Plugin. Это бесплатный плагин, который доступен для установки прямо из маркетплейса. Нажимаем кнопку Install.

 

 

И второе, что нас здесь интересует – это плагин Russian Pack. Тоже нажимаем кнопку Install.

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

Надеюсь, мы все-таки догоним версию 8.5, и все переводы будут актуальны. В этой версии вы можете встречать какие-то места, которые переведены не до конца. Но в целом, большая часть интерфейса будет на русском.

 

 

Плагины установились и просят перезагрузить SonarQube.

Обратите внимание, куда все это скачивается.

 

 

Никакой магии нет. В каталоге sonarqube есть папка extensions, здесь есть папка downloads, куда складываются текущие плагины, которые вы скачали, но которые еще не применились к установке и не поставились на сервер.

И папка plugins, в которой лежат сторонние, не зашитые в ядро SonarQube плагины, которые вы поставили отдельно.

После перезагрузки jar-файлы из папки downloads переместятся в папку plugins, и все должно заработать автоматически.

Есть два момента:

  • Во-первых, в папке plugins не должно быть нескольких jar-файлов плагинов с одним и тем же ключом. Ключ обычно зашит в середине наименования – в случае 1С-ного плагина это communitybsl. Если ваш сервер увидит несколько jar-файлов на один и тот же ключ плагина, он не запустится. Он тоже напишет ошибку в web.log о том, что обнаружено дублирование плагинов, вам нужно будет этот конфликт как-то разрешить.

  • Второй момент – если у вас сервер запущен, и вы просто положили плагин в папку plugins, сервер об этом ничего не знает, его нужно будет перезагрузить для того, чтобы он подхватил новые изменения, загрузил их в память и стал использовать для дальнейшей работы.

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

Нажимаем кнопку «Restart Server», которая перезагрузит SonarQube. Также возможность перезагрузки доступна из вкладки «System» – там справа вверху будет кнопка «Перезагрузка сервера», которая сделает то же самое.

 

 

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

 

 

Как мы видим, после перезагрузки нас уже приветствует русский интерфейс.

 

 

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

 

Базовые настройки сервера SonarQube

 

 

Какие есть базовые настройки на уровне сервера?

Конечно же, вас будет интересовать настройка почты, потому что вам, скорее всего, захочется настроить рассылку о замечаниях. Настройка почты находится в разделе «Общее» – «Электронная почта». Здесь вы можете указать – откуда, куда, параметры подключения, SMTP-host и т.д.

 

 

Также, если вы все-таки планируете этот сервер показывать кому-то еще, если он у вас будет работать долго, вам нужно включить явное требование авторизации, которое находится в разделе «Безопасность» – это параметр
«Force user autentification». Эта штука закроет ваш инстанс SonarQube от просмотра проектов без предварительного логина, в том числе неавторизованный пользователь не сможет выполнять анализ.

 

 

Я тоже сейчас эту опцию включу, потому что хочу показать вам работу с авторизацией.

 

Из чего вообще состоит SonarQube

 

Сверху есть панель с разделами – это, по сути, самые главные компоненты, которые есть в сервере.

 

 

На закладке «Проекты» будут отображаться проекты – мы совсем скоро проанализируем здесь свой первый проект.

 

 

На закладке «Замечания» будут отображаться замечания для имеющихся у вас проектов – их тоже можно будет посмотреть с различными фильтрами, мы это тоже сегодня проделаем.

 

 

На закладке «Правила» можно посмотреть, какие правила доступны для использования – например, вы можете отобрать по языку «1С (BSL)» и увидеть 123 доступных на текущий момент правила (151 на 2022-05-01).

 

 

Здесь можно посмотреть описание каждого правила:

  • к какому типу оно относится – ошибка, уязвимость, либо дефект кода;

  • какая у него важность;

  • какие у него теги;

  • когда это правило появилось;

  • и, наверное, самое полезное – это сколько технического долга приносит каждое срабатывание такого правила.

Если в вашем коде будет обнаружено использование параметра АвтоТест, то размер технического долга на вашем проекте увеличится на одну минуту.

Примерно так технический долг и считается:

  • мы берем все замечания, которые сработали на ваш проект;

  • умножаем их на значение времени на исправление;

  • получаем какую-то большую цифру в часах. Делим ее на 8 (потому что у нас стандартный 8-часовой рабочий день) и получаем количество долга в днях.

 

 

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

 

 

Например, у нас есть встроенный профиль качества «BSL Language Server rules» – это движок анализа, который предоставляет все эти данные. Нажмём гиперссылку активных правил, чтобы вывести их список.

 

 

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

 

 

Откроем правило «Ограничение на длину строки», которое по умолчанию имеет настройку в 120 символов.

Создавая собственные профили качества, вы можете эти настройки переопределять, включать или выключать какие-то правила, тюнить настройки анализа под себя (в конце мастер-класса я это покажу).

 

 

И последний важный компонент – это так называемый «порог качества». В SonarQube вообще есть идея о том, что вам нужно не допускать ухудшения состояния вашего программного продукта путем контроля некоторых очень важных метрик. Например, у вашего проекта «не должно быть новых ошибок и уязвимостей» или «соотношение технического долга, который вы добавили в новой версии, не должно превышать какого-то определенного порога».

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

Обратите внимание, что он ожидает 80% покрытие, о чем нам в 1С можно только мечтать. Но все это дело тоже можно поменять и подтюнить под ваше конкретное использование.

 

Анализ исходников БСП с помощью sonar-scanner

 

 

Переходим к анализу нашей конфигурации.

У нас здесь БСП версии 3.1.323 – это последняя БСП, которая опубликована на сегодня (прим. ред.: ноябрь 2020 г.). Она у нас с заблокированной возможностью изменения.

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

SonarQube анализирует только исходники конфигурации – он ничего не знает про CF-файлы, про EPF-файлы и прочее, что связано с 1С-спецификой. Поэтому для анализа нам нужно выгрузить конфигурацию в файлы.

 

 

Я создам новый каталог SSL, внутри которого создам подкаталог src, в котором создам каталог cf.

Я это делаю для двух целей:

  • Во-первых, потом мы это превратим в Git-репозиторий, а в Git-репозитории помимо исходников конфигурации обычно лежат еще всякие конфигурационные файлы, тесты, документация и т.д. Если исходники будут лежать прямо в корне – это будет нехорошо.

  • Во-вторых, когда мы натравим на исходники gitsync, у него есть особенность – он чистит каталог с исходниками, поэтому, если вы будете выгружать в корень репозитория, у вас удалится все.

 

 

Выгружаем конфигурацию в созданную нами папку.

Пока идёт выгрузка, откроем еще один терминал, перейдём в созданный каталог и в этом каталоге мы сейчас запустим sonar-scanner, который мы уже добавили в переменную среды PATH (либо придется прописать полный путь).

И здесь мы укажем ему несколько важных настроек.

Самая важная настройка, которая есть в анализе – это ключ проекта. Без передачи ключа проекта у вас ничего не заработает. Ключ проекта можно задавать:

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

Мы зададим ключ проекта в командной строке:

sonar-scanner -Dsonar.projectKey=ssl

Для передачи параметра мы ставим -D, для указания ключа проекта используется параметр sonar.projectKey и через знак равенства указываем, что sonar.projectKey=ssl.

Запускаем.

 

 

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

И дальше мы ловим первую ошибку – SonarQube нам говорит о том, что мы не авторизованы. Это как раз та защита от внешних вредителей, которые могут попортить наш сервер – нам нужно передать настройку sonar.login и sonar.password. На самом деле, это старые настройки, сейчас достаточно передать только sonar.login, в который нужно передать аутентификационный токен.

 

 

Токен берется из вашего аккаунта – вы можете зайти в ваш аккаунт, перейти на вкладку «Безопасность» и сгенерировать новый токен.

 

 

Токен – это последовательность символов, которая будет вам показана только один раз. Если вы обновите страницу, токен уже пропадет – он больше не отображается, просто написано, когда он был создан, как он называется и когда он последний раз использовался.

Этот самый токен вы можете передать как значение sonar.login – это такой комбинированный логин и пароль.

sonar-scanner -Dsonar.projectKey=ssl -Dsonar.login=[токен] -Dsonar.sourceEncoding=UTF-8 -Dsonar.sources=src/cf -Dsonar.inclusions=**/*.bsl

И также я передам несколько дополнительных настроек, которые нужно задавать под Windows, а именно:

  • sonar.sourceEncoding=UTF-8 - кодировка исходных файлов. Вы можете увидеть сообщение от Sonar о том, что он начал читать файлики в 1251. Это происходит потому, что Java под Windows по умолчанию работает в системной кодировке, которая, к сожалению, ANSII, а не UTF-8. Но мы это дело можем исправить, передав параметр sonar.sourceEncoding.

  • sonar.sources=src/cf - чтобы SonarQube было меньше сканировать, мы поможем ему, указав путь к исходникам через sonar.sources – это поможет вам сократить количество файлов, которые изначально захватываются для анализа. Например, если вы анализируете JavaScript, вам не нужно анализировать node_modules, потому что там сотни тысяч файлов, которые будут очень долго анализироваться, а вам это не нужно, поэтому вы можете натравить анализ на конкретный каталог.

  • sonar.inclusions=**/*.bsl - маска для поиска файлов. Здесь «**» означают, что нам нужно искать во всех каталогах любой вложенности. «*.bsl» говорит о том, что нам нужно искать bsl-файлы с любым именем;

  • Если вы захотите исключить какие-то файлы из анализа – например, часто исключаются регламентированные отчеты либо отчетность целиком – вы можете исключить их, передав дополнительное свойство sonar.exclusions.

Запускаем.

 

 

Анализ у нас уже начался, и мы видим, что:

  • наши исходники уже переключились в UTF-8;

  • мы не подхватили настройки системы контроля версий (у нас никакой системы контроля версий нет);

  • мы будем анализировать 2.5 тысячи файлов;

  • при этом 7000 файлов мы заигнорировали – это все файлы xml, html, zip, png и прочие файлы, которые лежат в исходниках конфигурации.

Я рекомендую в обязательном порядке отключать анализ xml, потому что на xml-файлы вы получите триллионы замечаний, которые вам не нужны, потому что вы xml-файлы все равно редактировать не будете. Я рекомендую ограничиваться только bsl и теми файлами, в которых вы реально пишете код – например, os для OneScript.

 

 

Наш анализ на клиентской стороне завершился – у нас появилась ссылка, по которой мы можем увидеть результаты проверки проекта, а также ссылка для опроса по API результатов текущего анализа.

 

 

Что это значит? Когда мы проанализировали исходники, мы изначально ожидаем, что, когда мы открываем проект, здесь сразу будет информация об обнаруженных проблемах. Но это не так, потому что мы выполнили только клиентскую часть анализа. После того, как sonar-scanner на клиенте проанализировал наш исходный код, он отправляет его на сервер, где сервер уже разбирает эти результаты анализа, складывает их в СУБД и строит индексы полнотекстового поиска в Elasticsearch. У вас может быть сервер на одной машине, sonar-scanner на другой машине - они работают независимо. Причем, нагрузка обычно больше будет на ту машину, на которой находится sonar-scanner – эта утилита более требовательна к ЦПУ, активнее читает диск и т.д. А на сервере все может быть полегче.

Через какое-то время все это закончит анализироваться, и мы сможем посмотреть результаты.

 

Ошибка с нехваткой свободного места

 

 

Пока у нас анализируется, я сделаю хитрую настройку, которая позволит мне показать вам ошибку с недостатком свободного места. Эта настройка позволит мне создать файл размером 300Гб.

 

 

Сейчас я забил свободное место на диске практически под ноль.

 

 

Что получилось – SonarQube у нас вроде бы работает, с ним все хорошо, анализ нашего проекта завершился, мы видим какое-то количество метрик, но у нас есть информация, что «Анализ проекта has failed» и дополнительная информация доступна на странице фоновых заданий.

 

 

А здесь мы видим, что это фоновое задание обработки результатов нашего проекта завершилось с ошибкой.

Что же произошло? Если мы нажмем на «шестеренку», мы можем увидеть различную дополнительную текстовую информацию.

 

 

Контекст сканера говорит нам о том, какие плагины были установлены, какие настройки использовались для анализа, на какой сервер мы это отправляли – но все это мы и так знаем.

 

 

Самое интересное – это «Показать подробности ошибки». Здесь мы видим, что из компонента Elasticsearch нам пришло исключение, в котором написано Unrecoverable indexation: 1 errors among 1 request.

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

 

 

Открываем файл лога Elasticsearch, прокручиваем результаты вниз и видим, что у нас появились какие-то дополнительные непонятные ворнинги – явно что-то пошло не так. SonarQube говорит нам о том, что на нашем диске, на котором расположен Elasticsearch, занято более чем на 95%. Т.е. осталось мало свободного места.

В более старых версиях SonarQube это приводило к интересным моментам, когда Elasticsearch понимал, что на текущем узле осталось мало места, значит, нужно переехать на другой. Но в кластере по умолчанию есть только один узел, поэтому он переезжал сам на себя и в итоге уходил в бесконечный цикл – видел, что места нет и начинал переезд дальше.

Как это исправить? Никак, кроме как освободив свободное место. Если у вас осталось меньше 20 Гб (для моего диска), то у вас будут проблемы с использованием SonarQube, вам нужно будет либо его куда-то уносить на виртуальный диск с более безопасным распределением свободного места, либо просто чистить.

 

 

В частности, здесь написана информация о том, что все индексы Elasticsearch на этом узле помечены как readonly – вы не сможете что-либо менять в текущем инстансе Elasticsearch.

У вас будет падать весь анализ, который у вас происходит в системе.

 

 

После удаления файла на 300Гб наш анализ должен завершиться успешно – я его сейчас еще раз запущу, но частично мы уже сможем исследовать сам веб-интерфейс, потому что часть данных все-таки успела сохраниться.

 

Что у нас есть на дашборде SonarQube

 

 

На закладке Overall Code у нас есть информация о том, что происходит в целом по коду. Видно, что у нас есть 991 ошибка, 253 уязвимости (на самом деле, уязвимостей там нет, это очень спорные моменты, в основном ошибки типа False Positive).

И есть 44 тысячи дефектов кода – это либо нарушения стандартов разработки 1С, либо нарушения каких-то правил, заложенных BSL LS. Суммарно технического долга по дефектам кода набралось почти на 400 дней.

 

 

Также есть информация о том, сколько в нашем проекте процентов копипаста (дублирования кода). И сколько участков с копипастом.

На каждый показатель можно нажать и «провалиться».

 

 

Я провалился на дублирующиеся участки, и можно увидеть, что, например, информация из плана обмена _ДемоОбменСБиблиотекойСтандартныхПодсистем с 9 по 200 строку дублируется с информацией из другого плана обмена.

 

 

Если мы перейдем туда, мы увидим тот же самый кусок кода, который будет указывать на соответствующее дублирование.

Как диагностируются дубликаты? К сожалению, сейчас это происходит «втупую» – исходный код разделяется на токены – неделимые лексемы (идентификаторы, операторы, знаки пунктуации и т.д.), все это «скармливается» особому компоненту системы (он нам не подконтролен), который эти токены загружает в какую-то «молотилку».

Там есть определенные пороги – по умолчанию он считает, что если есть 70 токенов в блоке минимум 10 строк, которые повторяются в другом участке кода, значит, это дублирование кода. Такой участок помечается как дубликат.

К сожалению, реальность 1С нас очень часто сталкивает с такими ситуациями – в процедурах «ПриСозданииНаСервере» часто происходит подключение дополнительных подсистем – версионирования, управления доступом, контактной информации. Все эти обработчики попадут в дубликаты – и да, это грустно.

Мы можем попробовать что-то с этим сделать на стороне плагина, но это, к сожалению, не так просто. А у пользователя сейчас на это повлиять возможности нет вообще, кроме как увеличить порог, на котором сработает копипаст (но его можно случайно выкрутить до такого состояния, что вам анализ в итоге ничего не покажет).

Грубо говоря, анализ дублирования сейчас производится по тексту. Нашел кусок текста, который совпадает, значит, это копипаст.

 

 

На закладке «Показатели» есть довольно много информации о нашем проекте. Конечно, покрытия у нас никакого нет, но можно посмотреть распределение ошибок по каким-то модулям – так называемая bubble-диаграмма.

Например, можно увидеть, что в каком-то модуле (на него можно кликнуть и перейти) 8 тысяч строк кода и 17 ошибок – это проблема.

 

 

Такая же информация есть по нарушению стандартов кодирования – по дефектам кода.

 

 

Можно походить по папкам, пооткрывать какие-то файлы и увидеть эти нарушения.

 

 

Здесь есть дополнительная информация по размеру:

  • количество строк кода – у нас текущая версия БСП содержит 608 тысяч строк кода

  • количество строк всего – 966 тысяч строк;

  • количество функций;

  • количество файлов;

  • количество строк комментариев;

  • плотность (%) комментариев.

И есть два показателя – цикломатическая и когнитивная сложность:

  • цикломатическая сложность показывает, насколько сильно код ветвится и сколько нам потребуется тестов, чтобы его полностью протестировать – нужно написать 137 тысяч юнит тестов;

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

 

 

Давайте откроем какой-нибудь общий модуль – например, «АдминистрированиеКластера». Здесь 631 строка кода и в них – 51 дефект.

 

 

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

 

Какие настройки нужно сделать для выключения файлов на поддержке

 

 

В настройках проекта (Project Settings) либо в настройках сервера в целом есть подраздел для 1С.

Здесь есть свойство «Skip computing diagnostics on modules with parent configurations», которое отвечает за то, какой статус замочков на файлах (либо это «желтый куб с замком», либо это просто «желтый куб») будет исключаться из анализа:

  • по умолчанию указано значение «never» – т.е. мы никакие файлы из анализа не исключаем;

  • а если вы в разработке придерживаетесь правила, что все объекты поставщика должны быть на замках, то вы можете поставить настройку «with support locked» («замок на желтом кубе») и тогда у вас файлы исключатся из анализа. Они будут выгружаться на сервер, по ним будут считаться метрики, но замечания по ним диагностироваться не будут;

  • если же у вас бОльшая часть объектов «снята с замков» (или вся конфигурация «снята с замков»), но вы эти модули не дорабатываете, вы можете переключить значение на «with support» (все файлы на поддержке будут считаться данными от поставщика и тоже будут исключаться).

Мы сейчас в настройках поддержки включим возможность изменения БСП, но остальную конфигурацию оставим «на замках», поэтому я ставлю значение «with support locked».

 

 

Итак, снимем замок для ряда БСП-шных общих модулей.

 

 

После этого нам нужно повторно выгрузить конфигурацию в файлы – поверх нашего текущего каталога. Вместе с файлами в каталог Ext выгрузится файл ParentConfiguration.bin, в котором находятся настройки поддержки.

 

 

Это – огромный скобочный файл, эта комбинация нулей и единичек как раз означает настройки поддержки. Анализатор читает эти настройки и на их основании как раз понимает, какие файлы нужно исключать из поддержки или нет.

Если вы используете анализ в исходниках Git, не кладите файл ParentConfiguration.bin в .gitignore. Если вам страшно, что он большой, положите его под git lfs. Но если он у вас будет заигнорирован, информацию о замках рассчитать не получится, и все файлы будут лететь в анализ.

 

 

Итак, у нас завершился второй анализ. Мы можем увидеть вкладку New Code, которая нам говорит о том, что никакого нового кода и никаких привнесенных ошибок нет – это логично, потому что мы ничего не меняли.

 

 

Данные целиком по конфигурации все так же есть на Overall Code.

 

Замечания по коду

 

 

И мы, наконец-то, можем перейти на закладку «Замечания» и посмотреть, какие тут есть интересные штуки.

Во-первых, обратите внимание на фильтры – мы можем посмотреть только ошибки, например, со статусом «Блокирующие» – это наиболее важные ошибки, которые должны останавливать конфигурацию от наката на прод, потому что здесь явно что-то очень-очень плохо.

 

 

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

Если в контексте, в котором вы работаете, этот общий модуль будет доступен (серверный общий модуль), у вас в рантайме вывалится ошибка присвоения значению недопустимого типа.

 

 

Вы можете нажать на гиперссылку «Why is this an issue?» и увидеть описание этой диагностики.

 

 

Еще есть интересная ошибка из разряда блокирующих. Тут это так называемый False Positive, потому что тут нет никакого унарного плюса в конкатенации строки, потому что очевидно, что минуты смещения – это будет число. Но просмотр этой ошибки наталкивает на мысль, что тут что-то не так. Если мы посмотрим на код, мы можем догадаться, что имел в виду автор. Если минуты смещения – это отрицательное число, то нужно инвертировать это значение, чтобы получить положительное. Но вместо минус МинутыСмещения, автор написал +МинутыСмещения.

То есть, код, грубо говоря, не делает совсем ничего.

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

 

 

Что еще есть интересного?

В критических замечаниях меня больше всего радует запрос в цикле.

Здесь можно отфильтроваться по конкретному правилу и увидеть все, что мы любим.

 

 

Например, «Для каждого… Запрос.Выполнить().Выгрузить()[0].Значение»

Да, в какие-то моменты это допустимо – есть алгоритмы, которые очень трудоемко написать по-другому либо вообще невозможно из-за ряда технических ограничений. Но в большинстве случаев, если вы видите такую ошибку, то вы знаете, что разработчику нужно что-то с этим сделать.

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

Можете пощелкать по замечаниям, увидеть, как у нас меняется позиционирование в файлике.

 

 

Еще из интересного – проверки, которые касаются транзакций:

  • парность транзакций – НачатьТранзакцию / ЗафиксироватьТранзакцию;

  • неправильность расположения кода перед Попыткой и после Попытки.

В данном конкретном случае то, что ЗафиксироватьТранзакцию находится не перед Исключением, не приведет к проблеме (это «всего лишь» нарушение стандарта по работе с транзакциями), но, тем не менее, любое неосторожное движение, и с этим кодом может быть что-то не так:

  • например, если мы пропустим «Продолжить», то можем случайно два раза зафиксировать транзакцию (это по поводу нарушения парности вызова);

  • также может быть еще проблема с тем, что у нас «НачатьТранзакцию» идет до начала Попытки, и какой-то код, который попадет в транзакцию, у нас «вывалится» прямо между этими двумя строками и не откатится, потому что у нас не используется «ОтменитьТранзакцию».

Я из своего опыта очень много проблем в этим выловил с прода, и SonarQube мне в этом плане очень помог.

 

 

Еще можно посмотреть присвоение переменной самой себе – ошибка не особо страшная, но ее обнаружение позволяет устранить некоторые трудноуловимые баги.

 

 

Я обратил внимание, что в БСП много таких конструкций, когда идет присваивание переменной самой себе, после которого выводится комментарий с типом этого значения. Видимо, либо EDT, либо какие-то внутренние инструменты, которые используются в БСП, позволяют дополнительно типизировать таким образом – как в Снегопате типизирующие комментарии через двоеточие. Внутри БСП тоже что-то похожее используется – это очень наглядно таким образом отлавливается.

 

Работа с Git

 

 

Я вчера заранее уже закоммитил проект БСП в git с выключенной поставкой. Заранее – потому что первый коммит исходников в Git выполняется очень долго, я ждал минут 15, пока это закоммитится.

В репозитории есть файл .gitignore, в котором указан каталог .scannerwork.

Сам коммит не составляет никакой сложности:

 

 

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

git init

 

 

Потом, чтобы все добавить в индекс гита, пишете:

git add .

(внимание – точка обязательна!). Ждете какое-то количество времени.

 

 

И потом делаете коммит:

git commit -m ”Тут пишете комментарий”

Все дополнительные настройки Git мы оставим за рамками мастер-класса.

 

 

Итак, сейчас у нас в git уже есть некий проект ssl_demo.

Чтобы просто выгрузить все эти исходники в git и получить в SonarQube замечания, которые назначены на каких-то конкретных людей, нужно выполнить две вещи – во-первых, у каждого пользователя должна быть задана его почта.

 

 

К сожалению, почта заполняется только администратором сервера в настройках администрирования на вкладке «Безопасность» – «Пользователи».

 

 

Находите нужного вам пользователя и нажимаете на «шестеренку» – «Обновить подробности».

 

 

Здесь указываете, какая у него электронная почта используется для анализа – почта, из-под которой этот пользователь коммитил.

 

 

После этого строки кода, в которых были обнаружены замечания и в которых SonarQube по истории Git’а поймет, что эти строки менялись вами, автоматически «повесятся» на вас. Причем, они «повесятся» двумя разными способами – в замечаниях есть:

  • Автор (это информация о почте) – я пока запускал sonar-scanner из каталога без репозитория Git, поэтому у меня здесь пусто.

  • Назначенный – это грубо говоря, исполнитель, который будет менять какое-то конкретное замечание.

Вы любое замечание можете назначить на любого исполнителя.

 

 

Вы можете массово «перевесить» все эти замечания на какого-то конкретного человека.

Либо назначенный будет подставляться автоматически по соответствию почты в Git и настройках пользователя.

 

Результат исключения файлов на поддержке

 

 

Хочу обратить внимание, что после запуска с исключением файлов на поддержке в нашей конфигурации стало заметно меньше «плохокода», потому что мы в настройках поддержки конфигурации включили возможность изменения и сняли «замочек» только с части модулей, а в настройках проекта указали «with support locked».

У нас теперь показывается только код по нашему изменённому модулю.

 

Работа с Gitsync

 

 

По Git – я этот проект удалю, потому что SonarQube не умеет переназначать замечания, если ему «приехала» информация о Git.

 

 

Но мы сейчас точно так же запустим sonar-scanner, и через какое-то время проект появится снова.

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

Gitsync – это приложение, которое написано на OneScript.

 

 

OneScript – это виртуальная машина для выполнения кода 1С. Кто еще не знает, перейдите на сайт oscript.io. Здесь можно почитать, что это такое, почитать документацию, скачать.

Также установить OneScript можно с помощью OneScript Version Manager.

 

 

Сам Gitsync ставится очень просто через пакетный менеджер opm, который входит в состав OneScript по команде (Важно: в cmd, запущенном с правами Администратора Windows, если вы устанавливали OneScript через msi-инсталлятор, а не через OVM):

opm install gitsync

Opm скачает, распакует и установит gitsync.

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

 

 

Чтобы выполнить саму синхронизацию, нам нужно будет использовать команду sync.

Чтобы посмотреть по ней справку и понять, как с ней работать, можно набрать

gitsync sync help

Как видите, здесь используется типичная командная строка для запуска с опциями, после которых нам нужно передать путь к хранилищу конфигурации.

 

 

Давайте я создам новое хранилище, чтобы с версиями все было хорошо.

 

 

И под Администратором без пароля всю конфигурацию в хранилище выгрузим.

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

 

 

Если выполнить

gitsync plugins ls -a

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

Плагин increment позволяет нам включить инкрементальную выгрузку. Активируем его командой:

gitsync plugins unable increment

Плагин check-authors заставляет Gitsync выдавать ошибку и не запускать разбор версии хранилища, если в настройке AUTHORS у нас не указан соответствующий email для автора версии. Включим его тоже:

gitsync plugins unable check-authors

Плагин check-comments – также останавливает разбор версии хранилища, если при помещении в хранилище не хватает комментариев.

gitsync plugins unable check-comments

 

 

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

gitsync sync -u Администратор -c ..\depot2 src/cf
  • -u – это флаг для указания пользователя;

  • -c – это флаг от плагина check-comments, который нам скажет, что мы не можем выгрузиться, потому что нет комментариев к хранилищу – очень полезно при долгосрочном использовании;

  • дальше нам нужно указать путь к хранилищу;

  • и куда помещать.

 

 

Хранилище мы создали, давайте подключимся к нему.

 

 

В истории хранилища мы видим наше помещение и создание хранилища конфигурации.

 

Создание файла версий

 

 

Если мы сейчас выполним команду, то мы получим ошибку о том, что не найден файл с версией Git.

Это говорит о том, что нам в каталоге src/cf нужно сначала создать файл VERSION с информацией о версии, с которой нужно разбирать хранилище.

 

 

Мы будем разбирать хранилище с нулевой версии. Чтобы создать такой файл в каталоге src/cf автоматически, выполним команду:

gitsync set-version 0 src/cf

 

 

Итак, у нас в каталоге src/cf был создан файл VERSION. Это очень простой xml-файл, в котором буквально один тег – информация о версии, с которой gitsync нужно синхронизировать хранилище (в данном случае, с нуля).

 

Создание файла авторов

 

 

Запустим нашу синхронизацию еще раз.

Дальше мы получили ошибку о том, что у нас не хватает данных об авторах за счет того, что мы включили плагин check-authors.

 

 

Файл авторов тоже выглядит очень просто – он называется AUTHORS. В нем нам нужно сопоставить пользователей из хранилища с какими-то пользователями в Git – под кем мы будем коммитить, кто у нас будет попадать в git blame и на кого будут назначаться замечания.

Конечно же, я считаю, что Администратор – это компания 1С, потому что она нам принесла кучу непонятного вендорского кода.

 

 

После этих настроек мы уже получили работающий скрипт, сейчас gitsync пойдет работать.

 

Автозапуск gitsync с помощью планировщика заданий Windows

 

Последнее, что мы сегодня сделаем – это настроим постоянный автозапуск gitsync.

 

 

Для этого вы можете использовать, например, планировщик заданий Windows.

 

 

И здесь создать простую задачу.

 

 

Назвать ее gitsync + sonar,

 

 

указать, что она выполняется ежедневно,

 

 

в какое-то время.

 

 

И вам нужно запустить программу.

 

 

Запускать мы будем маленький bat-ник, я сейчас покажу его содержимое.

В качестве рабочей папки укажем ssl_demo, чтобы у нас все скрипты выполнялись относительно этого каталога.

 

 

И нажимаем Готово.

 

 

Вот так выглядит содержимое батника – мы вызываем gitsync с данными по синхронизации и вызываем sonar-scanner.

Для того, чтобы нам не передавать кучу параметров в sonar-scanner, мы можем в каталог нашего репозитория положить файлик sonar-project.properties.

 

 

Но я для экономии времени просто перенесу все наши аргументы прямо сюда.

 

 

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

 

Результат анализа замечаний с назначенными ответственными по данным авторов кода в хранилище

 

 

Давайте перейдем в веб-интерфейс. Наш проект уже повторно проанализировался, и можно обратить внимание, что все замечания автоматически назначились на Администратора, потому что у этого пользователя в профиле настроена почта 1c@localhost, которая совпадает с информацией о почте пользователя git из вывода git blame. Этот назначенный исполнитель тоже сюда «подцепился».

В планировщике Windows вы можете настроить расписание, чтобы этот батник у вас запускался каждый раз, когда вы логинитесь, либо каждый день, или даже каждый час.

И таким образом, мы буквально за один час получили мини-сборочную линию, которая разберет ваше хранилище, автоматически положит исходники в Git, запустит анализ кода с помощью sonar-scanner и выгрузит все это в sonar.

 

Вопросы:

 

За что отвечает компонента sonar-scanner? Какая её роль в общем анализе? Она выполняет основную работу, а остальное – это просто веб-интерфейс?

Практически так. Большую часть работы выполняет sonar-scanner. Сам анализ исходников выполняется sonar-scanner-ом на клиенте. Есть ряд задач, которые выполняет сервер при разборе этого анализа. Он считает часть общих метрик по количеству файлов, по количеству просто строк. В плагине могут быть какие-то серверные перехватчики, которые дополнительно еще что-то «докручивают», но плагин «1С (BSL) Community Plugin» рассчитан именно на то, что наибольшая часть работы выполняется на клиенте.

А как организовать анализ внешних обработок?

Внешние обработки нужно выгрузить в исходники в какой-нибудь соседний каталог – не в src/cf, а в src/epf. И они тоже будут анализироваться. Естественно, вам нужно будет поменять настройку sonar-project.properties – где лежат ваши исходники (можно просто на src натравить). Там пока не все хорошо. Например, обработка будет считаться частью вашей конфигурации. Работа с расширениями и вообще с внешними файлами очень нетривиальная и пока реализована не очень хорошо. Но сами исходники обработок анализироваться будут, формы будут разбираться, какие-то нехорошие вещи в модулях будут искаться. Я надеюсь, с течением времени сценарий поддержки обработок, внешних отчетов и расширений мы будем прорабатывать, и все будет лучше.

 

*************

Данная статья написана по итогам доклада (видео), прочитанного на онлайн-митапе "Путь к идеальному коду".

 

30 мая - 1 июня 2024 года состоится конференция Анализ & Управление в ИТ-проектах, на которой прозвучит 130+ докладов.

Темы конференции:

  • Программная инженерия.
  • Инструментарий аналитика.
  • Решения 1С: архитектура, учет и кейсы автоматизации на 1С.
  • Управление проектом.
  • Управление продуктом.
  • Soft skills, управление командой проекта.

Конференция для аналитиков и руководителей проектов, а также других специалистов из мира 1С, которые занимаются системным и бизнес-анализом, работают с требованиями, управляют проектами и продуктами!

Подробнее о конференции.

 


SonarQube

См. также

Когда понадобился новый оператор

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда понадобился новый оператор, но его нет в синтакс-помощнике, что делать?

18.03.2024    1147    ZhokhovM    2    

4

Когда разработчик платформы не добавил проверку препроцессоров

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда разработчик платформы решил пойти на кухню за кофе, а проверку препроцессоров не добавил, и вот тут-то и началось: "Что, опять все сломалось? Ну и кофе же я забыл сделать!".😅

18.03.2024    2673    ZhokhovM    4    

8

Реструктуризация - бесконечная история

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

При разработке программ требуемый функционал ставят на первое место, но есть еще и архитектура программы. На горизонте 5-10 лет она становится важнее функционала, который должен работать при масштабировании и росте данных. Реструктуризация 5 терабайтной базы 1С 8.2 в формат 1С 8.3, складывает весь пазл архитектурных просчетов, которые сделали ради функционала. Как это исправить? - для разработки правильной архитектуры, нужно всего лишь сместить фокус с функционала и подумать о «вечном».

29.09.2023    1909    1CUnlimited    15    

22

Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 2

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Коротко о том, как я перестал быть создателем макаронного кода и непроходимых джунглей методов и модулей. Расскажу о том, что реально применяю на практике с примерами при разработке (а в основном доработке) в типовых конфигурациях 1С. Комментарии очень приветствуются.

27.09.2023    6967    Lemmonbri    136    

36

Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 1

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Коротко о том, как я перестал быть создателем макаронного кода и непроходимых джунглей методов и модулей. Расскажу о том, что реально применяю на практике с примерами при разработке (а в основном доработке) в типовых конфигурациях 1С. Комментарии очень приветствуются.

19.09.2023    4345    Lemmonbri    16    

31

5 подходов при доработке конфигурации 1С, чтобы в будущем не было мучительно больно её обновлять

Архитектура Рефакторинг и качество кода Обновление 1С Платформа 1С v8.3 Бесплатно (free)

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

10.08.2023    9584    0    1c-izhtc    37    

21

Задача на ошибки и неоптимальности при проведении приходной накладной

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Задачу эту дают на собеседованиях, видимо, те франчи, которые не в состоянии оценить человека по резюме и в ходе беседы. По идее задачи, подобные этой, должны давать начинающим студентам. Но дают всем подряд. Итак: мои 5 копеек. Критика приветствуется.

11.07.2023    2214    magic1s    32    

11
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. androidT1C 76 19.05.22 15:30 Сейчас в теме
На заметку. Я столкнулся с тем, что после установки русификатора SonarQube перестал работать. Убираю плагин - работает.
3. nixel 1403 19.05.22 15:57 Сейчас в теме
(1) это известная проблема со стороны SQ. Обновите сервер.
2. Dach 372 19.05.22 15:53 Сейчас в теме
(0)

В дополнение. Вот так можно сконнектить SonarQube с MS SQL, с использованием доменной авторизации:

# Чтобы заработала Win-авторизация:
# запуск службы Sonar из-под учетной записи, обладающей на БД SonarQube правами: public, db_owner
# скачать mssql-jdbc_auth-9.2.0.x64.dll (конкретная версия указана в файле sonar.properties)
# поместить в папку c Java (см. переменную среды Java_Home), в подкаталог "bin"
# пример: "C:\Program Files\BellSoft\LibericaJDK-11-Full\bin\mssql-jdbc_auth-9.2.0.x64.dll"
# строка подключения:

sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=SonarQube;integratedSecurity=true
4. sashocq 193 20.05.22 08:17 Сейчас в теме
А можно ли там установить отбор не по настройке поддержки, а по подсистеме? Я обычно все добавленные и модифицированные объекты помещаю в отдельную подсистему
5. nixel 1403 20.05.22 08:18 Сейчас в теме
(4) прямо сейчас заканчиваем делать эту доработку
Student1C; sashocq; +2 Ответить
6. JohnyDeath 301 20.05.22 08:38 Сейчас в теме
Фундаментальненько!
Такое можно как книгу-пособие выпускать.
cosmo2004; starik-2005; +2 Ответить
7. starik-2005 3033 20.05.22 09:30 Сейчас в теме
Божечки! Я понял, как сделать красивую статью на Инфостарте - картинки!

Из критики: много букв, но нет оглавления (
Jimbo; mas_kot; +2 Ответить
8. nixel 1403 20.05.22 09:55 Сейчас в теме
(7) с учётом того, что статья написана как скрипт по мастер-классу с демонстрацией экрана в зум, странно было бы ожидать тут мало картинок :)
9. starik-2005 3033 20.05.22 09:56 Сейчас в теме
(8)
странно было бы ожидать тут мало картинок
С картинками основная проблема - это разрешение экрана у читающего. Предположу, что с телефона статья будет условно читаема.

ЗЫ: Хотя нет, все норм с телефона.
12. nixel 1403 20.05.22 10:07 Сейчас в теме
(7) оглавление появилось.
fatman78; starik-2005; +2 Ответить
14. starik-2005 3033 20.05.22 10:12 Сейчас в теме
(12) как поставить две звездочки?
JohnyDeath; nixel; +2 Ответить
10. mas_kot 64 20.05.22 09:57 Сейчас в теме
Прекрасная статья!
Особенно про тему с es - у нас как раз эта проблема и из вариантов, которые находятся в интернете - править параметры памяти в конфиге, а вот про этот файл readonly ни слова не было.

Из опыта: сразу ставьте Postgres, у нас файловая БД постоянно "билась" при служебных перезагрузках тест-сервера и приходилось всё время восстанавливать из бэкапа.
11. nixel 1403 20.05.22 09:59 Сейчас в теме
(10) ну да, файловая вообще для промышленной эксплуатации не предназначена, только для тестов. И не поддерживает обновление сервера.
13. mas_kot 64 20.05.22 10:07 Сейчас в теме
(11) Нет ничего более постоянного, чем временное - как то поставили "на пробу" - одна конфа на 100 мегабайт - вот она и крутилась.
JohnyDeath; nixel; +2 Ответить
15. akifjevda 22.05.22 12:38 Сейчас в теме
Шедеврально. Только эта статья Никиты смогла меня сподвигнуть на эксперименты с SQ - действительно все разжевано до мелочей. Спасибо!
16. Denis Techno 22.05.22 17:53 Сейчас в теме
Если у Никиты вышла статья, то это обязательно к прочтению вне очереди. Очень качественный материал всегда, жирный лайк, спс.
17. borda4ev 15 26.05.22 10:56 Сейчас в теме
Искал не нашел, может быть плохо искать, подскажите пожалуйста.
Как настроить что бы при просмотре коммита в GitLab, можно было бы перейти к тому же файлу в SonarQube?
И там был какой то функционал оформления MergeRequest, но он вроде в платной.
Есть идеи какие есть сценарии дружбы этих инструментов?
18. nixel 1403 26.05.22 11:04 Сейчас в теме
(17)
Как настроить что бы при просмотре коммита в GitLab, можно было бы перейти к тому же файлу в SonarQube?


При просмотре коммита - никак.


(17)
И там был какой то функционал оформления MergeRequest, но он вроде в платной.
Есть идеи какие есть сценарии дружбы этих инструментов?


Да, эта функциональность доступна для бесплатной версии через сторонний (проверенный) плагин: https://github.com/mc1arke/sonarqube-community-branch-plugin
borda4ev; +1 Ответить
19. cmd_vasec 34 26.05.22 12:41 Сейчас в теме
Почему не передаются авторы коммитов из git в sonar (т.е. у каждого замечания не назначен автор)?

Мои действия:
1) выгружаю изменения из хранилища 1с в локальный git gitsync-ком (в гите авторы проставлены с почтой, заполнен файл Authors)
2) Запускаю sonar scanner (в сонаре созданы пользователи с почтой) ошибок нет отключил SCM, так как ошибка была.

Версия сонара 8.9.8.54436.
20. nixel 1403 26.05.22 12:46 Сейчас в теме
(19) ну... Потому что вы отключили scm :) это как раз тот сенсор, который отвечает за расчёт авторов.
21. cmd_vasec 34 26.05.22 13:06 Сейчас в теме
(20) В начале он был включен и вылезала ошибка на счет scm. Для ее решения надо установить плагин git, а его в магазине нет. Как данную ошибку решать?
22. nixel 1403 26.05.22 13:13 Сейчас в теме
(21) какая конкретно ошибка?

Плагин git ставить не надо, он поставляется вместе с сервером SonarQube
23. cmd_vasec 34 26.05.22 13:15 Сейчас в теме
(22) WARN: SCM provider autodetection failed. Please use "sonar.scm.provider" to define SCM of your project, or disable the SCM Sensor in the project settings.


Папка .scannerwork и .git - должны быть в одной папке? У меня нет - может поэтому сонар не видит git?
24. nixel 1403 26.05.22 14:06 Сейчас в теме
(23) да, анализ нужно запускать из корня репозитория.
25. cmd_vasec 34 26.05.22 14:44 Сейчас в теме
(24) Спасибо все заработало. Можно ли этот батник поместить не в корень репозитарий и указать, где корень?
26. nixel 1403 26.05.22 14:46 Сейчас в теме
(25) какой батник? В корне не ложно быть никаких батников
27. cmd_vasec 34 26.05.22 16:18 Сейчас в теме
(26) батник который запускает sonnar
28. nixel 1403 26.05.22 16:24 Сейчас в теме
(27) ты про вариант запуска через планировщик задач Windows? Если да, то да батник может лежать где угодно, просто в самой задаче нужно рабочим каталогом указать корень репозитория.
29. cmd_vasec 34 27.05.22 09:34 Сейчас в теме
После экспериментов (пароль поменял на токен и не только) и установки плагина sonarqube-community-branch-plugin-1.8.1.jar (у меня сонар 8.9.8.54436 - при запуске выдал предупреждения, но данные появились в сонаре) все сломал.
Ошибки:
Скрытый текст


Как мне решить данную проблему или что сделал не так?
33. nixel 1403 27.05.22 09:59 Сейчас в теме
(29)
Caused by: The folder 'ut_git/config' does not exist for 'ut' (base directory = C:\Users\user)

Основная информация вот тут. Смотрите, в каком каталоге вы запускаете сканнер, какие каталоги расположены на диске и что прописано в настройках проекта.
30. nixel 1403 27.05.22 09:47 Сейчас в теме
(29) у вас что-то не так в файле sonar-project.properties. Проверяйте структуру каталогов и что вы написали в файле.
31. cmd_vasec 34 27.05.22 09:52 Сейчас в теме
(30) в sonar.properties добавил:

sonar.web.port=9002

sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?user=postgres&password=postgres

sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=web
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=ce


один раз все сработало, но использовал пароль, решил поменять на токен и ошибки.
32. nixel 1403 27.05.22 09:57 Сейчас в теме
(31) это настройки сервера. Я говорю про настройки проекта.
34. cmd_vasec 34 27.05.22 10:01 Сейчас в теме
(32) данный файл не создавал, может он сам создался, тогда, где его можно найти (не могу его найти)?
35. nixel 1403 27.05.22 10:02 Сейчас в теме
(34) нет, сам он не создаётся. Но в статье про него есть, в разделе про перенос аргументов запуска из командной строки в файл.

Тогда глядите, что вы передаёте в аргументах командной строки :)
37. cmd_vasec 34 27.05.22 10:09 Сейчас в теме
(35) sonar-scanner -X -Dsonar.projectKey=ut -Dsonar.login=admin -Dsonar.password=123-Dsonar.sourceEncoding=UTF-8 -Dsonar.sources=ut_git/config -Dsonar.inclusions=**/*.bsl

все как в статье. Делал через токен, ошибки одинаковые. Запускаю батник в папке где папка ut_git.
38. nixel 1403 27.05.22 10:16 Сейчас в теме
(37) у вас же там есть git bash или wsl на машине?
Можете открыть их в этом каталоге, выполнять там "tree -L 2" и скинуть сюда вывод?
39. cmd_vasec 34 27.05.22 10:22 Сейчас в теме
(38) в паке где батник
$ tree -L 2
bash: tree: command not found
40. nixel 1403 27.05.22 10:26 Сейчас в теме
(39) хм. А вот так?

find -maxdepth 2 -type d -ls
41. cmd_vasec 34 27.05.22 10:31 Сейчас в теме
(40)3940649673974456 0 drwxr-xr-x 1 user 1049089 0 май 24 2021 .
42. nixel 1403 27.05.22 10:47 Сейчас в теме
(41)
Какой-то не тот каталог? Команда показывает, что тут ничего нет, в том числе нет ut_git
43. nixel 1403 27.05.22 10:47 Сейчас в теме
(39) и да, не там где батник. А в корне проекта.
44. nixel 1403 27.05.22 10:49 Сейчас в теме
(43) точнее в той директории, которая указана как рабочая для задачи в планировщике.
45. cmd_vasec 34 27.05.22 12:16 Сейчас в теме
(44) Все вопрос решил. Это я виноват. Надо было перейти в папку, где батник и оттуда его запустить. И все получилось. А до этого тупо вставлял путь к батнику.
36. Andrefan 27.05.22 10:03 Сейчас в теме
Добрый день.
Кто знает, есть ли возможность для вкладки Активность изменить масштаб для оси Y?
46. Jimbo 9 29.05.22 11:50 Сейчас в теме
Многабукфниасилил. Зачем это фсёёё?? Квест по куче ошибок, финал сей басни каков ?
47. nixel 1403 29.05.22 11:54 Сейчас в теме
(46) видеть, где говнокодишь, понимать, почему говнокодишь и как больше не говнокодить.
48. cmd_vasec 34 31.05.22 21:28 Сейчас в теме
(46) Если вы не понимаете зачем это, то вам это не надо.
Artem-B; akifjevda; +2 Ответить
49. sh_oleg 21.06.22 17:55 Сейчас в теме
Уважаемый автор, спасибо за статью!

Решил я поднять Sonar у себя, и в целом все работает как надо, за исключением одной мелочи, которую хотелось бы все же довести до ума... (очень надеюсь на помощь сообщества).

Загружаю в сонар уже готовый отчет, который генерит BSL LS. Загрузка проходит успешно, результаты видны в интерфейсе Сонара, но при попытке открыть детальное описание ошибки - вижу такое (см. прикрепленный файлик).

Появилось предположение, что проблема в отсутствии самого BSL LS на сервере, где крутится Сонар, но нигде не нашел информации о настройках плагина "1C (BSL) Community Plugin", в которых можно указать путь к BSL LS.
Прикрепленные файлы:
50. nixel 1403 21.06.22 18:54 Сейчас в теме
(49) подскажите, какой плагин у вас стоит? 1с (bsl) community plugin? Если да, то результаты bsl ls отдельно грузить не нужно, плагин сам все запустит и покажет (если ему не мешать)
51. sh_oleg 22.06.22 09:18 Сейчас в теме
(50)
Да, использую плагин 1с (bsl) community plugin.

Т.е. sonar-scanner использовать с параметром -Dsonar.bsl.languageserver.reportPaths=${report_path}/bsl-json.json не выйдет?
52. nixel 1403 22.06.22 09:31 Сейчас в теме
(51) это имеет смысл только в том случае, если версия плагина отстаёт от версии бсл лс. И тогда да, неизвестные для старого плагина новые правила бсл лс будут загружены в таком виде.

Но проще просто использовать актуальную версию плагина, где и правила новые и их описания, а внешний запуск бсл лс вообще убрать. Ещё и время сэкономите на анализе.
53. sh_oleg 22.06.22 09:47 Сейчас в теме
(52)
понял, спасибо!

У меня как раз так и есть: "версия плагина отстаёт от версии бсл лс".
Отставание обусловлено старой версией Сонара (использую 8.6). Когда попытался поднять до актуальной версии - он у меня просто не запустился с ошибкой подключения к postgres. Разбираться тогда не стал, - просто откатился назад. Но сейчас понятно куда копать. Большое спасибо.
54. nixel 1403 22.06.22 09:55 Сейчас в теме
(53) если скините ошибку, попробую помочь.
55. sh_oleg 22.06.22 10:30 Сейчас в теме
(54)
2022.06.22 07:25:42 INFO web[][o.s.p.ProcessEntryPoint] Starting Web Server
2022.06.22 07:25:42 INFO web[][o.s.s.p.LogServerVersion] SonarQube Server / 9.5.0.56709 / 3185a5669fdfaf7e4fa6dc7876e0b0dfd5d2aae7
2022.06.22 07:25:42 INFO web[][o.sonar.db.Database] Create JDBC data source for jdbc:postgresql://1.1.1.1:5432/sonardb
2022.06.22 07:25:43 INFO web[][o.s.s.p.ServerFileSystemImpl] SonarQube home: /opt/sonarqube
2022.06.22 07:25:43 INFO web[][o.s.s.u.SystemPasscodeImpl] System authentication by passcode is disabled
2022.06.22 07:25:43 WARN web[][o.s.c.a.AnnotationConfigApplicationContext] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdk.internal.loader.ClassLoaders$AppClassLoader@277050dc-org.sonar.server.platform.DatabaseServerCompatibility': Initialization of bean failed; nested exception is Current version is too old. Please upgrade to Long Term Support version firstly.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdk.internal.loader.ClassLoaders$AppClassLoader@277050dc-org.sonar.server.platform.DatabaseServerCompatibility': Initialization of bean failed; nested exception is Current version is too old. Please upgrade to Long Term Support version firstly.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:628)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
at org.sonar.core.platform.SpringComponentContainer.startComponents(SpringComponentContainer.java:187)


Не очень понимаю какая версия ему не нравиться.... Версия postgres ? (использую 9.6)
56. sh_oleg 22.06.22 16:54 Сейчас в теме
(55)
Вообщем, спасибо nixel за подсказки наводящие вопросы! Разобрался сам.

Оказалось все просто - я брал просто последний community-образ Сонара, а нужно было брать community-lts.
Все остальное - завелось и поехало.

Еще раз спасибо.
Прикрепленные файлы:
57. nixel 1403 22.06.22 17:23 Сейчас в теме
(56) вот теперь, когда вы обновились до lts, можно снова пробовать обновляться до последней версии.
58. nixel 1403 22.06.22 17:24 Сейчас в теме
(57) только проверьте, что девятый постгрес все ещё поддерживается. Кажется, в девятке сонара дропнули поддержку девятого постгреса.
59. sh_oleg 22.06.22 18:27 Сейчас в теме
(57) Именно так и сделал. Все работает (в т.ч. и постгрес 9.6). Еще раз - спасибо!
60. rom_kh 14.07.22 07:58 Сейчас в теме
Для тех кто будет делать серверную базу sonar на ms sql server, при запуске сонара столкнулся с ошибкой The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12] и Fail to connect to database.
MS SQL server 2014, Windows Server 2008, необходимо установить последний накопительный пакет обновления для SQL Server, после этого все заработало.
https://support.microsoft.com/en-us/topic/kb3135244-tls-1-2-support-for-microsoft-sql-server-e4472ef8-90a9-13c1-e4d8-44aad198cdbe
61. VKislitsin 960 17.07.22 11:09 Сейчас в теме
Никита, спасибо за столь подробный мануал!
Подскажите, пожалуйста, каким образом вносятся изменения в правила?
Например, для правила "Опечатка", судя по описанию, есть возможность внести пользовательский словарь исключений, в параметре userWordsToIgnore. Но вот где это необходимо указать, я не могу сообразить.
63. nixel 1403 17.07.22 12:05 Сейчас в теме
(61) правила можно настраивать двумя путями:
1) через "профиль качества" - создаете свой, отнаследовав от стандартного, и получаете возможность изменить параметры и критичность правил
2) задав настройки в конфигурационном файле bsl language server и включив в настройках проекта использование переопределения настроек файлом. Тогда все настройки правил будут браться от движка bsl ls вместо профиля качества.
VKislitsin; +1 Ответить
62. VKislitsin 960 17.07.22 11:20 Сейчас в теме
И еще один вопросик: по поводу службы на WIndows. Документация описывает установку службы стандартным способом, через "sc create SonarQube....". А вот для запуска и остановки предлагается использовать батники StartNTService.bat и StopNTService.bat.
Правильно ли я понимаю, что перезапуск (и старт после перезагрузки хоста) посредством интерфейса управления службами производится не очень корректно? Для автостарта службы нужно использовать особый способ (например через планировщик задач) вместо настройки службы "автозапуск" ?
64. nixel 1403 17.07.22 12:16 Сейчас в теме
(62) не то чтобы некорректно... Остановка через отдельный батник позволяет серверу завершить текущие активные задачи, тогда как остановка через службу в какой-то момент жёстко прибьет корневой процесс.
Если у вас не сильно нагруженный сервер или есть тех окна, то разницы вы не заметите. Иначе же можно порушить результаты последнего анализа.
VKislitsin; +1 Ответить
65. VKislitsin 960 17.07.22 12:25 Сейчас в теме
(64)
Если у вас не сильно нагруженный сервер или есть тех окна, то разницы вы не заметите. Иначе же можно порушить результаты последнего анализа.

Понял. Спасибо! Меня в данном случае больше интересовал автозапуск службы: достаточно ли простой настройки "режим запуска: автоматически" для службы. Судя по вашему ответу, должно быть достаточно.
66. nixel 1403 17.07.22 12:26 Сейчас в теме
(65) с запуском, думаю, проблем не должно быть. Там выполняется та же команда, что и в батнике.
VKislitsin; +1 Ответить
67. сова1с 14.09.22 20:12 Сейчас в теме
Спасибо за статью.
Возникла такая проблема:
Запускаю вот так: sonar-scanner -Dsonar.projectKey=TestAizberg -Dsonar.login=squ_9c40b7ec0480b7accdaa9b00defcb9c622955cd1 -Dsonar.sourceEncoding=UTF-8 -Dsonar.sources=C:\article-sonar\project1c\src -Dsonar.inclusions=**/*.bsl

Но сканер почему-то проигнорировал все файлы:
Indexing files...
INFO: Project configuration:
INFO: Included sources: **/*.bsl
INFO:
INFO:
INFO: 0 files indexed
INFO: 38352 files ignored because of inclusion/exclusion patterns

не понимаю каких настроек не хватает
68. nixel 1403 14.09.22 20:16 Сейчас в теме
(67) не используйте абсолютные пути. Только относительные.
69. сова1с 14.09.22 20:28 Сейчас в теме
У меня файлы конфигурации выгружены просто в каталог на диске - куда их нужно положить или относительно чего указывать путь?
70. nixel 1403 14.09.22 20:32 Сейчас в теме
(69) откройте терминал в том каталоге, где у вас выгружены исходники (ну или где условный src) и в нем запускайте sonar-scanner. Тогда в sonar.sources будет точка (текущий каталог) или src
71. сова1с 14.09.22 20:52 Сейчас в теме
(70) Спасибо. Все получилось
72. сова1с 16.09.22 16:09 Сейчас в теме
Доброго дня.
Попытался подключить sql базу. В настройках sonar.properties прописал следующие настройки:
sonar.jdbc.username=логин базы sql
sonar.jdbc.password=пароль
sonar.jdbc.url=jdbc:sqlserver://wz-programm-1c;databaseName=sonar;integratedSecurity=true
при запуске выдало следующее:
Starting SonarQube...
2022.09.16 15:59:49 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory C:\sonarqube\temp
2022.09.16 15:59:49 INFO app[][o.s.a.es.EsSettings] Elasticsearch listening on [HTTP: 127.0.0.1:9001, TCP: 127.0.0.1:58316]
2022.09.16 15:59:49 INFO app[][o.s.a.ProcessLauncherImpl] Launch process[ELASTICSEARCH] from [C:\sonarqube\elasticsearch]: C:\Program Files\BellSoft\LibericaJDK-11-Full\bin\java -XX:+UseG1GC -Djava.io.tmpdir=C:\sonarqube\temp -XX:ErrorFile=../logs/es_hs_err_pid%p.log -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djna.tmpdir=C:\sonarqube\temp -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j2.formatMsgNoLookups=true -Djava.locale.providers=COMPAT -Dcom.redhat.fips=false -Des.enforce.bootstrap.checks=true -Xmx6g -Xms6g -XX:+HeapDumpOnOutOfMemoryError -Delasticsearch -Des.path.home=C:\sonarqube\elasticsearch -Des.path.conf=C:\sonarqube\temp\conf\es -cp lib/* org.elasticsearch.bootstrap.Elasticsearch
2022.09.16 15:59:49 INFO app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running
2022.09.16 15:59:58 INFO app[][o.s.a.SchedulerImpl] Process[es] is up
2022.09.16 15:59:58 INFO app[][o.s.a.ProcessLauncherImpl] Launch process[WEB_SERVER] from [C:\sonarqube]: C:\Program Files\BellSoft\LibericaJDK-11-Full\bin\java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=C:\sonarqube\temp -XX:-OmitStackTraceInFastThrow --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED -Dcom.redhat.fips=false -server -Xmx2g -Xms1g -XX:+HeapDumpOnOutOfMemoryError -Dhttp.nonProxyHosts=localhost|127.*|[::1] -cp ./lib/sonar-application-9.6.1.59531.jar;C:\sonarqube\lib\jdbc\mssql\mssql-jdbc-10.2.1.jre11.jar org.sonar.server.app.WebServer C:\sonarqube\temp\sq-process14106654969257384494properties
2022.09.16 16:00:00 INFO app[][o.s.a.SchedulerImpl] Process[Web Server] is stopped
2022.09.16 16:00:00 INFO app[][o.s.a.SchedulerImpl] Process[ElasticSearch] is stopped
2022.09.16 16:00:00 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped

Не понимаю что не так. Если есть возможность подскажите куда копать...
73. nixel 1403 16.09.22 16:25 Сейчас в теме
(72) посмотрите содержимое web.log
74. сова1с 20.09.22 11:11 Сейчас в теме
(73) Добрый день.
Вот что пишет web.log
2022.09.19 12:02:58 ERROR web[][o.s.s.p.PlatformImpl] Web server startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdk.internal.loader.ClassLoaders$AppClassLoader@5b37e0d2-org.sonar.db.DefaultDatabase': Initialization of bean failed; nested exception is java.lang.IllegalStateException: Fail to connect to database
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:628)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
at org.sonar.core.platform.SpringComponentContainer.startComponents(SpringComponentContainer.java:187)
at org.sonar.server.platform.platformlevel.PlatformLevel.start(PlatformLevel.java:80)
at org.sonar.server.platform.platformlevel.PlatformLevel1.start(PlatformLevel1.java:164)
at org.sonar.server.platform.PlatformImpl.start(PlatformImpl.java:196)
at org.sonar.server.platform.PlatformImpl.startLevel1Container(PlatformImpl.java:162)
at org.sonar.server.platform.PlatformImpl.init(PlatformImpl.java:76)
at org.sonar.server.platform.web.PlatformServletContextListener.contextInitialized(PlatformServletContextListener.java:43)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4768)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:432)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486)
at org.sonar.server.app.EmbeddedTomcat.start(EmbeddedTomcat.java:72)
at org.sonar.server.app.WebServer.start(WebServer.java:55)
at org.sonar.process.ProcessEntryPoint.launch(ProcessEntryPoint.java:97)
at org.sonar.process.ProcessEntryPoint.launch(ProcessEntryPoint.java:81)
at org.sonar.server.app.WebServer.main(WebServer.java:104)
Caused by: java.lang.IllegalStateException: Fail to connect to database
at org.sonar.db.DefaultDatabase.start(DefaultDatabase.java:86)
at org.sonar.core.platform.StartableBeanPostProcessor.postProcessBeforeInitialization(StartableBeanPostProcessor.java:33)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:440)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
... 44 common frames omitted
Caused by: java.lang.IllegalStateException: Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').
at org.sonar.db.DefaultDatabase.checkConnection(DefaultDatabase.java:118)
at org.sonar.db.DefaultDatabase.start(DefaultDatabase.java:83)
... 48 common frames omitted
Caused by: java.sql.SQLException: Cannot create PoolableConnectionFactory (Драйверу не удалось установить безопасное соединение с SQL Server, используя шифрование SSL. Ошибка: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". ClientConnectionId:2a79d0f0-3bdd-45b1-aba8-8227aee1a4b8)
at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:653)
at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:531)
at org.apache.commons.dbcp2.BasicDataSource.lambda$getConnection$0(BasicDataSource.java:720)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:722)
at org.sonar.db.profiling.NullConnectionInterceptor.getConnection(NullConnectionInterceptor.java:31)
at org.sonar.db.profiling.ProfiledDataSource.getConnection(ProfiledDataSource.java:317)
at org.sonar.db.DefaultDatabase.checkConnection(DefaultDatabase.java:115)
... 49 common frames omitted
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Драйверу не удалось установить безопасное соединение с SQL Server, используя шифрование SSL. Ошибка: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". ClientConnectionId:2a79d0f0-3bdd-45b1-aba8-8227aee1a4b8
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:3680)
at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:2113)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:3204)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2833)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2671)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1640)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:936)
at org.apache.commons.dbcp2.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:52)
at org.apache.commons.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:374)
at org.apache.commons.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:106)
at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:649)
... 56 common frames omitted
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:350)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:293)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:288)
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:654)
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:473)
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:369)
at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422)
at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:183)
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:171)
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1408)
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1314)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:440)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:411)
at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:2021)
... 65 common frames omitted
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:439)
at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306)
at java.base/sun.security.validator.Validator.validate(Validator.java:264)
at java.base/sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:313)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:233)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:110)
at com.microsoft.sqlserver.jdbc.TDSChannel$HostNameOverrideX509TrustManager.checkServerTrusted(IOBuffer.java:1702)
at java.base/sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:1510)
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638)
... 77 common frames omitted
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
at java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
at java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297)
at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:434)
... 85 common frames omitted
2022.09.19 12:02:58 WARN web[][o.a.c.u.SessionIdGeneratorBase] Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [130] milliseconds.
2022.09.19 12:02:58 INFO web[][o.s.s.a.EmbeddedTomcat] HTTP connector enabled on port 9000
2022.09.19 12:02:58 INFO web[][o.s.p.ProcessEntryPoint] Hard stopping process
75. alexsey777 11.10.22 07:47 Сейчас в теме
(74)подскажите, удалось победить проблему?
Аналогичная ошибка при запуске SonarQube. Ставлю актуальную версию 9.6.
До этого настраивал на другой машине - такой проблемы не было
Прикрепленные файлы:
логи сонар.txt
77. nixel 1403 11.10.22 09:01 Сейчас в теме
78. MichaelBerezovskiy 11 27.10.22 12:55 Сейчас в теме
(75) у меня вроде получилось... но, боюсь, для "прод" сервера может не подойти решение
sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar;integratedSecurity=false;encrypt=false;trustServerCertificate=true
devtelscargo; +1 Ответить
76. nixel 1403 11.10.22 09:01 Сейчас в теме
(72) у вас одновременно включено и integrated security и авторизация по паролю.
В такой связке они работать не будут. Проверьте документацию, раздел про mssql https://docs.sonarqube.org/latest/setup/install-server/
79. user1870129 09.11.22 08:38 Сейчас в теме
Всем привет, помогите с ошибкой, возможно кто-то сталкивался:

> Error creating bean with name 'org.sonarsource.scanner.api.internal.IsolatedClassloader@372acf39-org.sonar.scanner.report.ReportPublisher': Unsatisfied dependency expressed through constructor parameter 7; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.sonarsource.scanner.api.internal.IsolatedClassloader@372acf39-org.sonar.scanner.report.AnalysisCachePublisher': Unsatisfied dependency expressed through constructor parameter 2; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'WriteCache' defined in org.sonar.scanner.cache.AnalysisCacheProvider: Unsatisfied dependency expressed through method 'provideWriter' parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ReadCache' defined in org.sonar.scanner.cache.AnalysisCacheProvider: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.sonar.api.batch.sensor.cache.ReadCache]: Factory method 'provideReader' threw exception; nested exception is java.lang.IllegalStateException: Failed to download analysis cache
80. A18D 20.02.23 18:02 Сейчас в теме
как поменять автора ошибки в SonarQube?
81. nixel 1403 20.02.23 19:05 Сейчас в теме
(80) автора - никак. Информация об авторе берется из системы контроля версий.
Назначенного (assignee) - кнопкой рядом со статусом замечания.
82. A18D 20.02.23 21:23 Сейчас в теме
(81)мне бы хотелось поменять автора конкретного модуля. Дело в том, что Сонар определил автором модуля конкретного разработчика.
Но этот разработчик только лишь поместил модуль в хранилище, а дорабатывают модуль все участники команды. И теперь при поиске дефекта кода в некоторых случаях Сонар определяет автором дефекта автора этого модуля, также рассылает автору модуля уведомления о чужих ошибках. Поэтому я хочу определить автором модуля абстрактного пользователя Сонара, но не знаю как это сделать. Прошу посоветовать, как лучше поступить
Прикрепленные файлы:
83. nixel 1403 21.02.23 07:12 Сейчас в теме
(82) в сонаре нет понятия автора модуля, авторство рассчитывается построчно. Изменить автора строки из интерфейса сонара нельзя. Нужно либо переписывать гит историю, либо просто переназначать замечания на других людей/на никого. А можно их просто исправлять.
84. A18D 21.02.23 10:26 Сейчас в теме
(83)Спасибо. Значит для того, чтобы изменить автора в сонаре нужно переписать гит историю и повторно запустить сканирование конфигурации сонаром
85. user1967954 12.07.23 11:35 Сейчас в теме
Добрый день! Задала вопрос в смежной публикации по SonarQube. Задам еще тут.
Возникли вопросы, помогите, пожалуйста, разобраться:
1) Из Магазина установили плагин Russian Pack. В итоге большая часть понятий русифицировалась, но правила остались на английском. В скриншотах статьи текст правил на русском. Нужно что-то еще доустановить, чтобы сами правила были на русском?
2) Минимально корректировать можно правила только своего профиля качества. А как в своем профиле создать новые правила? Через Шаблоны правил? Если да, то как созданное через шаблон правило добавить в свой профиль качества?
86. nixel 1403 12.07.23 15:23 Сейчас в теме
(85)

> но правила остались на английском. В скриншотах статьи текст правил на русском. Нужно что-то еще доустановить, чтобы сами правила были на русском

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

> Минимально корректировать можно правила только своего профиля качества. А как в своем профиле создать новые правила? Через Шаблоны правил? Если да, то как созданное через шаблон правило добавить в свой профиль качества?

Правила пишутся на языке java и подключаются к BSL Language Server. Если то действительно то, чего вы хотите, приходите в чат @bsl_language_server в телеграме. Плюс вы можете использовать любые другие внешние анализаторы на любых языках, если эти анализаторы смогут создавать отчеты либо в формате generic-issues либо во внутреннем json-формате bsl ls.
87. user1967954 12.07.23 16:10 Сейчас в теме
Спасибо за ответ!

Предполагаю, что общие настройки языка и правил аналогичны для применения к любому языку в рамках версии SonarQube.
Хотели проверить Java код. А настройки сервера - это те, что в конфигурационном файле sonar.properties?

С правилами получается, что если нужны свои, то создавать на внешних анализаторах и далее подключать к проекту. Так?
88. nixel 1403 12.07.23 17:23 Сейчас в теме
(87)
Предполагаю, что общие настройки языка и правил аналогичны для применения к любому языку в рамках версии SonarQube.


нет, у каждого языка собственные настройки плагина. java правила не переведены на русский язык.

> А настройки сервера - это те, что в конфигурационном файле sonar.properties?

Не, те, которые в Administration в UI.

> С правилами получается, что если нужны свои, то создавать на внешних анализаторах и далее подключать к проекту. Так?

Опять же, от языка и плагина зависит. Некоторые плагины позволяют делать правила на основе xpath-выражений. Но в остальном - да, либо свой плагин, либо отдельный анализатор.
89. user1967954 12.07.23 17:53 Сейчас в теме
Спасибо! Теперь стало более понятно.
90. nixel 1403 12.07.23 19:05 Сейчас в теме
(89) ну и раз у вас java, то вам нужен не отдельный sonar-scanner, а maven/gradle плагин. Про оба написано в документации.
91. user1967954 13.07.23 09:52 Сейчас в теме
92. Vladimir-R 167 12.09.23 17:41 Сейчас в теме
Добрый день.

при запуске sonar-scanner выходит ошибка
Error: Could not find or load main class sh
Caused by: java.lang.ClassNotFoundException: sh

с чем связана и как исправить?
93. nixel 1403 12.09.23 21:29 Сейчас в теме
(92) нужна строка запуска и полный текст ошибки
94. Vladimir-R 167 13.09.23 08:55 Сейчас в теме
(93)
c:\Sonar\project\rdv>sonar-scanner -Dsonar.projectKey=rdv
Error: Could not find or load main class sh
Caused by: java.lang.ClassNotFoundException: sh
Прикрепленные файлы:
95. Vladimir-R 167 13.09.23 11:20 Сейчас в теме
(93)
+
c:\Sonar\project\rdv>java --version
openjdk 17.0.8.1 2023-08-24
OpenJDK Runtime Environment Temurin-17.0.8.1+1 (build 17.0.8.1+1)
OpenJDK 64-Bit Server VM Temurin-17.0.8.1+1 (build 17.0.8.1+1, mixed mode, sharing)
96. nixel 1403 13.09.23 19:46 Сейчас в теме
Такое чувство, что у вас подбирается sonar-scanner для линукса, а не sonar-scanner.bat. Можете попробовать явно указать расширение файла?
97. Vladimir-R 167 14.09.23 09:08 Сейчас в теме
(96)
C:\Windows\system32>"C:\Sonar\sonar-scanner\bin\sonar-scanner.bat"
Error: Could not find or load main class sh
Caused by: java.lang.ClassNotFoundException: sh

Использую sonar-scanner-cli-5.0.1.3006-windows
98. nixel 1403 14.09.23 14:52 Сейчас в теме
(97) хм... А если взять any-сборку?
99. Vladimir-R 167 15.09.23 09:10 Сейчас в теме
(98) сборка sonar-scanner-cli-5.0.1.3006
тоже самое

C:\Windows\system32>"C:\Sonar\sonar-scanner\bin\sonar-scanner.bat"
Error: Could not find or load main class sh
Caused by: java.lang.ClassNotFoundException: sh

пробовал со сборкой sonar-scanner-cli-4.8.1.3023 и sonar-scanner-cli-4.8.0.2856, ошибка та же
Оставьте свое сообщение