2009-07-26 5 views
5

Lors de l'exécution d'une génération Maven sur le serveur CI, je génère le site pour publier la documentation et les rapports, et déploie également l'artefact dans le référentiel de clichés instantanés pour être utilisé par d'autres projets. Pour ce faire, je lance les objectifs suivants:Site combiné/objectif de déploiement pour Maven

mvn clean site deploy 

Cela signifie que les tests unitaires sont exécutés deux fois, une fois pour le cycle de vie du site et une fois pour le cycle de vie de déploiement. Si je configure l'objectif du site pour être lié au cycle de vie standard, les tests sont toujours exécutés deux fois, l'exécution de l'objectif du site entraîne toujours l'exécution des tests en raison de l'annotation @requiresDependencyResolution test. C'est très bien si vous ne faites que créer le site, mais dans le contexte d'un déploiement, cela augmente considérablement le temps de construction sans aucun bénéfice.

J'ai une solution de contournement qui implique de copier le SiteMojo (et les parents requis) dans un nouveau plugin et de supprimer l'annotation @requiresDependencyResolution de la copie.

Ce mojo modifié générera les rapports sans forcer l'exécution des tests, mais je préférerais une solution qui n'implique aucun piratage du plugin du site. Existe-t-il un moyen de supprimer l'annotation requiresDependencyResolution?

Répondre

1

Mon approche actuelle consiste à créer un nouveau plugin avec des copies des types pertinents à partir du plugin maven-site-plugin. Ces types sont identiques aux versions standard à l'exception de la modification du nom du type, du nom de l'objectif et de la suppression de l'annotation @requiresDependencyResolution.

Les types copiés sont:

org.apache.maven.plugins.site.AbstractSiteMojo 
org.apache.maven.plugins.site.AbstractSiteRenderingMojo 

Les Mojos parents sont nécessaires pour Maven peut traiter les annotations en fonction javadoc (cela ne devrait pas être nécessaire pour Maven 2.2.0+).

org.apache.maven.plugins.site.SiteMojo 
org.apache.maven.plugins.site.SiteJarMojo 

Ces deux sont copiés comme SiteOnlyMojo et SiteJarOnlyMojo respectivement SiteJarOnlyMojo est modifié pour hériter de SiteOnlyMojo. Sinon, les seuls changements sont de changer le nom de l'objectif et supprimer l'annotation.

Alors SiteOnlyMojo a:

* @goal site 
* @requiresDependencyResolution test 

changé:

* @goal site-only 

et SiteJarOnlyMojo a:

* @goal jar 
* @phase package 

changé à:

* @goal jar-only 
* @phase package 

Ces types sont déclarés dans un projet maven-plugin avec artefactId maven-site-only-plugin avec une dépendance déclarée sur le plugin de site approprié. Pour l'utiliser, je définis un profil (je ne veux pas que les rapports soient exécutés à chaque exécution, seulement quand -Psite est déclaré sur la ligne de commande) et le lie à la phase prepare-package (avant la 2.1 .0, vous devrez le lier à la phase package à la place).

<profile> 
    <id>site</id> 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-site-only-plugin</artifactId> 
     <version>1.0.0</version> 
     <executions> 
      <execution> 
      <phase>prepare-package</phase> 
      <goals> 
       <goal>jar-only</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</profile> 
3

Je suis surpris que cela fonctionne - la balise @requiresDependencyResolution test ne déclenche pas en fait les essais en cours de construction - qui devrait être l'un des rapports que vous avez inclus. Normalement, je recommande d'exécuter le site et la construction dans des exécutions Maven séparées dans CI afin que vous puissiez obtenir des commentaires rapides sur votre build et publier le dernier site seulement quand cela réussit.

Une autre alternative consiste à l'exécuter en tant que mvn clean deploy site et de choisir le mojo report-only pour surefire-report-maven-plugin (il s'agit généralement du rapport qui exécute à nouveau les tests). Cela utilisera les résultats des tests précédents. Bien sûr, une autre alternative est de désactiver complètement ce rapport, puisque vous obtenez probablement ces résultats d'une autre source, comme votre serveur CI.

0
<build> 
    <pluginManagement> 
     <plugins> 
      ... 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-site-plugin</artifactId> 
       <version>3.2</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>site</goal> 
          <goal>deploy</goal> 
         </goals> 
         <phase>deploy</phase> 
        </execution> 
       </executions> 
      </plugin> 
      ... 
     </plugins> 
    </pluginManagement> 
</build> 

Cela exécutera automatiquement l'action du site lors de l'émission d'un « mvn déployer » commande, ainsi que d'assurer la suite de tests est exécutée une seule fois.

Questions connexes