web-dev-qa-db-ja.com

ビルドマシン上のMavenローカルリポジトリを一掃する

CIビルドサーバーでは、ローカルのMavenリポジトリーがファイルシステムを繰り返し(数日後に)満たします。そのような場合、ローカルリポジトリをトリミングするために他の人はどのような戦略をとっていますか? -マックス

42
Max Spring

Maven依存関係プラグインには purge-local-repository ゴールがあり、ローカルリポジトリから特定のプロジェクトの依存関係を削除できます。これが実行されると、各プロジェクトで1日に1回、スナップショットは実行されませんたまる。


代わりに、あなたが取ることができるより焦げた地球のアプローチがあります。問題は通常、タイムスタンプ付きのスナップショットアーティファクトであるため、 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>
27
Rich Seller

Hudsonを使用している場合は、スケジュールされたジョブをセットアップして、リポジトリ全体を1日1回だけ削除するか、またはそのようなものを実行できます。次の構成を持つhudson-maven-repo-cleanというジョブがあります。

  • ビルド/シェルの実行:rm -rf ~hudson/.m2/repository
  • ビルドトリガー/定期的にビルド:0 0 * * *
19

局所ローカルリポジトリのパージに加えて(明示的なexcludesではなくincludes構成のみを提供するため、核のオプションのように読みます)、以下を見てください- プロジェクトアーティファクトモジョの削除 。私の正確なユースケースは、CI(場合によってはワークステーション)マシンで構築されている大規模なWARおよびEARスナップショットを消去することなので、今、実装することを検討しています。

4
Justin Searls

特にこの目的のために build-helper plugin を使用します。当社の親pomは、私たちのハドソンビルドのプロファイルに埋め込まれた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>
  ...

Trueに設定されたremoveAllを使用すると、作業中のスナップショット以外のすべてのスナップショットが消去されます。ブランチのスナップショットも消去される可能性があるため、これは危険な場合があります。

たとえば、HEADを表すスナップショット1.0.0.18-SNAPSHOTとブランチを表すスナップショット1.0.1.17-SNAPSHOTがある場合、このプラグインを1.0.0.18-SNAPSHOTビルドで実行すると、1.0.1.17がワイプされます。 -SNAPSHOtフォルダー。

このシナリオを回避するには、removeAllをfalseに設定する必要があります。

3
cemonds

少し異なる(そして不正な)手法を採用しました。 「大きなもの」(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 $?

さらにもう1つの戦略も採用しています。 Hudson/Jenkinsでは、ジョブのワークスペースに.m2リポジトリを配置するための設定ファイルを提供しています。これにより、ジョブの前または後にリポジトリ全体を削除できます。また、一部の問題のデバッグに役立つアーティファクトがワークスペースに表示されます。

1

ファイルシステムの大きさは?毎晩30日以上経過したビルドとザップスナップショットに10 GBが割り当てられています。それはうまくいくようです

X時間ごとにビルドを行っていますか、それともコードが変更されたときですか?コードの変更に切り替えると、カバレッジを減らすことなくアーティファクトの数を減らすことができます。

すべてのスナップショットをローカルにインストールしていますか?すべてのケースでこれを行う必要はありません。ほとんどの場合、積極的に開発された依存関係のスナップショットだけをローカルにインストールする必要があります。

EAR/WARファイルをローカルにインストールしていますか?あなたもおそらくそれらを必要としません。

いくつのワークスペースを保持していますか?ハドソンを使用し、最新の5つのビルドのみを保持します。

0
sal