Отчет JaCoCo не работает в Jenkins: java.lang.ArrayIndexOutOfBoundsException

Я использовал JaCoCo локально без проблем.

При запуске задания Jenkins на удаленном сервере задание строится нормально и генерирует отчет о покрытии JaCoCo (т. е. он появляется в моей папке workspace/report), но при попытке опубликовать отчет на Jenkins сборка завершается ошибкой.

Я использую Jenkins 1.460 и JaCoCo 5.0.0.

Я настроил Jenkins с помощью:

  • Путь к исполняемым файлам: **/**.exec
  • Путь к классам: **/dist/validation/WEB-INF/classes
  • Путь к источнику: **/src (я также пробовал **/Validation/src и явно включал **/**.class и исключал другие типы файлов)

Это проблема конфигурации или ошибка совместимости?

[EDIT: если это поможет кому-то еще, другие форумы говорят, что JaCoCo требует ASM 5.+ для управления анализом классов Java 8. Я уже использую ASM 5.0.1.]

BUILD SUCCESSFUL
Total time: 4 minutes 57 seconds
Archiving artifacts
Recording test results
[JaCoCo plugin] Collecting JaCoCo coverage data...
[JaCoCo plugin] **/**.exec;**/dist/validation/WEB-INF/classes;**/Validation/src; locations are configured
[JaCoCo plugin] Number of found exec files for pattern **/**.exec: 1
[JaCoCo plugin] Saving matched execfiles:  E:\Jenkins\jobs\Validation - Test Cases\workspace\Validation\jacoco.exec
[JaCoCo plugin] Saving matched class directories for class-pattern: **/dist/validation/WEB-INF/classes:  E:\Jenkins\jobs\Validation - Test Cases\workspace\Validation\dist\validation\WEB-INF\classes
[JaCoCo plugin] Saving matched source directories for source-pattern: **/Validation/src:  E:\Jenkins\jobs\Validation - Test Cases\workspace\Validation\src
[JaCoCo plugin] Loading inclusions files..
[JaCoCo plugin] inclusions: []
[JaCoCo plugin] exclusions: []
ERROR: Publisher hudson.plugins.jacoco.JacocoPublisher aborted due to exception
java.io.IOException: Error while analyzing class E:\Jenkins\jobs\Validation - Test Cases\builds\2015-02-23_15-59-44\jacoco\classes\org\gosh\validation\filters\ModifiedFileListFilter.class.
    at org.jacoco.core.analysis.Analyzer.analyzerError(Analyzer.java:150)
    at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:144)
    at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:175)
    at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:208)
    at hudson.plugins.jacoco.ExecutionFileLoader.analyzeStructure(ExecutionFileLoader.java:126)
    at hudson.plugins.jacoco.ExecutionFileLoader.loadBundleCoverage(ExecutionFileLoader.java:133)
    at hudson.plugins.jacoco.JacocoReportDir.parse(JacocoReportDir.java:102)
    at hudson.plugins.jacoco.JacocoBuildAction.loadRatios(JacocoBuildAction.java:291)
    at hudson.plugins.jacoco.JacocoBuildAction.load(JacocoBuildAction.java:273)
    at hudson.plugins.jacoco.JacocoPublisher.perform(JacocoPublisher.java:371)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:19)
    at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:705)
    at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:680)
    at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:658)
    at hudson.model.Build$RunnerImpl.post2(Build.java:162)
    at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:627)
    at hudson.model.Run.run(Run.java:1446)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:238)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 7
    at org.jacoco.core.internal.analysis.MethodAnalyzer.addProbe(MethodAnalyzer.java:288)
    at org.jacoco.core.internal.analysis.MethodAnalyzer.visitInsnWithProbe(MethodAnalyzer.java:224)
    at org.jacoco.core.internal.flow.MethodProbesAdapter.visitInsn(MethodProbesAdapter.java:76)
    at org.objectweb.asm.tree.InsnNode.accept(InsnNode.java:80)
    at org.objectweb.asm.tree.InsnList.accept(InsnList.java:162)
    at org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:815)
    at org.jacoco.core.internal.flow.ClassProbesAdapter$1.visitEnd(ClassProbesAdapter.java:124)
    at org.objectweb.asm.ClassReader.b(Unknown Source)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:107)
    at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:142)
    ... 18 more
Finished: FAILURE

[ОБНОВЛЕНИЕ - решение]

Используя этот ответ, я установил недавно выпущенный JaCoCo-0.7.4 (см. eclemma.org/jacoco) на моем локальном диске. Эта версия содержит исправление для проблемы 27088. Мне также пришлось удалить, а затем переустановить плагин Jenkins JaCoCo (я использовал Jenkins Plugin Manager).


person Lydia Ralph    schedule 23.02.2015    source источник


Ответы (2)


Похоже, существует проблема совместимости между версией JaCoCo, используемой во время сборки, и версией, используемой Jenkins в действии после сборки.

Эту проблему вызывает версия maven-jacoco-plugin 0.7.3.201502191951 в сочетании с версией Jenkins JaCoCo Plugin 1.0.18. Версия 0.7.2.201409121644 плагина maven-jacoco кажется совместимой.

