2014-03-04 4 views
25

Ich habe Probleme mit Sonar beim Abrufen des Jacoco-Analyseberichts. Jenkins ist jedoch in der Lage, den Bericht aufzunehmen und die Ergebnisse anzuzeigen. Mein Projekt ist ein Maven Build, gebaut von Jenkins. Der jacoco-Bericht wird von maven erzeugt (konfiguriert im Pom). Sonar wird mit dem Jenkins-Plugin ausgeführt.SonarQube empfängt keine Unit-Testabdeckung

Das ist, was ich auf Sonarqube sehen:

SonarQube Screen Capture

Dies ist der Bericht i des Projekts in jenkins sehen können.

Jacoco report in Jenkins

Das Maven Plugin config:

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.6.4.201312101107</version> 
    <executions> 
     <execution> 
     <id>default-prepare-agent</id> 
     <goals> 
      <goal>prepare-agent</goal> 
     </goals> 
     </execution> 
     <execution> 
     <id>default-report</id> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>report</goal> 
     </goals> 
     </execution> 
     <execution> 
      <id>default-check</id> 
      <goals> 
       <goal>check</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Jenkins Sonar Plugin Config enter image description here

+1

Irgendwo in der Konsole Ausgabe sollte sagen: "Code-Coverage auf 0% gesetzt ...", das Informationen wären nützlich, um Ihr Problem zu beheben. Es fallen jedoch zwei Dinge auf, ohne dass man es sich ansehen muss: 1. Sie sollten die Eigenschaft sonar.binaries einstellen und auf Ihre kompilierten Klassendateien verweisen. 2. Sie sollten sonar.tests setzen und auf Ihre nicht kompilierten Testdateien zeigen. 3. Sie sollten im Debug-Modus kompilieren (Sie könnten bereits ich kann nicht sagen) – Cole9350

+0

@ Cole9350 so der Fehler, ich sehe in der Ausgabe ist: _Project Coverage ist auf 0% eingestellt, da es keine Verzeichnisse mit classes._ Ich habe versucht, sonar.binaries auf die Wurzel des Klassenverzeichnisses zu setzen -/target/classes - aber das führte zu einem Fehler, der besagt, dass sie nicht gefunden werden konnte – anton91

+0

** Korrektur ** Ich habe es erneut versucht und den vollständig qualifizierten Pfad zu den Klassen festgelegt und ich bin jetzt in der Lage, die Codeabdeckung zu sehen. Allerdings weiß ich den Fehler sehen, wenn der Jacoco-Sensor läuft: Keine Informationen über die Abdeckung pro Test. – anton91

Antwort

41

Sie haben ein paar wichtige Sonar Eigenschaften fehlen, ist hier eine Probe von einem meiner baut:

sonar.jdbc.dialect=mssql 
sonar.projectKey=projectname 
sonar.projectName=Project Name 
sonar.projectVersion=1.0 
sonar.sources=src 
sonar.language=java 
sonar.binaries=build/classes 
sonar.tests=junit 
sonar.dynamicAnalysis=reuseReports 
sonar.junit.reportsPath=build/test-reports 
sonar.java.coveragePlugin=jacoco 
sonar.jacoco.reportPath=build/test-reports/jacoco.exec 

Der Fehler in der Jenkins-Konsolenausgabe kann sehr nützlich sein, um Code Coverage zum Laufen zu bringen.

Die Projektabdeckung wird auf 0% gesetzt, da keine Verzeichnisse mit Klassen vorhanden sind.
Zeigt an, dass Sie nicht die Sonar.Binaries Eigenschaft richtig

Keine Informationen über Verbrauch pro Test festgelegt haben
Zeigt Ihnen die Sonar.Tests Eigenschaft ordnungsgemäß

Coverage-Informationen nicht erfasst wurden. Vielleicht vergessen Sie, Debug-Informationen in kompilierte Klassen aufzunehmen? Zeigt an, dass die sonar.binaries Eigenschaft richtig eingestellt wurde, aber diese Dateien wurden nicht im Debug-Modus kompiliert, und sie brauchen

+2

Die Einstellungen sind nicht alle erforderlich (z. B. dynamicAnalysis ist veraltet). Ich habe das für die binaries -Eigenschaft aktualisiert, ich habe das falsch eingestellt. – user1226868

+0

Hallo, ich habe die selbe Konfiguration für Android-Kotlin, build erzeugt erfolgreich und außer Code-Coverage ist alles an Ort und Stelle. Jeder Vorschlag, was könnte fehlen. Zu Ihrer Information: Ich benutze exakt dieselbe Konfiguration, die Sie erwähnt haben. – CoDe

5

Basierend auf https://github.com/SonarSource/sonar-examples/blob/master/projects/tycho/pom.xml die folgende POM arbeitet für mich sein:

<properties> 
    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin> 
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> 
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath> 
</properties> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.jacoco</groupId> 
      <artifactId>jacoco-maven-plugin</artifactId> 
      <version>0.7.0.201403182114</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>prepare-agent</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <destFile>${sonar.jacoco.reportPath}</destFile> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
  • Durch Festlegen der Zieldatei im Berichtspfad wird sichergestellt, dass Sonar genau die Datei liest, die von JaCoCo generiert wird.
  • Der Berichtspfad sollte außerhalb der Projektverzeichnisse liegen, um die projektübergreifende Abdeckung zu berücksichtigen (z. B. im Fall von Tycho, wo die Konvention separate Projekte für Tests haben soll).
  • Die Einstellung reuseReports verhindert das Löschen der JaCoCo-Berichtsdatei vor dem Lesen! (Seit 4.3, this is the default und ist veraltet.)

Dann laufe ich nur

mvn clean install 
mvn sonar:sonar 
+0

Vielen Dank, es hat meine Zeit gerettet. Nette Lösung. –

0

Jenkins zeigt keine Berichterstattung Ergebnisse, da es ein Problem der Version Kompatibilitäten zwischen jenkins jacoco Plugin und Maven jacoco Plugin ist. Auf meiner Seite habe ich es behoben durch eine neuere Version von Maven Plugin jacoco

mit
<build> 
    <pluginManagement> 
    <plugins> 
     <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>0.7.9</version> 
     </plugin> 
    <plugins> 
    <pluginManagement> 
<build> 
0

Fügen Sie die sunfire und jacoco Plugins in der pom.xml und Führen Sie das Maven-Befehl wie unten angegeben.

mvn jacoco: prepare-Agent jacoco: Bericht Sonar: Sonar

<properties> 
    <surefire.version>2.17</surefire.version> 
    <jacoco.version>0.7.2.201409121644</jacoco.version> 

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>${surefire.version}</version> 
     </plugin> 

     <plugin> 
      <groupId>org.jacoco</groupId> 
      <artifactId>jacoco-maven-plugin</artifactId> 
      <version>${jacoco.version}</version> 

      <executions> 
       <execution> 
        <id>default-prepare-agent</id> 
        <goals><goal>prepare-agent</goal></goals> 
       </execution> 
       <execution> 
        <id>default-report</id> 
        <phase>prepare-package</phase> 
        <goals><goal>report</goal></goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins>