Управляй качеством кода 1С с помощью SonarQube

0. olegtymko 556 07.07.19 05:40 Сейчас в теме
Управляй техническом долгом проектов 1С с помощью SonarQube. В статье рассматривается пример применения SonarQube при разработке.

Перейти к публикации

Лучшие комментарии
34. litonchik 08.07.19 10:36 Сейчас в теме
Спасибо за статью!
Читая комментарии под статьями такого рода, иной раз, поражаюсь токсичности комьюнити.
GreenDragon; tsmult; YPermitin; Kinestetik; mivari; vlad.frost; t.v.s.; disa_da; Kosstikk; seperblunt2; ComConnector; ltfriend; romankoav; Stepa86; baton_pk; user774630; VitaminC; olegtymko; CyberCerber; nixel; tsukanov; user764477; Labotamy; +23 Ответить
14. vlad.frost 08.07.19 08:08 Сейчас в теме
(3) ну, например, чтобы:
- не настраивать ответственных по объектам метаданных в АПК: SonarQube сам определит ответственного за косячный код по git blame;
- разделить ошибки на legacy и привнесённые в новом коде, старый код не трогать, а сосредоточиться на исправлении новых косяков;
- видеть ошибки АПК в контексте окружающего кода, а не только модуль и номер строки;
- ускорить отображение отчётов;
- получать постоянные ссылки на ошибки, чтобы взять их на контроль и добиться исправления.
Krio2; GreenDragon; Kinestetik; SerebanSK; nvv1970; mrXoxot; Kosstikk; JohnyDeath; olegtymko; nixel; Stepa86; +11 Ответить
5. Vladimir Litvinenko 07.07.19 23:46 Сейчас в теме
(4) Вы можете делать коммиты, связанные с обновлением типовых конфигураций (обновлением БСП или переходом на новую версию типовой конфигурации) от имени специально выделенного пользователя. Для этого достаточно перед коммитом указать в качестве e-mail автора служебный или свой второй e-mail. Тогда изменения типовой конфигурации привяжутся не к тем пользователям, под которым ведется регулярная разработка.

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

Если вы пользуетесь АПК, то ситуация будет аналогична: если Вы дорабатываете типовой модуль и хотите его проверить после доработки, то в результаты его проверки попадет и типовой код и Ваш. АПК позволяет фильтровать объекты конфигурации, подлежащие проверке, а не части модулей. При использовании возможностей git как раз появляется возможность проверять только внесенные в модуль изменения в привязке к авторам.
tsmult; Kinestetik; Lucechiaro; SerebanSK; Stepa86; olegtymko; acanta; +7 1 Ответить
13. olegtymko 556 08.07.19 05:55 Сейчас в теме
(12) На скриншоте тестовый проект, где ~800 ошибок, был проверен только в рамках статьи.

Во вложении метрики самописного проекта не на БСП, над который сейчас ведутся работы по улучшению качества кода (этот же скриншот есть в статье).
Если смотреть тренд количества ошибок, дублирования кода - то их количество со временем уменьшается.
Прикрепленные файлы:
GreenDragon; Kinestetik; acanta; kuzyara; +4 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
191. roman_1379 26.09.19 09:09 Сейчас в теме
Да и в Sonar Helper только есть отчеты, про уведомления ни слова...
193. olegtymko 556 26.09.19 09:55 Сейчас в теме
(191) вызываем периодически отчеты и рассылаем - получаются уведомления)
194. roman_1379 26.09.19 10:38 Сейчас в теме
отчеты в таком формате не очень удобны, особенно если посмотреть что в примерах...и нужны уведомления о новых замечаниях, изменениях, а в отчетах как я понимаю будет все...

