【问题标题】:Wiping out Maven local repository on build machine在构建机器上清除 Maven 本地存储库
【发布时间】:2010-11-21 10:49:09
【问题描述】:

在 CI 构建服务器上,本地 Maven 存储库会反复填满文件系统(几天后)。 在这种情况下,其他人正在采取什么策略来修剪本地存储库? -最大

【问题讨论】:

    标签: maven-2 continuous-integration


    【解决方案1】:

    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>
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 hudson,您可以设置一个计划作业,每天只删除一次整个存储库或类似的操作。我有一份名为 hudson-maven-repo-clean 的工作,它具有以下配置:

      • 构建/执行外壳:rm -rf ~hudson/.m2/repository
      • 构建触发器/定期构建:0 0 * * *

      【讨论】:

        【解决方案3】:

        除了 purge-local-repository(在我看来,它就像一个核选项,因为它只提供 excludes 配置,而不是显式的 includes),看看 Remove Project Artifact mojo。我现在正在寻找实现它,因为我的确切用例是清除在我的 CI(有时是工作站)机器上构建的大型 WAR 和 EAR 快照。

        【讨论】:

        【解决方案4】:

        我们为此特别使用了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。

        【讨论】:

        • 我们也在这样做,并且遇到了在下游作业运行时工件“消失”的问题。 (A 在 B 的上游:B 开始,看到 A 的工件,很高兴。然后上游开始,将其清除;同时,作为大型构建,B 仍在运行并且悲惨地失败,因为突然间 A 的工件消失了。VM 中的 FileNotFoundException 方)
        【解决方案5】:

        我们采用了一种稍有不同(和不正当)的技术。所有构建“大型事物”(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 存储库放置在作业的工作区中。这允许我们在作业之前或之后删除整个存储库。它还使工件在工作区中可见,有助于调试一些问题。

        【讨论】:

        【解决方案6】:

        文件系统有多大?我们有 10gb 分配给每晚超过 30 天的构建和 zap 快照。这似乎有效

        您是每 X 小时进行一次构建还是在代码更改时进行构建?切换到代码更改将减少工件的数量,而不会降低覆盖率。

        您是否在本地安装所有快照?您不需要在所有情况下都这样做。在大多数情况下,只需要在本地安装那些积极开发的依赖项的快照。

        您是否在本地安装 EAR/WAR 文件?你可能也不需要它们。

        您保留了多少个工作区?我们使用 hudson 并且只保留最后 5 个构建。

        【讨论】:

        • 让我澄清一下,我实际上只是在寻找一种消除旧快照的机制,而不是真正的大战略。知道我可以编写一个脚本来做到这一点,我希望有一些已经可用的东西。
        猜你喜欢
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2012-11-29
        • 1970-01-01
        • 2014-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多