在构build机器上清除Maven本地存储库

在CI构build服务器上,本地Maven存储库重复填充文件系统(几天之后)。 在这种情况下,其他人做什么策略来修剪本地存储库? – 最大

Maven依赖项插件具有一个purge-local-repository目标,允许您从本地存储库中删除给定项目的依赖关系,如果每一个项目每天运行一次,快照将不会累积。


或者,你可以采取更加焦土的方法。 由于问题通常是时间戳快照构件,因此可以使用maven-antrun-plugin删除与资源集合模式匹配的所有文件。

例如(注意这可能需要一些调整,因为我已经从内存中完成):

<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> 

如果你使用哈德森,你可以设置一个计划的工作,只是每天删除整个资源库或类似的东西。 我有一个叫做hudson-maven-repo-clean ,它有这样的configuration:

  • 编译/执行shell: rm -rf ~hudson/.m2/repository
  • 构build触发器/定期生成: 0 0 * * *

除了purge-local-repository(读取给我一个核选项,因为它只提供一个excludesconfiguration而不是一个明确的includes ),请看一下Remove Project Artifact mojo 。 我现在想要实现它,因为我的确切用例是清除我的CI(有时是工作站)机器上构build的大型WAR和EAR快照。

我们特别为此目的使用build-helper插件 。 在我们公司的家长pom中,我们的哈德森版本中embedded了configuration文件中的remove-project-artifact目标。 这样,在安装当前构build版本之前,将删除此构件的所有旧版本。

 ... <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> ... 

使用removeAll设置为true将消除所有其他快照,除了你的工作。 这可能是危险的,因为它可能意味着分支的快照也将被清除。

例如,如果你有一个代表HEAD的快照1.0.0.18-SNAPSHOT和表示分支的快照1.0.1.17-SNAPSHOT,用1.0.0.18-SNAPSHOT编译运行这个插件将擦除1.0.1.17-SNAPSHOt文件夹。

为了解决这个问题,removeAll应该被设置为false。

我们采用了一种稍微不同的(和狡猾的)技巧。 所有构build“大型事物”(EAR,WAR,TAR)的工件都将其部署位置重写为如下所示:

 <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> 

这个策略导致部署目标把东西放到目标目录中,这当然会被下一个CLEAN操作所破坏。 为了更具侵略性,我们有一个后build设步骤:

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

我们还有一个策略。 在Hudson / Jenkins中,我们提供了一个设置文件,将.m2存储库放置在作业的工作区中。 这使我们可以在作业之前或之后删除整个存储库。 它还使工件在工作空间中可见,有助于debugging某些问题。

文件系统有多大? 我们已经分配了10GB来构build和每天晚上30天以上的快照。 这似乎工作

您是否每X小时或代码更改时进行构build? 切换到代码更改将减less工件数量而不减less覆盖率。

你是否在本地安装所有的快照? 所有情况下都不需要这样做。 在大多数情况下,只有那些活跃开发的依赖关系需要在本地安装。

你在本地安装EAR / WAR文件吗? 你可能不需要他们。

你有多less工作空间? 我们使用哈德森,只保留最后5个版本。