Как использовать sonarQube из Maven для сбора инкрементального анализа перед фиксацией
Вопрос: Как использовать sonarQube из Maven для сбора инкрементального анализа перед фиксацией?
Справочная информация: Мы используем SonarQube 4.1.2 для выполнения анализа Java-проекта, созданного с помощью Maven. Мы установили плагин Report Issues Report 1.1 на сервер.
Я включил инкрементные отчеты в консоли сборки и вижу, что инкрементные данные правильно передаются с сервера непрерывной интеграции с помощью команды maven: mvn org.codehaus.mojo:sonar-maven-plugin:2.3.1:sonar -P sonar -Dsonar.java.target=1.7 -Dsonar.java.source=1.7 -Dsonar.profile=MyProfileName -Dsonar.branch=branchID
Существует связанный профиль Maven:
<profile>
<id>sonar</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<sonar.hostname>mySonarHostName</sonar.hostname>
<sonar.host.url>http://${sonar.hostname}:9000</sonar.host.url>
<sonar.jdbc.url>jdbc:oracle:thin:@${sonar.hostname}:1521/sabrixdb</sonar.jdbc.url>
<sonar.jdbc.username>dbusername</sonar.jdbc.username>
<sonar.jdbc.password>dbpassword</sonar.jdbc.password>
<sonar.jdbc.driver>oracle.jdbc.driver.OracleDriver</sonar.jdbc.driver>
<sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
</properties>
</profile>
Из журналов сервера непрерывной интеграции CI я могу видеть добавочные отчеты на консоли, как и ожидалось:
build 14-Jul-2014 15:40:37 [INFO] [15:40:37.699]
build 14-Jul-2014 15:40:37
build 14-Jul-2014 15:40:37 ------------- Issues Report -------------
build 14-Jul-2014 15:40:37
build 14-Jul-2014 15:40:37 +3 issues
build 14-Jul-2014 15:40:37
build 14-Jul-2014 15:40:37 +3 major
build 14-Jul-2014 15:40:37
build 14-Jul-2014 15:40:37 -------------------------------------------
build 14-Jul-2014 15:40:37
build 14-Jul-2014 15:40:37
Когда это вызывается из машины разработки для инкрементального анализа с помощью команды: mvn org.codehaus.mojo:sonar-maven-plugin:2.3.1:sonar -Dsonar.profile=MyProfileName -Dsonar.branch=branchID -Dsonar.analysis.mode=incremental -Dsonar.host.url=http://mySonarHostName:9000 -Dsonar.issuesReport.html.enable=true -Dsonar.issuesReport.console.enable=true -Dsonar.dynamicAnalysis=reuseReports
Я получаю инкрементный отчет, в котором есть много проблем, которые можно ожидать от модифицированного кода. Любопытно, что число здесь также больше, чем общее количество проблем для проекта, измеренное на сервере sonarQube:
------------- Issues Report -------------
+65058 issues
+42709 major
+2287 minor
+20062 info
-------------------------------------------
Ссылочные ссылки Я изучил следующие ссылки в рамках моего исследования:
Три варианта предварительного анализа http://www.sonarqube.org/three-options-for-pre-commit-analysis/
Анализ против предварительного просмотра против добавочного предварительного просмотра в SonarQube http://www.sonarqube.org/analysis-vs-preview-vs-incremental-preview-in-sonarqube/
Плагин отчета о проблемах http://docs.sonarqube.org/display/SONAR/Issues+Report+Plugin
CodeHaus Sonar Плагин Maven http://mojo.codehaus.org/sonar-maven-plugin/plugin-info.html
Обновление (2014/07/16) Заметил эту тему [ http://sonarqube.15.x6.nabble.com/Incremental-run-mode-td5024228.html]. Это объясняет, что инкремент обрабатывает хеш файла, чтобы определить, какие файлы анализировать.
Проект, над которым я работаю, сгенерировал код, который сонар не должен игнорировать. Я постулирую, что это вызывает дополнительный отток (кроме того, это просто плохая идея для сканирования машинного кода). Чтобы исследовать эту теорию, я добавляю -Dsonar.exclusions=com/generatedpackage/**/*.java
в команду.
Обновление (2014/07/17)
Указав сгенерированные источники в sonar.exclusion, количество нарушений, обнаруженных для "инкрементального" анализа, было уменьшено. После того как все они были учтены, количество проблем / нарушений было приведено в соответствие с количеством проблем, которые я представил для проверки процесса на месте. Чтобы упростить поддержку этого, я затем упростил подавленные метрики для всех сгенерированных файлов, используя следующий шаблон: file:**/generated*/**
Для единообразия я смог указать это в корневом POM анализируемого проекта.
<sonar.exclusions>file:**/generated*/**</sonar.exclusions>
Как упоминалось выше, в ветке форума сонара Qube объясняется, что при инкрементальном анализе будут анализироваться только те файлы, хэш которых не совпадает с хешированными файлами на сервере сонара Qube.
1 ответ
Ключ к успешному использованию этого был двояким: 1) Убедитесь, что плагин "Отчет о проблемах" установлен на сервере sonarQube. 2) Укажите sonar.exclusion, чтобы исключить сгенерированные источники.
С этим в руке и профилем "сонара" пользователю нужно только добавить этот профиль "сонара" и цель sonar: sonar к команде maven
Это меняет:
mvn clean install -P myProfile
Для того, чтобы:
mvn clean install sonar:sonar -P myProfile,sonar
Профиль maven может привязать цель сонара к фазе проверки, чтобы исключить необходимость указания цели при добавлении профиля. Я решил не связывать плагин, чтобы позволить себе немного больше гибкости.
Этого было достаточно, чтобы пользователи могли проверить инкрементный код.