На данный момент поддерживаются следующие варианты формирования отчета:
JSON - формируется отчет в формате json, метрики выгружаются дважды - для идентификатора метрики и для русского представления. Пример: examples\example-report.json
HTML - формируется отчет в формате html, метрики выгружаются только для русского представления. Пример: examples\example-report.html
196. mikecool 3 23.10.19 20:42 Сейчас в теме
Пробую по гайду поставить сонар - постоянно падает, а для меня набор сообщений слабо понятен )) с портами для явы разобрался, а вот далее - темный лес. Как можно подробнее понять суть возникающих ошибок?
197. olegtymko 556 24.10.19 08:03 Сейчас в теме
(196) при StartSonar.bat что пишет в консоль?
198. mikecool 3 25.10.19 09:19 Сейчас в теме
(197) из последнего:
jvm 1    |      at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:909)
jvm 1    |      at java.base/java.lang.Thread.run(Thread.java:834)
jvm 1    | 2019.10.25 09:12:06 WARN  app[][o.e.t.TcpTransport] exception caught on transport layer [Netty4TcpChannel{loc
alAddress=/127.0.0.1:56333, remoteAddress=/127.0.0.1:9091}], closing connection
jvm 1    | java.io.IOException: ╙фрыхээ√щ їюёЄ яЁшэєфшЄхы№эю ЁрчюЁтры ёє∙хёЄтє■∙хх яюфъы■ўхэшх
jvm 1    |      at java.base/sun.nio.ch.SocketDispatcher.read0(Native Method)
jvm 1    |      at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
jvm 1    |      at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
jvm 1    |      at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:233)
jvm 1    |      at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)
jvm 1    |      at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:358)
jvm 1    |      at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:433)
jvm 1    |      at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132)
jvm 1    |      at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347)
jvm 1    |      at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
jvm 1    |      at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:656)
jvm 1    |      at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:591)
jvm 1    |      at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:508)
jvm 1    |      at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:470)
jvm 1    |      at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:909)
jvm 1    |      at java.base/java.lang.Thread.run(Thread.java:834)
jvm 1    | 2019.10.25 09:12:06 WARN  app[][o.e.t.TcpTransport] exception caught on transport layer [Netty4TcpChannel{loc
alAddress=/127.0.0.1:56337, remoteAddress=/127.0.0.1:9091}], closing connection
jvm 1    | java.io.IOException: ╙фрыхээ√щ їюёЄ яЁшэєфшЄхы№эю ЁрчюЁтры ёє∙хёЄтє■∙хх яюфъы■ўхэшх
jvm 1    |      at java.base/sun.nio.ch.SocketDispatcher.read0(Native Method)
jvm 1    |      at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
jvm 1    |      at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
jvm 1    |      at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:233)
jvm 1    |      at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)
jvm 1    |      at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:358)
jvm 1    |      at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:433)
jvm 1    |      at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132)
jvm 1    |      at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347)
jvm 1    |      at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
jvm 1    |      at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:656)
jvm 1    |      at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:591)
jvm 1    |      at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:508)
jvm 1    |      at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:470)
jvm 1    |      at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:909)
jvm 1    |      at java.base/java.lang.Thread.run(Thread.java:834)
wrapper  | <-- Wrapper Stopped
Показать
234. artesk 30.06.20 15:30 Сейчас в теме
(198) Столкнулся с такой ошибкой - был занят порт 9000 какой-то утилитой HP, идущей в поставке с компьютером
199. roman_1379 28.10.19 10:08 Сейчас в теме
Кто использует Jenkins для запуска скриптов, а именно синхронизацию с хранилищем ?
При запуске команды gitsync sync ... "Сборка- Выполнить команду Windows" не используются предустановленные плагины;
[on] [1.0.5] - increment - Плагин добавляет возможность инкрементальной выгрузки в конфигурации
[on] [1.0.5] - limit - Плагин добавляет возможность ограничения на минимальный, максимальный номер версии хранилища, а так же на лимит на количество выгружаемых версий за один запуск
[on] [1.0.5] - check-authors - Плагин добавляет функциональность проверки автора версии в хранилище и файла AUTHORS
[on] [1.0.5] - check-comments - Плагин добавляет функциональность проверки комментариев в хранилище
[on] [1.0.5] - smart-tags - Плагин добавляет функциональность автоматической расстановки метов в git
[on] [1.0.5] - tool1CD - Плагин заменяет использование штатных механизмов 1С на tool1CD при синхронизации
[on] [1.0.5] - unpackForm - Плагин добавляет функциональность распаковки обычных форм на исходники
[on] [1.0.5] - disable-support - Плагин снимает конфигурацию с поддержки перед выгрузкой в исходники
[on] [1.0.5] - sync-remote - Плагин добавляет функциональность синхронизации с удаленным репозиторием git

