Объединение файлов отчетов Jacoco из нескольких источников

У меня есть следующая задача, которую я хотел бы решить. Вот текущая установка:

  • Дженкинс
  • Мавен
  • СонарКьюб
  • Java-приложение с несколькими модулями

Итак, в настоящее время в Jenkins у нас есть 2 сборки: одна для обычной доставки, а другая для создания отчетов сонара.

Что мы хотели бы сделать, так это сгенерировать сборку со строкой аргументов JaCoCo и отправить ее нашей команде контроля качества, чтобы получить более качественные цифры покрытия, которые мы могли бы добавить или объединить с числами, сгенерированными сборкой сонара, которую мы делаем каждый раз. день. Сборка, отправленная в QA, будет установлена ​​на другом сервере, отличном от того, с которого мы создаем сборку.

Что было бы лучшим подходом для выполнения этого. В конце концов, мы хотели бы также получать отчеты JaCoCo с наших рабочих станций разработчиков и добавлять эти числа на нашу страницу сонара.

EDIT 1 Благодаря подробностям, представленным в этой теме, я смог запустить свое многомодульное приложение со следующей опцией JVM: "-javaagent:${MAIN_DIR}/lib/jacocoagent.jar==destfile=/jacoco.exec,output=tcpserver,address=*"

В моей сборке Jenkins у меня есть следующие предварительные шаги: задача ant, которая вызывает target jacocoReport. Используемый для этой цели файл build.xml имеет следующий код:

<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
    <classpath path="/opt/hudson/tools/jacocoant.jar"/>
</taskdef>

<target name="jacocoReport">
        <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" dump="true" reset="true" destfile="${jacocoReportFile}" append="false"/>
</target>

<target name="jacocoReset">
        <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" reset="true" destfile="${jacocoReportFile}" append="false"/>
    <delete file="${jacocoReportFile}"/>
</target>

And finally I have a maven build step which calls sonar:sonar

Вот раздел в POM, относящийся к моему отчету об интеграции;

<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.itReportPath>${WORKSPACE}/it-jacoco.exec</sonar.jacoco.itReportPath>
<sonar.language>java</sonar.language>
<sonar.branch>9.9.5</sonar.branch>

Когда сборка завершается, моя запись Sonar по-прежнему показывает 0% для моих интеграционных тестов. Но когда я беру тот же отчет it-jacoco.exec и импортирую его с помощью сеанса покрытия импорта Jacoco в Eclipse, я получаю охват 26%.

Наконец, когда я просматриваю свои журналы сборки Jenkins, я вижу следующее:

Sensor JaCoCoItSensor...
Analysing /var/lib/jenkins/workspace/XXXXXX/it-jacoco.exec
No information about coverage per test.
Sensor JaCoCoItSensor done: 34 ms

person lbarriau    schedule 26.09.2014    source источник


Ответы (1)


Сбор покрытия из любого экземпляра приложения легко достижим благодаря функции инструментирования jacoco на лету. Вам нужно только предоставить jacocoagent.jar и добавить следующую опцию к вызову JVM:

-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]

Вот более подробная документация по этому поводу:

http://www.eclemma.org/jacoco/trunk/doc/agent.html

Затем, во время выполнения сборки Maven Sonar, вы должны указать следующий параметр с путем к сгенерированному файлу покрытия:

-Dsonar.jacoco.itReportPath=<path>

Здесь вы можете найти подробное описание:

http://docs.codehaus.org/display/SONAR/Code+Coverage+by+Integration+Tests+for+Java+Project

person Piotr Oktaba    schedule 27.09.2014
comment
Хорошо, звучит хорошо, но я запускаю свое Java-приложение, используя ant и файл build.xml. И я не могу понять, куда поместить переменные jacoco ant. курсив полужирный ‹target name=start description=Запустить диспетчер задач› ‹mkdir dir=${LOG_DIR} /› ‹java classname=TaskManager fork=true› ‹classpath refid =project.class.path /› ‹jvmarg value=-Xincgc /› ‹jvmarg value=-XX:NewSize=64m /› ‹jvmarg value=-XX:MaxNewSize=64m /› ‹jvmarg value=-Xmx512m /› ‹jvmarg value=-Xms512m /› ‹jvmarg value=-XX:MaxPermSize=128m /› ‹sysproperty key ... - person lbarriau; 29.09.2014
comment
У вас уже есть некоторые аргументы JVM. Просто добавьте еще один тег jvmarg со значением, установленным для включения jacoco. - person Piotr Oktaba; 29.09.2014
comment
Думаю, я понял. Последний вопрос по интеграции. Допустим, я выбираю опцию TCPServer, чтобы запустить генерацию отчета удаленно... После того, как отчет сгенерирован, каков мой лучший подход к Sonar? У меня уже есть запись в Sonar для моего проекта, который исходит от Maven. Могу ли я добавить файл, созданный удаленно, к файлам, созданным в maven, если да, то как? - person lbarriau; 03.10.2014
comment
Да, вы можете предоставить его, например, в качестве покрытия интеграции. Просто добавьте следующую опцию в ваш mvn sonar: выполнение цели сонара: -Dsonar.jacoco.itReportPath=‹full_path_to_coverage_file›. Я упомянул об этом также в своем ответе выше;) - person Piotr Oktaba; 05.10.2014
comment
Звучит справедливо, но есть ли способ импортировать отчет jacoco в сонар без использования maven? Допустим, я создаю свой проект, используя maven sonar:sonar, но я хотел бы также импортировать другие отчеты jacoco после завершения сборки? - person lbarriau; 21.10.2014