2009-08-20 3 views

Respuesta

0

¿Qué tan grande es el sistema de archivos? Tenemos 10gb asignados para compilar y eliminar instantáneas de más de 30 días cada noche. Eso parece funcionar

¿Estás haciendo compilaciones cada X horas o cuando cambia el código? Cambiar a cambios de código reducirá la cantidad de artefactos sin reducir la cobertura.

¿Está instalando todas las instantáneas localmente? No necesita hacer esto en todos los casos. En la mayoría de los casos, solo las instantáneas que son dependencias activamente desarrolladas deben instalarse localmente.

¿Está instalando localmente archivos EAR/WAR? Probablemente tampoco los necesites.

¿Cuántas áreas de trabajo se están quedando? Usamos Hudson y conservamos solo las últimas 5 compilaciones.

+0

Déjenme aclarar que en realidad solo estoy buscando un mecanismo para eliminar instantáneas viejas, y no realmente para una gran estrategia. Sabiendo que podía escribir un guión para hacer eso, esperaba algo que ya estaba disponible. –

27

El complemento de dependencia Maven tiene un objetivo purge-local-repository que le permite eliminar las dependencias para un proyecto determinado del repositorio local, si se ejecuta, decir una vez al día en cada proyecto las instantáneas no se acumularán.


Alternativamente, hay un enfoque de tierra más quemada que podría tomar. Como el problema suelen ser los artefactos de instantáneas con marca de tiempo, puede usar maven-antrun-plugin para eliminar todos los archivos que coinciden con el patrón de recopilación de recursos.

Por ejemplo (tenga en cuenta que esto podría necesitar algunos ajustes como lo he hecho de la memoria):

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <configuration> 
     <tasks> 
      <delete> 
      <fileset dir="${settings.localRepository}"> 
       <include name="**/*.jar"/> 
       <exclude name="**/*.pom"/> 
       <exclude name="**/*.war"/> 
       <exclude name="**/*.ear"/> 
       <exclude name="**/*.md5"/> 
       <exclude name="**/*.sha"/> 
       <!--any other extensions?...--> 
       <!--match the timestamp pattern--> 
       <containsregexp expression="[0-9]{8}.[0-9]{6}-[0-9]+"/> 
      </fileset> 
      </delete> 
     </tasks> 
     </configuration> 
     <goals> 
     <goal>run</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 
18

Si está utilizando Hudson, se puede configurar una tarea programada para simplemente eliminar todo el repositorio una vez al día o algo así. Tengo un trabajo llamado hudson-maven-repo-clean que tiene esta configuración:

  • Build/Ejecutar shell: rm -rf ~hudson/.m2/repository
  • Build Triggers/Construir periódicamente: 0 0 * * *
4

Además de purgar-local-repositorio (que me parece una opción nuclear, ya que solo ofrece una configuración excludes en oposición a un includes explícito), eche un vistazo al Remove Project Artifact mojo. Estoy buscando implementarlo ahora, ya que mi caso de uso exacto es eliminar grandes instantáneas de WAR y EAR que se están construyendo en las máquinas de mi CI (ya veces en la estación de trabajo).

+1

Depurar depósito local ahora admite inclusiones y otras propiedades: http://maven.apache.org/plugins/maven-dependency-plugin/purge-local-repository-mojo.html – dannrob

3

Utilizamos especialmente para este propósito el build-helper plugin. En nuestra empresa parent pom es el objetivo remove-project-artifact incorporado en el perfil de nuestras compilaciones hudson. De esta forma, todas las versiones anteriores de este artefacto se eliminan antes de instalar la versión de compilación actual.

... 
<profile> 
    <id>hudson</id> 
    <activation> 
    <property> 
     <name>BUILD_TAG</name> 
    </property> 
    </activation> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>remove-old-artifacts</id> 
      <phase>package</phase> 
      <goals> 
       <goal>remove-project-artifact</goal> 
      </goals> 
      <configuration> 
       <removeAll>true</removeAll> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    ... 

El uso de removeAll set to true borrará todas las demás instantáneas, excepto aquella en la que esté trabajando. Esto puede ser peligroso ya que puede significar que las instantáneas de una rama también desaparecerán.

Por ejemplo, si tiene una instantánea 1.0.0.18-SNAPSHOT que representa HEAD y una instantánea 1.0.1.17-SNAPSHOT que representa una sucursal, ejecutar este complemento con la compilación 1.0.0.18-SNAPSHOT borrará la carpeta 1.0.1.17-SNAPSHOt.

Para evitar este escenario, removeAll debe establecerse en falso.

+0

Estamos haciendo esto también, y estamos ejecutando en el tema de los artefactos que "desaparecen" mientras se ejecutan trabajos posteriores. (Con A está arriba de B: B inicia, ve los artefactos de A, está contento. Luego comienza, borra, B, mientras tanto, siendo una construcción grande, sigue ejecutándose y fracasa estrepitosamente porque de repente los artefactos de A son ido. Parte de FileNotFoundException en la VM) –

1

Hemos empleado una técnica ligeramente diferente (y tortuosa). Todos los artefactos que construyen "grandes cosas" (orejas, las guerras, alquitranes) tengan su lugar de despliegue anulado este modo:

<properties> 
    <discard-me-in-bit-bucket>file://${basedir}/target/_DELETEME</discard-me-in-bit-bucket> 
</properties> 

<distributionManagement> 
    <repository> 
    <id>upload-InternalSite</id> 
    <name>SoftwareLibrary External</name> 
    <url>${discard-me-in-bit-bucket}</url> 
    <layout>legacy</layout> 
    <uniqueVersion>false</uniqueVersion> 
    </repository> 
    <snapshotRepository> 
    <id>upload-InternalSite</id> 
    <name>Repository Name</name> 
    <url>${discard-me-in-bit-bucket}</url> 
    <layout>legacy</layout> 
    <uniqueVersion>false</uniqueVersion> 
    </snapshotRepository> 
</distributionManagement> 

Esta estrategia hace que el objetivo de despliegue para poner las cosas en el directorio de destino, que por supuesto es destruido por la próxima operación de LIMPIEZA. Para obtener aún más agresiva, tenemos un paso postbuild que hace esto:

find -type d -name '*_DELETEME' -exec rm -rf '{}' ';' -prune || echo $? 

Todavía una estrategia más empleamos, también. En Hudson/Jenkins proporcionamos un archivo de configuración para colocar el repositorio .m2 en el espacio de trabajo para el trabajo. Esto nos permite eliminar el repositorio completo antes o después del trabajo. También hace que los artefactos sean visibles en el espacio de trabajo lo que ayuda a eliminar algunos problemas.

+0

Vea también el indicador ['-delete'] (http://linux.die.net/man/1/find); hay algunos [ejemplos en wikipedia] (http://en.wikipedia.org/wiki/Find#Delete_files_and_directories). –

Cuestiones relacionadas