Например не срабатывает increment, tool1CD, а если сделать то же самое из PowerShell, то они работают
200. roman_1379 29.10.19 10:15 Сейчас в теме
(199)
Отвечаю на свой вопрос, может кому понадобиться:
У пользователя под которым запускается агент сервера Jenkins не активированы плагины, перенастроил запуск службы под другим пользователем, заработало.
201. SkyJack 11.11.19 17:56 Сейчас в теме
Не подскажите в чем проблема. Сонар не стартует. В логе следующее:
--> Wrapper Started as Console
Launching a JVM...
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
  Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.

2019.11.11 17:00:22 INFO  app[][o.s.a.AppFileSystem] Cleaning or creating temp directory C:\SonarQube\sonarqube\temp
2019.11.11 17:00:22 INFO  app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9001
2019.11.11 17:00:22 INFO  app[][o.s.a.ProcessLauncherImpl] Launch process[[key='es', ipcIndex=1, logFilenamePrefix=es]] from [C:\SonarQube\sonarqube\elasticsearch]: C:\jdk-13\bin\java -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -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 -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=C:\SonarQube\sonarqube\temp -XX:ErrorFile=../logs/es_hs_err_pid%p.log -Xmx5g -Xms5g -XX:+HeapDumpOnOutOfMemoryError -Delasticsearch -Des.path.home=C:\SonarQube\sonarqube\elasticsearch -Des.path.conf=C:\SonarQube\sonarqube\temp\conf\es -cp lib/* org.elasticsearch.bootstrap.Elasticsearch
2019.11.11 17:00:22 INFO  app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
2019.11.11 17:00:22 INFO  app[][o.e.p.PluginsService] no modules loaded
2019.11.11 17:00:22 INFO  app[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
2019.11.11 17:00:28 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 1
2019.11.11 17:00:28 INFO  app[][o.s.a.SchedulerImpl] Process[es] is stopped
2019.11.11 17:00:28 INFO  app[][o.s.a.SchedulerImpl] SonarQube is stopped
<-- Wrapper Stopped
Показать
202. serge_focus 4 19.11.19 15:50 Сейчас в теме
обработкой rules-export.epf Сделал Выгрузку описаний правил АПК в файл JSON.
А как в Сонар загрузить эти правила выгруженные из АПК ?
204. serge_focus 4 19.11.19 21:00 Сейчас в теме
205. olegtymko 556 20.11.19 05:19 Сейчас в теме
(204) там не просто добить ПР, там переделать все)
206. gubanoff 48 04.12.19 13:19 Сейчас в теме
(0) спасибо за подробную инструкцию!
Все сделал по инструкции, первый раз сканирование прошло нормально, результаты в localhost:9000 отобразились. При повторном сканировании все скрипты отрабатывают нормально, но результат в localhost:9000 не показывается. На первой странице видны результаты предыдущего сканирования, истории изменения показателей нет. Если нажать на "ошибки" чтобы перейти к списку, ничего не отображается. Можно надо что-то почистить?
207. olegtymko 556 04.12.19 17:18 Сейчас в теме
(206)
изменения показателей нет. Если на
еще есть фоновые задания, если авторизовать - они видны. Они тоже какие то время выполняются.
208. Strady 13.12.19 15:46 Сейчас в теме
Спасибо за статью. Всё получилось. Правда была проблема на шаге
"Для второго этапа потребуется консольное приложение для запуска анализа проекта sonar scanner. Скачиваем сканер со страницы https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/. В нашем случае нужна версия для Windows x64:"
В статье не указано куда именно скопировать приложение. Я сначала скопировал в "C:\sonarqube", а нужно в папку с проектом. Кто делает в первый раз можно и не догадаться.
209. petrov_2015 18.12.19 17:08 Сейчас в теме
Спасибо за статью,- получилось быстрое "введение в специальность".
Подключил Sonar к проекту на Jenkins - тоже заработало, НО
Выгрузка из Хранилища конфигурации 1С осуществляется посредством gytsync 2.*, а он обычные формы разворачивает в подкаталог Form\modube. (без расширения). А эти самые файлы не получается "запелинговать" используя sonar.inclusions=**/*.bsl, **/module.
Пробовал **/Form/module.* - не схватывает. Как-то можно включить эти файлы в обработку?
210. ImHunter 197 18.12.19 17:21 Сейчас в теме
(209) В пар-рах gitsync ключ -process-fatform-modules используешь?
211. petrov_2015 19.12.19 17:05 Сейчас в теме
О! Благодарствую, "слона-то я и не приметил",- получилось!
212. Bazil 488 02.01.20 10:31 Сейчас в теме
(0) Спасибо за статью.
Делаю по инструкции, при старте сонара ошибка, как в (198)
"jvm 1 | 2020.01.02 10:27:57 WARN app[][o.e.t.TcpTransport] exception caught on transport layer [Netty4TcpChannel{localAddress=/127.0.0.1:50165, remoteAddress=/127.0.0.1:9001}], closing connection
jvm 1 | java.io.IOException: Удаленный хост принудительно разорвал существующее подключение
"
Подскажите куда копать?
213. olegtymko 556 02.01.20 16:19 Сейчас в теме
(212) что еще в логах пишется?
214. Bazil 488 02.01.20 18:36 Сейчас в теме
(213) Вот полный лог.
Прикрепленные файлы:
sonarstart.log
215. olegtymko 556 03.01.20 06:22 Сейчас в теме
(214) Сколько озу на машине? Какие настройки выставлены в файле conf\sonar.properties? Лог выше явно указывает на нехватку памяти для jvm.
216. Bazil 488 03.01.20 09:57 Сейчас в теме
(215) На машине 8 гб. Настройки взял из статьи. Поменял в настройках значения на 1g и все заработало.
Спасибо!
218. RCHERVAK 27 12.02.20 10:05 Сейчас в теме
Олег, добрый день.
Подскажите пожалуйста, каким образом вы смогли импортировать файл с правилами из АПК непосредственно в Сонар? Обработка по выгрузке файла правил отдает на выходе XML, но как подключить его не понятно, я так понимаю надо в плагин это все обернуть, или есть способы попроще?
serge_focus; petrov_2015; +2 Ответить
222. check2 125 12.04.20 23:08 Сейчас в теме
Есть ещё вопрос по дуплицированию строк. Вот нарвался на несколько таких случаев как на картинке.
Модуль формы и модуль группы полностью идентичны, и таких вхождений много > 20 по простым формам справочников. Если по тексту модуля посмотреть то есть вызовы общих методов из общих модулей, но порядок следования процедур - обработчиков одинаковый. Т.е. по сути - срабатывание ложное. Как то это можно побороть? Как в этом случае указать, что это не ошибка.
Прикрепленные файлы:
224. Labotamy 12.04.20 23:37 Сейчас в теме
(222) Срабатывание то точное, это копипаста. Только вынужденная, от которой никуда не деться.
225. check2 125 13.04.20 08:58 Сейчас в теме
(224) Ну с точки зрения логики работы SQ да, всё верно. Фишка в том, что "ошибок" таких несколько, и как раз именно они составляют превышение порога дубляжа в 20% в результате которого проверка конфигурации становиться в целом не пройденной. И речь о том, чтобы из общего скопа дубляжа эти случаи исключить, но я не нашёл способа как это сделать, в отличии от других ошибок где можно указать что "Ложное срабатывание". Я конечно понимаю, что можно увеличить порог, но это как то не очень.
Прикрепленные файлы:
232. nixel 910 16.04.20 00:49 Сейчас в теме
(225) вы можете деактивировать эту проверку в профиле качества
233. check2 125 16.04.20 15:47 Сейчас в теме
(232) Никита, конечно же могу, но это одно из преимуществ SQ перед АПК - то что меня заинтересовало. Я не говорю сейчас о преимуществах в "плюшках" типа графиков, просмотра ошибок в коде и планового времени на исправление - это тоже всё хорошо и полезно. Графики я могу и в АПК построить, при желании, для просмотра ошибок в коде из АПК есть расширение здесь на инфостарте, плановое время на исправление пока не сильно критично, а вот дублирование кода (чего нет в АПК, и достаточно трудно реализуемо) получается не учитывает архитектурных особенности 1С, и возможности отключения ложных срабатываний тоже нет. Это и опечалило.
Оставьте свое сообщение
Вопросы с вознаграждением