11

Ant で Ivy を使用し、Jenkins でビルドを行います。私は当初<ivy:cleancache/>、ビルドを実行する前に Jenkins に a を実行させるのが良い考えだと考えていました。(これは、必須の「クリーン」ターゲットの一部になります)。

<ivy:cleancache>ただし、単に からクリーンアップするだけでなく、ディレクトリ<ivy:cachepath>全体を実際に削除することがわかりました。$HOME/.ivy/cache

私の懸念は、Jenkins が<ivy:cleancache>開始前にすべてのビルドで a を実行すると、Jenkins が実行できる他のビルドに干渉することです。

<ivy:cleancache>特に、1 人のユーザーが同時に複数のビルドを実行している可能性がある場合は、良い考えですか?

<ivy:cachepath pathid="compile.path"/>実際、複数のプロジェクトでを実行するとどうなりますか? これはジェンキンスのようなものにも影響しますか? 複数のビルドがcompile.cachepath同時にビルドされている場合、Jenkins は混乱しますか?

4

3 に答える 3

7

私の意見では、すべてのビルドで ivy cleancache タスクを実行するのはやり過ぎであり、サードパーティの依存関係のインテリジェントなダウンロードである ivy を使用する主な利点の 1 つが失われます。

次の関連する Maven の質問に記載されているように、すべてのキャッシュがダーティになる可能性があるため、定期的にパージする必要があります。

ローカルの Maven リポジトリを安全に削除できるのはいつですか?

いくつかの推奨事項:

専用の Jenkins ジョブを使用して Ivy キャッシュを消去する

私の最初の推奨事項は、ビルドで次の clean-all ターゲットを呼び出す定期的な Jenkins ジョブを作成することです。

<target name="clean-all" depends="clean">
   <ivy:cleancache/>
</target>

これにより、Jenkins がキャッシュをパージするタイミングを決定し、通常のビルド時間外 (たとえば、毎月 1 日の午前 2 時) に実行するようにスケジュールできます。

複数のキャッシュを使用して各プロジェクトを分離する

私の 2 番目の推奨事項は、プロジェクト ビルド間の分離を強化することです。cachesディレクティブを使用して、各プロジェクトが独自のプライベート キャッシュを持つように構成します。あなたのアイビー設定ファイルで。

于 2012-08-22T19:23:49.060 に答える
3

これが私がやることに決めたものです:

ivysettings.xml次のようにファイルを変更しました。

<ivysettings>
    <properties environment="env." override="false"/>
    <caches
        defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}"
        resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/>
    <settings defaultResolver="default"/>
    <include file="${ivy.dir}/ivysettings-public.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>

これは2つのことを行います:

  • IvyローカルキャッシュをJenkinsエグゼキュータ$HOME/.ivy/cache-$EXECUTOR_NUMBERがどこにあるかとして定義します。$EXECUTOR_NUMBERこれは、各エグゼキュータが独自のIvyキャッシュを取得することを意味します。したがって、Jenkinsが一度に複数のジョブを実行している場合、各ジョブは異なるエグゼキュータで取得されるため、独自のキャッシュがあります。ジョブがキャッシュをクリーンアップしたい場合は、すぐに実行できます。
  • 解決キャッシュをに定義しました${basedir}/target/ivy.cache。これにより、各ジョブに非常に小さい独自のリゾルバーキャッシュが提供されます。ただし、Jenkinsが同じIvyプロジェクトの複数のリビジョンを構築している場合、この方法でivyの解決が他のジョブに干渉することはありません。

唯一の欠点は、ユーザーのデフォルトのキャッシュディレクトリが呼び出される$HOME/.ivy/cache-$env.EXECUTOR_NUMBERことです。これはきれいなサイトではありません。もっとリーズナブルにしたいと思いますが、$HOME/.ivy/cache-0わかりません。ただし、現時点では実際には何の影響もありません。

現在、開発者は、ダウンロードしたすべてのjarを含む単一のIvyキャッシュを持っています。このようにして、jarをプロジェクト間で共有できるため、開発者の作業がスピードアップします。

一方、Jenkinsは、設定されている回数だけIvyキャッシュをクリーンアップできます。これは、ジョブごとに、または1日1回、または1か月に1回実行できます。ただし、キャッシュはエグゼキュータごとに実行されるため、別のジョブ(別のエグゼキュータで実行される)がそのキャッシュに依存しているときにキャッシュがクリーンアップされるという問題は発生しません。

これにより、特定の問題がすべて解決されるはずです。私がやりたいのは、デフォルトのEXECUTOR_NUMBER変数がまだ設定されていない場合に設定する方法を理解することだけです。私はこのようなさまざまなことを試しました:

<ivysettings>
    <property name="env.EXECUTOR_NUMBER" value="0" override="false"/>
    <properties environment="env." override="false"/>
    <caches
        defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}"
        resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/>
    <settings defaultResolver="default"/>
    <include file="${ivy.dir}/ivysettings-public.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
    <include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
</ivysettings>

しかし、役に立たない。とファイルoverrideの両方のパラメーターをすべて異なる方法で変更することは事実ですが、それは私が望むことを完全には実行しません。<property><properties>

于 2012-08-22T21:23:54.487 に答える
2

あなたが抱えている最後の問題を解決するために、私がずっとやってきたことです。

これを Jenkins Ant Build Steps のプロパティに追加できます

another.less.obtrusive.name=${EXECUTOR_NUMBER}

ivysettings.xml に追加します。

したがって、このプロパティを ANT に注入するため、Jenkins を除くすべてのユーザーに対して「0」になります。

主な質問について: Jenkins では、私は常に新しいことを始めます。CI ビルドは堅牢で完全なものでなければなりません。速さは歓迎すべき副産物ですが、モチベーションにはなりません。

于 2012-08-23T06:34:06.290 に答える