Статьи

Проблемы с Cobertura и Sonar 5.1

Недавно я пытался использовать 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 FAILURE
build 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------
build 22-Jun-2015 07:44:30 Total time: 9.153s
build 22-Jun-2015 07:44:30 Final Memory: 30M/1039M
build 22-Jun-2015 07:44:30 INFO: ------------------------------------------------------------------------
error 22-Jun-2015 07:44:30 ERROR: Error during Sonar runner execution
error 22-Jun-2015 07:44:30 ERROR: Unable to execute Sonar
error 22-Jun-2015 07:44:30 ERROR: Caused by: Unable to save file sources
error 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 execution
build 22-Jun-2015 11:09:06 INFO: ------------------------------------------------------------------------
error 22-Jun-2015 11:09:06 org.sonar.runner.impl.RunnerException: Unable to execute Sonar
error 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 sources
error 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 more
error 22-Jun-2015 11:09:06 Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
error 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 в Дублине .