CIビルドサーバでは、ローカルのMavenリポジトリが(数日後に)ファイルシステムを繰り返し埋め尽くします。 このような場合に、他の人がローカルリポジトリをトリミングするためにどのような戦略をとっていますか? -Maxビルドマシン上のMavenローカルリポジトリを消去する
答えて
ファイルシステムのサイズはどれくらいですか?毎晩30日以上経過したスナップショットをビルドしスナップするために10GBが割り当てられています。それはうまくいくようです
あなたはX時間ごとに、またはコードが変更されたときにビルドを行っていますか?コードの変更に切り替えると、カバレッジを減らさずにアーティファクトの数を減らすことができます。
すべてのスナップショットをローカルにインストールしていますか?すべての場合にこれを行う必要はありません。ほとんどの場合、積極的に開発されたスナップショットはローカルにインストールする必要があります。
EAR/WARファイルをローカルにインストールしていますか?あなたはおそらくそれらを必要としません。
保存しているワークスペースの数はいくつですか?私たちはhudsonを使用し、最後の5つのビルドだけを保持します。
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>
あなたはハドソンを使用している場合は、あなただけのリポジトリ全体を削除するには、スケジュールされたジョブを設定することができます1日1回またはそのようなもの。トリガ/を定期的にビルドをビルドしrm -rf ~hudson/.m2/repository
- ビルド/シェルを実行します。私は仕事では、この構成を有している
hudson-maven-repo-clean
と呼ばれるんだ0 0 * * *
また、ローカルリポジトリをパージします(核オプションのように私に読んでください。includes
とは対照的にexcludes
の設定しかありません)、Remove Project Artifact mojoを見てください。自分のCI(時にはワークステーション)マシン上に構築されている大きなWARとEARのスナップショットをクリアすることが私の正確なユースケースです。
ローカルリポジトリを削除すると、以下のプロパティとその他のプロパティがサポートされるようになりました。http://maven.apache.org/plugins/maven-dependency-plugin/purge-local-repository-mojo.html – dannrob
私たちは特にこの目的のためにbuild-helper pluginを使用します。私たちの会社では、親pomは、私たちのhudsonビルド用のプロファイルに埋め込まれたプロジェクトのアーティファクト除去ゴールです。この方法で、このアーティファクトのすべての古いバージョンは、現在のビルドバージョンをインストールする前に削除されます。
...
<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の上流にあると、Bが始まり、Aのアーティファクトが見えて、幸せです。それから上流が始まり、それを拭き取ります; Bは大きなビルドですが、突然AのアーティファクトがVMのFileNotFoundExceptionパーティー) –
私たちはわずかに異なる(そして独創的な)手法を採用しました。 「大規模なもの」(耳、戦争、タール)を構築し、すべての成果物は、その展開場所はそうのようにオーバーライドしている:
は<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'](http://linux.die.net/man/1/find)フラグも参照してください。いくつかの[wikipediaの例](http://en.wikipedia.org/wiki/Find#Delete_files_and_directories)があります。 –
私は実際には、古いスナップショットを消去するためのメカニズムを探していて、実際には壮大な戦略ではないことを明確にします。 私はそれを行うためのスクリプトを書くことができたことを知って、私はすでに利用可能なものを期待していた。 –