2009-07-26 18 views
5

Al ejecutar una compilación de Maven en el servidor de CI, genero el sitio para publicar la documentación y los informes, y también despliegue el artefacto en el repositorio de instantáneas para que otros proyectos lo utilicen. Para ello corro los siguientes objetivos:Objetivo de despliegue/sitio combinado para Maven

mvn clean site deploy 

Esto significa que las pruebas unitarias se ejecutan dos veces , una vez por el ciclo de vida del sitio y una vez para el ciclo de vida del despliegue. Si configuro el objetivo del sitio para vincularlo con el ciclo de vida estándar, las pruebas se siguen ejecutando dos veces, ejecutar el objetivo del sitio siempre provoca que se ejecuten las pruebas debido a la anotación @requiresDependencyResolution test. Esto está bien si solo está creando el sitio, pero en el contexto de una implementación aumenta enormemente el tiempo de compilación sin ningún beneficio.

Tengo una solución que incluye la copia de la SiteMojo (y los padres es necesario) para un nuevo plugin y la eliminación de la @requiresDependencyResolution prueba anotación de la copia.

Este mojo modificado generará los informes sin forzar el funcionamiento de las pruebas nuevamente, pero preferiría una solución que no implique ninguna piratería del complemento del sitio. ¿Hay alguna manera de suprimir la anotación requiresDependencyResolution?

Respuesta

1

Mi enfoque actual es crear un nuevo complemento con copias de los tipos relevantes del maven-site-plugin. Estos tipos son idénticos a las versiones estándar excepto para cambiar el nombre del tipo, el nombre del objetivo y la eliminación de la anotación @requiresDependencyResolution test.

Los tipos copiados son: Es necesario

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

Los mojos padres por lo Maven puede procesar las anotaciones basadas en Javadoc (esto no debería ser necesario para Maven 2.2.0+).

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

Estos dos se copian como SiteOnlyMojo y SiteJarOnlyMojo respectivamente, SiteJarOnlyMojo se cambia a heredar de SiteOnlyMojo. De lo contrario, los únicos cambios son cambiar los nombres de los objetivos y eliminar la anotación.

Así SiteOnlyMojo tiene:

* @goal site 
* @requiresDependencyResolution test 

cambiado a:

* @goal site-only 

y SiteJarOnlyMojo tiene:

* @goal jar 
* @phase package 

cambiado a:

* @goal jar-only 
* @phase package 

Estos tipos se declaran en un proyecto maven-plugin con artifactId maven-site-only-plugin con una dependencia declarada en el plugin adecuado del sitio.

Para usar esto defino un perfil (no quiero que los informes se ejecuten en cada ejecución, solo cuando -Psite se declara en la línea de comandos) y lo enlace a prepare-package fase (anterior a 2.1 .0, tendría que vincularlo a la fase del paquete en su lugar).

<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

Me sorprende que esto funciona - la etiqueta @requiresDependencyResolution test en realidad no desencadenan las pruebas están construyendo - que debería ser uno de los informes que se ha incluido. Normalmente, recomiendo ejecutar el sitio y la construcción en ejecuciones separadas de Maven en CI para que pueda obtener comentarios rápidos sobre su compilación y publicar el último sitio solo cuando eso tenga éxito.

Otra alternativa es ejecutarlo como mvn clean deploy site, y elegir el mojo de report-onlysurefire-report-maven-plugin (esto es por lo general el informe que se está ejecutando de nuevo las pruebas). Esto usará los resultados de la prueba anterior. Por supuesto, otra alternativa es deshabilitar ese informe por completo, ya que es probable que obtenga los resultados de otra fuente, como su servidor de CI de todos modos.

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> 

Esto ejecutará automáticamente la acción sitio cuando se emite un comando 'mvn despliegan', así como garantizar la suite de prueba sólo se ejecuta una vez.

Cuestiones relacionadas