См. также https://issues.jenkins-ci.org/browse/JENKINS-27088 и https://github.com/jenkinsci/jacoco-plugin/pull/51< /а>

person MyKey_    schedule 24.02.2015
comment
Спасибо. Не могли бы вы объяснить, как я могу решить эту несовместимость? Я попытался установить JaCoCo вручную и через диспетчер плагинов Jenkins. Автоматический установщик дает мне JaCoCo 1.0.18, а все остальные модули (org.jacoco.agent, jacoco-maven-plugin, org.jacoco.report и org.jacoco.core) версии 0.7.1.201405082137 - на самом деле свойство с именем ${jacoco.version}. Как я могу управлять этими зависимостями? - person Lydia Ralph; 24.02.2015
comment
Обновление. Я создал базовое задание, которое подтверждает, что мои версии JaCoCo и Jenkins совместимы, так что проблема не в этом. - person Lydia Ralph; 24.02.2015
comment
Не повезло, к сожалению. - person Lydia Ralph; 27.02.2015
comment
Я попытался еще раз, установив недавно выпущенную версию JaCoCo-0.7.4 (см. eclemma.org/jacoco) на мой местный диск. Эта версия содержит исправление для проблемы № 51 выше. Мне также пришлось удалить, а затем переустановить плагин Jenkins JaCoCo (я использовал Jenkins Plugin Manager). Мой отчет сейчас публикуется на Jenkins. У меня есть пустой график покрытия, но я думаю, что это отдельная тема. - person Lydia Ralph; 02.03.2015

Две вещи: в конфигурации вашего проекта Jenkins для действия JaCoCo Post-build обязательно установите поле Inclusions. Что-то вроде */*.class должно работать. Также удалите вторую звездочку (*) из ваших выражений выше. Сделайте их */*.exec, */dist/ и т. д.

Сегодня у меня было похожее подобное исключение ArrayIndexOutOfBounds из плагина Jacoco. Однако это произошло только в Jenkins, а не при запуске сборки maven из командной строки. Поиск в Google показал, что синтаксис поля включения и исключения плагина Jacoco вызывает проблемы у людей. Я попробовал несколько разных форматов для этих полей, но безрезультатно, поэтому я перешел на плагин cobertura, который было очень просто использовать: https://wiki.jenkins-ci.org/display/JENKINS/Cobertura+Плагин#CoberturaPlugin-ConfiguringtheCoberturaPlugin

person Sinsanator    schedule 23.02.2015
comment
Если вы думаете, что плагин Jacoco отстой, возможно, вы могли бы пояснить, почему? Заметьте, у меня нет никакого мнения по этому поводу, я просто думаю, что такие аргументы должны сопровождаться объяснением. - person Magnilex; 24.02.2015
comment
Я пытался заставить Cobertura работать в течение последнего месяца и в конце концов пришел к выводу, что Cobertura по-прежнему несовместима с Java 7+. Я перехожу на JaCoCo по этой причине. Я не могу найти ничего в Интернете, чтобы предположить, что Cobertura была обновлена, поэтому, к сожалению, эта опция для меня недоступна. - person Lydia Ralph; 24.02.2015
comment
Спасибо за предложение о явных включениях. Я должен был сказать, что уже пытался включить **/**.class и исключить (например) **/**.xsd. ** отлично работает с другими параметрами конфигурации, поэтому я не думаю, что это вызывает проблему. - person Lydia Ralph; 24.02.2015
comment
Поиск в Google привел к темам, в которых предполагалось, что ** может вызывать проблему и что вам необходимо ввести значения для полей включения и исключения. Как только я это сделал, плагин Jacoco Jenkins перестал выдавать исключение ArrayIndexOutOfBounds, поэтому я подумал, что на правильном пути, и именно тогда я отправил сообщение на ваш вопрос. У меня все еще были проблемы с просмотром моих файлов классов, поэтому я сделал перерыв и загрузил плагин Cobertura, который работал почти мгновенно, просто добавив его в мой maven pom. Я строю с использованием Java 7, и у Cobertura с этим нет проблем. - person Sinsanator; 25.02.2015
comment
Когда вы использовали cobertura, какую версию вы использовали? Я использую 2.6. Я думаю, что более ранние версии не поддерживали Java 7. - person Sinsanator; 25.02.2015
comment
@Magnilex, мне, наверное, не стоило сразу переходить к отстойному плагину Jenkins Jacoco. Я обновил свой ответ, чтобы лучше отразить, почему я перешел в cobertura. - person Sinsanator; 25.02.2015
comment
@Sinsinator Я думаю, что самая последняя версия 2.0.3 ...? Не уверен, где вы нашли версию 2.6. - person Lydia Ralph; 27.02.2015
comment
@LydiaRalph, вы правы, Cobertura версии 2.0.3, я говорил о плагине maven: mvnrepository.com/artifact/org.codehaus.mojo/ - person Sinsanator; 27.02.2015