【发布时间】:2010-11-21 10:49:09
【问题描述】:
在 CI 构建服务器上,本地 Maven 存储库会反复填满文件系统(几天后)。 在这种情况下,其他人正在采取什么策略来修剪本地存储库? -最大
【问题讨论】:
标签: maven-2 continuous-integration
在 CI 构建服务器上,本地 Maven 存储库会反复填满文件系统(几天后)。 在这种情况下,其他人正在采取什么策略来修剪本地存储库? -最大
【问题讨论】:
标签: maven-2 continuous-integration
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,您可以设置一个计划作业,每天只删除一次整个存储库或类似的操作。我有一份名为 hudson-maven-repo-clean 的工作,它具有以下配置:
rm -rf ~hudson/.m2/repository
0 0 * * *
【讨论】:
除了 purge-local-repository(在我看来,它就像一个核选项,因为它只提供 excludes 配置,而不是显式的 includes),看看 Remove Project Artifact mojo。我现在正在寻找实现它,因为我的确切用例是清除在我的 CI(有时是工作站)机器上构建的大型 WAR 和 EAR 快照。
【讨论】:
我们为此特别使用了build-helper plugin。在我们公司的父 pom 中,我们的 hudson 构建的配置文件中嵌入了 remove-project-artifact 目标。这样,在安装当前构建版本之前,此工件的所有旧版本都会被删除。
...
<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。
【讨论】:
我们采用了一种稍有不同(和不正当)的技术。所有构建“大型事物”(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 操作破坏。为了更加激进,我们有一个后期构建步骤:
find -type d -name '*_DELETEME' -exec rm -rf '{}' ';' -prune || echo $?
我们还采用了另一种策略。在 Hudson/Jenkins 中,我们提供了一个设置文件来将 .m2 存储库放置在作业的工作区中。这允许我们在作业之前或之后删除整个存储库。它还使工件在工作区中可见,有助于调试一些问题。
【讨论】:
-delete标志;有一些examples on wikipedia。
文件系统有多大?我们有 10gb 分配给每晚超过 30 天的构建和 zap 快照。这似乎有效
您是每 X 小时进行一次构建还是在代码更改时进行构建?切换到代码更改将减少工件的数量,而不会降低覆盖率。
您是否在本地安装所有快照?您不需要在所有情况下都这样做。在大多数情况下,只需要在本地安装那些积极开发的依赖项的快照。
您是否在本地安装 EAR/WAR 文件?你可能也不需要它们。
您保留了多少个工作区?我们使用 hudson 并且只保留最后 5 个构建。
【讨论】: