Недавно я пытался использовать Sonar 5.1 с моим проектом Grails 2.4.4. Я использовал обычный материал Groovy: Gmetrics, Codenarc и Cobertura . Для базы данных Sonar я использовал Postgres 9.4 .
Лог-файл для бегуна Sonar только что дал мне это:
|
01
02
03
04
05
06
07
08
09
10
|
build 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------build 22-Jun-2015 07:44:30 INFO: EXECUTION FAILUREbuild 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------build 22-Jun-2015 07:44:30 Total time: 9.153sbuild 22-Jun-2015 07:44:30 Final Memory: 30M/1039Mbuild 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------error 22-Jun-2015 07:44:30 ERROR: Error during Sonar runner executionerror 22-Jun-2015 07:44:30 ERROR: Unable to execute Sonarerror 22-Jun-2015 07:44:30 ERROR: Caused by: Unable to save file sourceserror 22-Jun-2015 07:44:30 ERROR: Caused by: -1 |
Не много пользы! Я подумал, что возникла некоторая проблема с разрешениями, поскольку «Невозможно сохранить исходные файлы» обычно означает это! Но проблем с разрешением не было. Затем я отключил часть анализа Cobertura, и все было в порядке, так что это было не так с частью Cobertura. После, я:
- включено подробное ведение журнала — sonar.verbose = true
- включил ведение журнала трассировки полного стека — с помощью ключа -e
- включил полное ведение журнала отладки с помощью ключа -X
это дало еще несколько подсказок.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
error 22-Jun-2015 11:09:06 ERROR: Error during Sonar runner executionbuild 22-Jun-2015 11:09:06 INFO: ------------------------------------------------------------------------error 22-Jun-2015 11:09:06 org.sonar.runner.impl.RunnerException: Unable to execute Sonarerror 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)error 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75)error 22-Jun-2015 11:09:06 at java.security.AccessController.doPrivileged(Native Method)error 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)error 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)error 22-Jun-2015 11:09:06 at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)error 22-Jun-2015 11:09:06 at org.sonar.runner.api.Runner.execute(Runner.java:100)error 22-Jun-2015 11:09:06 at org.sonar.runner.Main.executeTask(Main.java:70)error 22-Jun-2015 11:09:06 at org.sonar.runner.Main.execute(Main.java:59)error 22-Jun-2015 11:09:06 at org.sonar.runner.Main.main(Main.java:53)error 22-Jun-2015 11:09:06 Caused by: java.lang.IllegalStateException: Unable to save file sourceserror 22-Jun-2015 11:09:06 at org.sonar.batch.index.SourcePersister.persist(SourcePersister.java:84)error 22-Jun-2015 11:09:06 at org.sonar.batch.phases.DatabaseModePhaseExecutor.executePersisters(DatabaseModePhaseExecutor.java:165)error 22-Jun-2015 11:09:06 at org.sonar.batch.phases.DatabaseModePhaseExecutor.execute(DatabaseModePhaseExecutor.java:133)error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:264)error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:235)error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:230)error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:220)error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ScanTask.scan(ScanTask.java:57)error 22-Jun-2015 11:09:06 at org.sonar.batch.scan.ScanTask.execute(ScanTask.java:45)error 22-Jun-2015 11:09:06 at org.sonar.batch.bootstrap.TaskContainer.doAfterStart(TaskContainer.java:135)error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)error 22-Jun-2015 11:09:06 at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)error 22-Jun-2015 11:09:06 at org.sonar.batch.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:158)error 22-Jun-2015 11:09:06 at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:95)error 22-Jun-2015 11:09:06 at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:67)error 22-Jun-2015 11:09:06 at org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:48)error 22-Jun-2015 11:09:06 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)error 22-Jun-2015 11:09:06 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)error 22-Jun-2015 11:09:06 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)error 22-Jun-2015 11:09:06 at java.lang.reflect.Method.invoke(Method.java:606)error 22-Jun-2015 11:09:06 at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87)error 22-Jun-2015 11:09:06 ... 9 moreerror 22-Jun-2015 11:09:06 Caused by: java.lang.ArrayIndexOutOfBoundsException: -1error 22-Jun-2015 11:09:06 at java.util.ArrayList.elementData(ArrayList.java:371)error 22-Jun-2015 11:09:06 at java.util.ArrayList.get(ArrayList.java:384)error 22-Jun-2015 11:09:06 at com.google.protobuf.RepeatedFieldBuilder.getBuilder(RepeatedFieldBuilder.java:245)error 22-Jun-2015 11:09:06 at org.sonar.server.source.db.FileSourceDb$Data$Builder.getLinesBuilder(FileSourceDb.java:2911)error 22-Jun-2015 11:09:06 at org.sonar.batch.index.SourceDataFactory. |
Теперь, я мог видеть ранее в журнале, что анализ Кобертуры закончился. Я также мог видеть, что Cobertura cover.xml сгенерирован нормально (это файл, который собирает информацию о покрытии кода). Следующим шагом после создания файла cover.xml было то, что бегун эхолота проанализировал его и отправил запрос в Postgres, что-то должно было пойти не так на этапе синтаксического анализа, поскольку подключение к Postgres определенно не было проблемой (помните, что все нормально, когда Cobertura отключен ). Я знал, что нет проблем с отправкой запроса в Postgres, поэтому подумал, что в файле cover.xml должно быть что-то странное, что означало, что бегун Sonar не смог его проанализировать. Как уже говорилось, файл cover.xml подробно описывает, какой номер строки для каждого класса был и не был охвачен. Образец:
|
01
02
03
04
05
06
07
08
09
10
|
<class name="com.dublintech.me.ApiLogFilters" filename="com/dublintech/me/ApiLogFilters.groovy" line-rate="0.0" branch-rate="0.0" complexity="0.0"> <methods> <method name="<clinit>" signature="()V" line-rate="0.0" branch-rate="1.0"> <lines> <line number="25" hits="0" branch="false"> </line></lines> </method> ...</methods></class>... |
Так что же может сделать парсинг разбора? Как быть, если в файле cover.xml есть какой-то нечетный номер строки? хммм … Чтобы проверить это, я запустил следующий grep:
|
1
|
> grep "line number" coverage.xml |
Это дало слишком много. А как насчет отрицательных номеров строк?
|
1
|
>grep "line number=\"\-" coverage.xml |
Нет, нет. Хорошо, вернитесь к исключению, посмотрите на эту строку:
|
1
|
java.lang.ArrayIndexOutOfBoundsException: -1 |
хммм … Если бы номер строки был 0, я хотел бы знать, может ли это сделать какой-то анализ массива в индексе бегуна сонара за пределами границ?
|
1
|
>grep "line number=\"0" coverage.xml |
Ударить! Время разбирать строки до и после и получить больше информации об этом файле.
|
1
|
>grep -C20 "line number=\"0" coverage.xml |
Это дало мне виновника. Мне не было никакого смысла, почему Кобертура говорил, что у белья 0 было 0 хитов. Еще можно было открыть html-отчет Cobertura и просмотреть анализ. Сонар просто парировал, когда разбирал его. Поэтому я удалил этот файл из анализа Cobertura, добавив следующее в мою конфигурацию сборки.
|
1
2
3
4
5
6
|
coverage { xml = true exclusions = [ "**/com/dublintech/me/MyOddFile*" ]} |
Я тогда перезапустил и эй presto, все работает. Файл не был в файле cover.xml. Это означало, что бегун сонара мог разобрать файл, и все было в порядке.
Мне нравится сонар, мне нравится стабильная сборка, и мне нравится быстрая обратная связь, так что да, я был счастлив, когда он снова работал!
| Ссылка: | Проблемы с Cobertura и Sonar 5.1 от нашего партнера JCG Алекса Стейвли в блоге Tech Blog в Дублине . |