web-dev-qa-db-ja.com

ハドソンのジョブ間でビルドアーティファクトを共有する

ハドソンでビルドプロセスを設定しようとしています。

ジョブ1は、頻繁にビルドされる超高速の(うまくいけば)継続的インテグレーションビルドジョブになります。

ジョブ2は、定期的に、または手動でトリガーされて、包括的なテストスイートを実行する責任があります。

ジョブ3は、コードベース全体で分析ツールを実行する責任があります(ジョブ2と同様)。

「高度なプロジェクトオプション>カスタムワークスペースを使用」機能を使用して、ジョブ1でコンパイルされたコードをジョブ2および3で使用できるようにしました。ただし、すべてのビルドアーティファクトがそのジョブ1ワークスペース内に残っているようです。私はこれを正しくやっていますか?これを行うためのより良い方法はありますか?ビルドパイプラインのセットアップに似たものを探していると思います...物事を共有し、適切なジョブを段階的に実行できるようにするためです。

(「バッチタスク」の使用も検討しました...しかし、それらはスケジュールできないようです?手動でのみトリガーされますか?)

どんな提案も歓迎します。ありがとう!

33
Jackson Ha

CopyArtifactプラグインを試してみることをお勧めします。

http://wiki.hudson-ci.org/display/HUDSON/Copy+Artifact+Plugin

あなたの継続的な仕事は必要なアーティファクトを構築することができ、あなたの他の2つの仕事は分析を行うためにそれらを引き込むことができます。

15
aku

Hudsonには、この問題のためのプラグインがあります: http://wiki.hudson-ci.org/display/HUDSON/Clone+Workspace+SCM+Plugin (リンクは現在壊れています)

対応するJenkinsページは次のとおりです: https://wiki.jenkins-ci.org/display/JENKINS/Clone+Workspace+SCM+Plugin

7
seanf

はい、そのwikiページは、非常にエレガントに聞こえるようにするという点であまり役に立ちませんでした。真実は、あるジョブから別のジョブにデータを渡す必要がある場合、ハドソンはまだジョブチェーンを非常にエレガントにサポートしていないということです。

また、あるジョブから別のジョブにワークスペースを転送するために、Zip-up-and-copy-workspaceメソッドを実行しています。クイックビルド、完全分析ビルド、そしてディストリビューションビルドがあります。その間に、Antを使用してタイムスタンプを生成し、「build-stamps」を使用して、どのジョブの番号が他のどのジョブの番号を作成したかをマークします。フィンガープリント機能はファイルの追跡に役立ちますが、ワークスペースのzipをアーカイブするつもりはないため、ユーザーは実際にワークスペースのzipを見ることができないため、フィンガープリントは役に立ちません。

2
aberrant80

ハドソンウィキを見たことがありますか?具体的には: 大きな仕事を小さな仕事に分割する

1
Michael Donohue

私は、ジョブ間の現在のコピーファイル/アーティファクト/ワークスペースがエレガントではないことに同意します。

また、巨大なtgz/Zipファイルをアーカイブする必要があるのは時間的に無駄なスペースであることがわかりました。私たちの場合、これらのファイルは巨大(1.5G)であり、パック/アーカイブ/フィンガープリント/アンパックに長い時間がかかりました。

だから私は同じもののわずかに最適化されたバリアントで解決しました:

  • ジョブ1/2/3はすべて同じソースリポジトリをチェックアウト/クローンしますが、
  • ジョブ1は、実際にビルドアーティファクトであるファイルのみをパックします
    • gitを使用すると、これが簡単かつ迅速になりますgit ls-files -oz、他のSCMについてはよくわかりません
  • コピーアーティファクトプラグインを使用してファイルを転送する
  • これにより、これらのファイルがこの場合の1/3サイズに削減されます->スピードアップし、無駄なスペースが少なくなります
0
inger

Hudsonには、ビルドアーティファクト用の組み込みリポジトリがないようです。私たちの解決策はそれを作成することでした。

私たちはWindosw環境にいるので、すべてのHudsonサーバーからアクセスできる共有を作成しました(システムアカウントはネットワーク経由でリソースにアクセスできないため、関連するサービスに共通のアカウントを提供します)。

ビルドスクリプト(ant)内には、他のジョブからローカルワークスペースにビルドされたリソースをコピーするタスクがあり、アーティファクトを生成するジョブはそれらを共通のリポジトリにコピーします。

他の環境では、FTPまたはファイルを移動するための他のメカニズムを介して公開およびフェッチできます。

公開タスクと取得タスクの単純な例:

<!-- ==================== Publish ==================================== -->
<target name="Publish" description="Publish files">
  <mkdir dir="${publish.dir}/lib" />
  <copy todir="${publish.dir}/lib" file="${project.jar}"/>
</target>

そして

<!-- ==================== Get ==================================== -->
<target name="getdependencies" description="Get necessary results from published directory">
  <copy todir="${support.dir}">
    <fileset dir="${publish.dir}/lib">
      <include name="*.jar"/>
    </fileset>
  </copy>
</target>
0
Jim Rush

私は同じ問題を抱えていました、そして私がやったのは長期的なタスクのための別々のプロジェクトです。これらのプロジェクトの最初のステップは、すべてのファイルをジョブ1のワークスペース(つまり、最後のビルド)からジョブ2/3などのワークスペースにコピーすることでした。これは通常、ジョブ2/3の開始時にジョブ1がビルドされていない限り機能しました。これは、ワークスペースが不完全になるためです。これを回避するには、ジョブ1でセンチネルファイルを使用して「ビルドの終了」を検出するか、Hudsonロックプラグインを使用します(私は試していません)。

%WORKSPACE%を基準にした他のジョブの配置について仮定する場合は、カスタムワークスペースを使用する必要はありませんhave

0
sehugg

私は今そのようなことをしています。同じ共有ワークスペースで多くのジョブを実行しようとしないことをお勧めします。私はそれで問題があっただけです。

私はMavenと自由形式のプロジェクトタイプを使用しています。バージョン管理システム内のファイルがそれをトリガーすると、1セットのジョブが実行されます。ローカルスナップショットアーティファクトを作成します。 2番目のジョブセットは毎晩実行され、統合テスト環境をセットアップしてから、テストを実行します。

Mavenを使用していない場合。 1つのオプションは、ディスク上に領域を設定し、ジョブ1の最終ステップでアーティファクトをその場所にコピーすることです。ジョブ2の最初のステップは、これらのファイルを移動することです。実行する必要があるものは何でも実行します。

ジョブ3に関しては、現在Hudson用のfindbugs/checkstyle/pmdとすべてのプラグインがあります。毎晩クリーンなチェックアウトを実行し、コードベースでそれらを実行するジョブ1のバージョンを作成することをお勧めします。

0
sal