Человеку свойственно ошибаться. Это сказывается при таких факторах как стресс, отвлекающие факторы и естественная невнимательность к мелочам. Дело в том, что человек отнюдь не заточен под выполнение однообразных операций и человеческий мозг отдает меньше ресурсов и значимости к мелким деталям. Для этого человек изобрел вычислительные машины – компьютер прекрасно справляется с однотипными задами, проверяя всё до мельчайших деталей (в рамках заданного алгоритма).
В данной статье будет рассказано о том, как поставить помощника разработчику, который будет изучать весь проект целиком на предмет потенциальных ошибок и “загнивания” кода. Этот инструмент позволит быстро понять в каком состоянии находится проект, насколько он пригоден к дальнейшей модификации. Также, будет небольшой бонус в виде плагина, который помогает визуально определить ошибку прямо при написании кода.
Встречайте – SonarQube!
Сразу перейдём к делу – изучим требуемые реквизиты для установки. Процесс установки как обычно – кликом на установщик, если не оговорено иное. После установки будет рассмотрено как запустить процесс анализа .NET проекта на примере маленького, но очень гордого проекта и посмотрим какие ошибки нам сообщит SonarQube
Установка
Приведем полный список необходимых компонентов с ссылками в открытом доступе (архив будет приложен):
После установки .NET и JRE 8 с помощью инсталляторов, требуется распаковать архивы Sonar-server и MsBuild сканнера. Содержимое этих архивов выглядит примерно так:
От корней этих двух папок далее будем отталкиваться. Далее приступим к настройке сервера.
Установка сервера
Сонар представляет собой Windows-сервис, который, по умолчанию, прослушивает 9000 порт. Поэтому рекомендуется либо освободить этот порт, либо назначить другой порт (об этом в конце).
Посмотреть занят ли порт можно командой
netstat -n -o -ab | find “9000”
Примерно так выглядит свободный порт – в крайней правой колонке все processID = 0. В противном случае нужно прибить процесс с указанным айди
В папке sonarqube\bin\windows-x86-[32|64] (зависит от разрядности рабочей станции), запустить InstallNTService.bat. Когда сервис будет установлен – запустить StartNTService.bat.
Сервису требуется некоторое время для запуска. Примерно 30 секунд. После чего сервис будет доступен по адресу localhost:9000 , как показано ниже:
Соответственно, netstat выдаст такой результат:
Заметка: для входа в систему используйте логин: admin, пароль: admin. Функционал админки на самостоятельное изучение.
Теперь сервис настроен, и любой сонар-анализатор будет складывать туда результаты анализов. Далее будет настроен анализатор для MSBuild и показано его использование.
Настройка анализатора
В первую очередь следует добавить запускаемые файлы в переменные среды (Path). Это делается так: Мой комьютер – Свойства – Изменить параметры – вкладка “Дополнительно” – Переменные среды.
Туда следует добавить пути:
- MsBuildScanner: ~\msbuildScanner\SonarQube.Scanner.MSBuild.exe
- MsBuild: C:\Program Files (x86)\MSBuild\XX.0\Bin , или другой путь куда была установлена MSBuild.
Проверьте работоспособность добавленных путей, открыв командную строку (Win+R – ввести: cmd – enter), и написав там SonarQube.Scanner.MSBuild.exe и MsBuild.exe – если эти две инструкции отработали по очереди – значит система почти готова! Осталось запустить сканирование!
Сканирование
Рассмотрим сканирование с помощью командной строки, так как на серверах билд запускается именно так. Сканирование выполняется тремя строчками:
SonarQube.Scanner.MSBuild.exe begin /k:"org.sonarqube:sonarqube-scanner-msbuild" /n:"%PROJECT_NAME%" /v:"%PROJECT_VERSION%" MSBuild.exe %SOLUTION_FILE_PATH% /t:Rebuild SonarQube.Scanner.MSBuild.exe end
где,
- PROJECT_NAME – уникальное имя проекта для его идентификации при рассмотре анализа
- PROJECT_VERSION – версия проекта
- SOLUTION_FILE_PATH – относительный или полный путь к .sln файлу.
В данном примере, решение лежит в папке src, а рядом с этой папкой лежит скрипт для сборки проекта с его анализом.
Соответственно, в данном случае, текст скрипта заменен (вместе с процентами) на:
- PROJECT_NAME – “Phantasm”
- PROJECT_VERSION – “1.0”
- SOLUTION_FILE_PATH – “src\Phantasm.sln”
После запуска батника, состояние сайта обновится следующим образом:
Где Code Smells означает потенциальные проблемы в маленьком, но очень гордом проекте. Однако, как видно на скринах ниже, поддерживаемость проекта хорошая “А”, и ожидаемое время на исправление ошибок – 4 часа. Естественно, сканнер не может предполагать сколько займет реализация TODO комментариев.
Таким образом, была получена, понятная менеджменту, метрика о техническом состоянии проекта. Далее будет рассмотрен случай настройки сервера на другой порт и плагин для студии.
Настройка сервера на другой порт
Зачастую порт по умолчанию занят другим важным процессом. Тогда будет очень кстати знание о смене порта сервиса. Данный процесс не ограничивается сменой конфигурации сервиса в случае работы с MSBuild. Также требуется указать для MSBuild на какой порт стучаться с результатами анализов. Далее будет показано в каких файлах какие изменения применить, чтоб, например, выставить порт 50110. Прежде всего, требуется остановить сервис, если он включен, и убедиться что желаемый порт свободен.
Итак, конфигурация:
\sonarqube\conf\sonar.properties sonar.web.port=50110 \msbuild-scanner\SonarQube.Analysis.xml <Property Name="sonar.host.url">http://localhost:50110</Property>
В итоге, сервис теперь доступен на порту 50110, и результаты повторного анализа туда приходят:
Если сервис недоступен по причине даунтайма или неправильно настроен порт – анализ произойдет с ошибкой, внимательно следите за логами. Пример хороших логов будет приложен в статье.
На этом всё со сканером, но прощаться рано – напоследок оставлен плагин для Visual Studio 2015/2017 от Сонара.
SonarLint
Плагин можно скачать тут. Он просто подсвечивает предупреждения, которые выдает студия:
Стоит заметить, что название переменной тоже должно было подсветиться. Вероятно, это правило проверки просто не включено в проект. Об этих правилах поговорим в другой раз.
Плодотворной работы!
PS – требуемые файлы в одном пакете: https://yadi.sk/d/mrDGMQ0k3EDbUK