FAQ
Pytania z góry głowy od tego czasu oszalałem na punkcie jacoco.
Mój serwer aplikacji (jBoss, Glassfish ..) znajduje się w Iraku, Syrii, cokolwiek ... Czy jest możliwe uzyskanie pokrycia wielomodułowego podczas przeprowadzania na nim testów integracyjnych? Jenkins i Sonar również znajdują się na różnych serwerach.
Tak. Musisz użyć agenta jacoco, który działa w trybie output=tcpserver, jacoco ant lib. Zasadniczo dwie jarsekundy. To da ci 99% sukcesu.
Jak działa agent jacoco?
Dołączasz ciąg
-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*
do serwera aplikacji JAVA_OPTS i zrestartuj go. W tym ciągu wystarczy tylko [your_path]zastąpić ścieżkę do jacocoagent.jar, przechowywaną (przechowuj ją!) Na maszynie wirtualnej, na której działa serwer aplikacji. Od tego czasu uruchomisz serwer aplikacji, wszystkie wdrożone aplikacje będą dynamicznie monitorowane, a ich aktywność (czyli użycie kodu) będzie gotowa do uzyskania w formacie jacocos .exec na żądanie tcl.
Czy mogę zresetować agenta jacoco, aby zaczął zbierać dane wykonania dopiero od czasu rozpoczęcia mojego testu?
Tak, w tym celu potrzebujesz jacocoant.jar i skryptu budującego mrówka znajdującego się w obszarze roboczym jenkins.
Więc zasadniczo to, czego potrzebuję z http://www.eclemma.org/jacoco/, to jacocoant.jar znajdujący się w moim obszarze roboczym jenkins i jacocoagent.jar znajdujący się na mojej maszynie wirtualnej serwera aplikacji?
Zgadza się.
Nie chcę używać mrówka, słyszałem, że wtyczka jacoco maven też potrafi wszystko.
To nie w porządku, wtyczka jacoco maven może zbierać dane z testów jednostkowych i niektóre dane z testów integracji (patrz Arquillian Jacoco ), ale jeśli masz na przykład spokojne testy jako oddzielną kompilację w jenkins i chcesz pokazać pokrycie wielu modułów, mogę Nie widzę, jak wtyczka Maven może ci pomóc.
Co dokładnie wytwarza agent jacoco?
Tylko dane pokrycia w .execformacie. Sonar może to odczytać.
Czy jacoco musi wiedzieć, gdzie znajdują się moje klasy Java?
Nie, sonar tak, ale nie jacoco. Kiedy idziesz mvn sonar:sonarna zajęcia, w grę wchodzi.
A co ze skryptem mrówek?
Musi być prezentowany w Twoim obszarze roboczym Jenkinsa. Mój skrypt mrówki, nazwałem go jacoco.xmltak:
<project name="Jacoco library to collect code coverage remotely" xmlns:jacoco="antlib:org.jacoco.ant">
<property name="jacoco.port" value="6300"/>
<property name="jacocoReportFile" location="${workspace}/it-jacoco.exec"/>
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${workspace}/tools/jacoco/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>
</project>
Dwa obowiązkowe parametry, które należy przekazać podczas wywoływania tego skryptu,
-Dworkspace=$WORKSPACE
używają go do wskazania obszaru roboczego Jenkinsa i -Djacoco.host=yourappserver.comhosta bezhttp://
Zauważ też, że umieściłem mój jacocoant.jarw $ {workspace} /tools/jacoco/jacocoant.jar
Co mam teraz zrobić?
Czy serwer aplikacji został uruchomiony z plikiem jacocoagent.jar?
Czy umieściłeś ant script i jacocoant.jar w swoim obszarze roboczym Jenkins?
Jeśli tak, ostatnim krokiem jest skonfigurowanie kompilacji Jenkinsa. Oto strategia:
- Wywołaj cel mrówki,
jacocoResetaby zresetować wszystkie zebrane wcześniej dane.
- Przeprowadź testy
- Wywołaj cel mrówki,
jacocoReportaby uzyskać raport
Jeśli wszystko jest w porządku, zobaczysz it-jacoco.execw obszarze roboczym kompilacji.
Spójrz na zrzut ekranu, mam również antzainstalowany w moim obszarze roboczym w $WORKSPACE/tools/antdir, ale możesz użyć takiego, który jest zainstalowany w twoich jenkinsach.

Jak przesłać ten raport do sonaru?
Maven sonar:sonarwykona zadanie (nie zapomnij go skonfigurować), wskaże mu główny pom.xml, aby przeszedł przez wszystkie moduły. Użyj sonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.execparametru, aby wskazać sonarowi, gdzie znajduje się raport z testu integracji. Za każdym razem, gdy przeanalizuje nowe klasy modułów, będzie szukał informacji o pokryciu w it-jacoco.exec.
Mam już jacoco.exec w moim katalogu docelowym, sonar mvn: sonar go ignoruje / usuwa
Domyślnie mvn sonar:sonarrobi cleani usuwa katalog docelowy, użyj, sonar.dynamicAnalysis=reuseReportsaby tego uniknąć.