40 votes

Rapport de couverture de code utilisant le fichier gitlab-ci.yml

J'ai besoin de voir le rapport de couverture de code pour un projet java maven dans Gitlab. D'après este , este et d'autres sources :

  1. J'ai ajouté jacoco à la liste des plugins dans pom.xml .
  2. J'ai ajouté le travail des pages à mon .gitlab-ci.yml fichier.
  3. Ajouté Total.*?([0-9]{1,3})% à l'analyse de la couverture du code dans le cadre du projet.

mais il n'y a pas de rapport de couverture ou du moins je ne le vois pas. Il n'y a pas de page de pourcentage de couverture ou de rapport de couverture.

Contenu de .gitlab-ci.yml fichier :

image: maven:latest

variables:
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"

cache:
  paths:
    - .m2/repository/

build:
  stage: build
  script:
    - mvn $MAVEN_CLI_OPTS compile

test:
  stage: test
  script:
    - mvn $MAVEN_CLI_OPTS test
  artifacts:
    paths:
      - target/site/jacoco/
pages:
  stage: deploy
  dependencies:
    - test
  script:
   - mkdir public
   - mv target/site/jacoco/index.html public
  artifacts:
    paths:
      - public

deploy:
  stage: deploy
  script:
    - mvn $MAVEN_CLI_OPTS verify
  only:
    - master

jacoco plugin dans pom.xml :

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.5.201505241946</version>
    <executions>
        <execution>
            <id>pre-unit-test</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>post-unit-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Mon projet est un projet privé sur gitlab.com .

Pipeline et ses 4 travaux sont passés avec succès.

Comment puis-je voir les rapports de couverture ?

3voto

magiccrafter Points 81

Afin d'afficher le pourcentage de couverture totale de base, il vous suffit :

test:
  stage: test
  image: maven:3.6.3-jdk-11
    - mvn $MAVEN_CLI_OPTS test
    - cat target/site/jacoco/index.html | grep -o 'Total[^%]*%'
  coverage: '/Total.*?([0-9]{1,3})%/'
  artifacts:
    paths:
      - target/site/jacoco/jacoco.xml
    expire_in: 1 mos
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

et si vous voulez activer la fonction de visualisation de la couverture du code :

visualize_test_coverage:
  stage: visualize_test_coverage
  image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
  script:
    - 'python /opt/cover2cover.py target/site/jacoco/jacoco.xml src/main/java > target/site/cobertura.xml'
    - 'python /opt/source2filename.py target/site/cobertura.xml'
  needs: [ "test" ]
  dependencies:
    - test
  artifacts:
    reports:
      cobertura: target/site/cobertura.xml
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

Pour des informations détaillées, consultez les documents officiels de Gitlab. aquí

1voto

istepaniuk Points 1389

Plutôt que d'essayer d'analyser la sortie HTML, ce court awk script extrait le pourcentage du fichier jococo.csv.

#!/bin/sh

# This awk script calculates a code coverage %
# usage: pass the the jacoco.csv file as first argument

awk -F "," '
    {
      instructions += $4 + $5; covered += $5
    }
    END {
      print covered, "/", instructions, "instructions covered";
      printf "%.2f%% covered\n", covered / instructions * 100
    }' "$1"

Imprimés :

coverage.sh target/site/jacoco/jacoco.csv 
369992 / 469172 instructions covered
78.86% covered

Vous devez ajuster le format printf pour qu'il corresponde à votre regex de couverture Gitlab.

1voto

Sree Points 1021

Ajouter la configuration pour l'objectif prepare-agent

 <configuration>
 <!-- Sets the path to the file which contains the execution data. -->
 <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
 <!--Sets the name of the property containing the settings
                            for JaCoCo runtime agent.-->
 <propertyName>surefireArgLine</propertyName>
 </configuration>

Et aussi dans le plugin maven-surefire-plugin ajouter la propriété suivante sous la configuration de

<argLine>surefireArgLine</argLine>

Sur l'exécution de votre objectif de test. Les rapports seront générés. Le jacoco-ut.exec généré ne peut être visualisé qu'en utilisant un IDE.

Voici un exemple de projet https://github.com/r-sreesaran/http-patch-jax-rs

Pour plus d'informations, voir https://www.petrikainulainen.net/programming/maven/creating-code-coverage-reports-for-unit-and-integration-tests-with-the-jacoco-maven-plugin/

Dans le fichier .gitlab-ci.yml, dans la section "artefacts", adaptez-le en fonction de la configuration du chemin dans votre pom.xml.

artifacts:
   paths:
     - target/coverage-reports/

0voto

bz5314520 Points 1

Ajouter un nouveau travail , exec script

awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print int(100*covered/instructions), "% covered" }' target/site/jacoco/jacoco.csv

OBTENIR CECI

74 % de couverture

0voto

vlcekmi3 Points 2405

Exemple complet de CI, basé sur les réponses précédentes, fonctionnant à la fois pour les tests unitaires et d'intégration.

test:
  stage: test
  image: maven:3.8-openjdk-17-slim
    - mvn $MAVEN_CLI_OPTS verify
      # jacoco code-coverage reporting
    - if [ -f target/site/jacoco/index.html ]; then awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print 100*covered/instructions, "% covered" }' target/site/jacoco/jacoco.csv; fi
    - if [ -f target/site/jacoco-it/index.html ]; then awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print 100*covered/instructions, "% covered" }' target/site/jacoco-it/jacoco.csv; fi
  coverage: '/([0-9.]*) % covered/'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X