En un servidor de compilación de CI, el repositorio de Maven local llena el sistema de archivos repetidamente (después de unos días). ¿Qué estrategia están haciendo otros para recortar el repositorio local en tal caso? -MaxEliminando el repositorio local de Maven en la máquina de compilación
Respuesta
¿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.
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>
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 * * *
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).
Depurar depósito local ahora admite inclusiones y otras propiedades: http://maven.apache.org/plugins/maven-dependency-plugin/purge-local-repository-mojo.html – dannrob
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.
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) –
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.
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). –
- 1. ¿Cómo configurar el repositorio local y remoto de maven en el archivo de compilación gradle?
- 2. eliminando el repositorio local de git de Xcode Project?
- 3. convertir el repositorio local de maven al repositorio remoto
- 4. Cómo cambiar el repositorio local de Maven en eclipse
- 5. Maven no utiliza el repositorio local
- 6. Instalar artefactos de Maven en un repositorio local programáticamente
- 7. ¿Puedo mover el repositorio local de maven al repositorio interno cuando configuro el repositorio interno por primera vez?
- 8. Uso de definiciones de compilación TFS en una máquina local
- 9. Git, eliminando el repositorio
- 10. Usar el repositorio de maven como caché de hiedra local
- 11. Cómo subir fuentes de repositorio local de Maven
- 12. ¿Cuándo es seguro eliminar el repositorio local de Maven?
- 13. ¿Cómo actualizar el repositorio local de maven con los artefactos más nuevos de un repositorio remoto?
- 14. ¿Cómo obtener la ubicación del repositorio local de Maven?
- 15. Cambiar la ubicación del repositorio local de gradle para la compilación en la nube de Jenkins
- 16. Implementación de la compilación de Maven
- 17. proyecto de eclipse que no importa los paquetes jar en el repositorio local de Maven
- 18. Usando tarea ant Maven para instalar frasco para repositorio local
- 19. Ubicación del repositorio local de Maven para Linux y Windows
- 20. ¿Cómo instalo manualmente un contenedor en mi repositorio Maven local?
- 21. Maven intenta descargar la dependencia a pesar de que existe en el repositorio local
- 22. ¿Cómo obtengo el nombre de la máquina local en C#?
- 23. SBT no encuentra el archivo en el repositorio local de maven aunque está allí
- 24. Depuración de compilación de Maven en Eclipse
- 25. Eclipse m2eclipse obteniendo dependencias del repositorio local
- 26. Maven no encuentra el artefacto local
- 27. Maven Para copiar el archivo jar de la carpeta local
- 28. Agregar una biblioteca JNI al Repositorio Maven local
- 29. Maven: instalar artefactos en un repositorio local en el área de trabajo
- 30. No se puede instalar un artefacto local de maven en el repositorio remoto, google-android-maps
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. –