統合テストサーバーをセットアップする最良の方法は何ですか?
-
09-06-2019 - |
質問
統合サーバーをセットアップする際、複数のタスクを使用してビルドを完了するための最良のアプローチについて迷っています。すべてを 1 つの大きなジョブに設定するのが最善の方法でしょうか、それとも小さな依存ジョブを作成するのですか?
解決
タスクを分割する必要があるのは間違いありません。これは、ステップごとに異なるターゲット (タスク) を持つ CruiseControl.NET 構成の優れた例です。また、ほとんどカスタマイズせずにプロジェクト間で共有できる common.build ファイルも使用されます。
http://code.google.com/p/dot-net-reference-app/source/browse/#svn/trunk
他のヒント
私はTeamCityをnantビルドスクリプトで使用しています。TeamCity を使用すると、CI サーバー部分のセットアップが簡単になり、nant ビルド スクリプトを使用すると、レポート生成に関する限り、多くのタスクを簡単に実行できます。
これは、CruiseControl.NET での CI の使用について私が書いた記事です。コメントには、プロジェクト間で再利用できる nant ビルド スクリプトが含まれています。
私が好むアプローチは次のセットアップです (実際には .NET プロジェクトにいると仮定しています)。
- クルーズコントロール.NET。
- 個々のステップごとの NANT タスク。代替 CC テンプレート用の Nant.Contrib。
- 単体テストを実行するための NUnit。
- NCover はコード カバレッジを実行します。
- 静的分析レポート用の FXCop。
- ソース管理のための Subversion。
- すべての開発ボックス上の CCTray または同様のものを使用して、ビルドや失敗などの通知を取得します。
多くのプロジェクトでは、誰かがチェックインを行うときにさまざまなレベルのテストやアクティビティが行われることがわかります。場合によっては、これらが時間の経過とともに増加し、ビルド後、開発者がチェックインでビルドを中断したかどうかを確認できるまでに長い時間がかかる場合があります。
このような場合に私が行うことは、3 つのビルド (場合によっては 2 つ) を作成することです。
- CI ビルドはチェックインによってトリガーされ、クリーンな SVN Get、Build を実行し、軽量テストを実行します。理想的には、これを数分以内に抑えることができます。
- より包括的なビルドは、CI と同じことを実行しますが、より包括的で時間のかかるテストを実行します (変更の場合は 1 時間ごと)。
- すべてを実行し、コード カバレッジとアセンブリの静的分析も実行し、毎日の MSI パッケージなどをビルドするための展開手順を実行する夜間ビルド。
CI システムで重要なことは、それが有機的であり、常に調整される必要があるということです。CruiseControl.NET にはいくつかの優れた拡張機能があり、ステップのビルド タイミングなどをログおよびグラフに記録し、履歴分析を行うことができるため、ビルドを継続的に調整して迅速な状態を保つことができます。ビルド ボックスのせいで、作業が停止するのを止めるためだけに、作業時間の 5 分の 1 を忙しくさせられる可能性があるということは、管理者にとっては受け入れがたいことです。
を使用しております ビルドボット, 、ビルドは個別のステップに分割されます。ビルドステップを十分な粒度で分割することと、完全なユニットであることとの間にはバランスが必要です。
たとえば、私の現在のポジションでは、各プラットフォーム (Mac、Linux、Windows) のサブピースをそれぞれのプラットフォーム上で構築しています。次に、それらを最終的なディストリビューションに含まれる最終バージョンにコンパイルする 1 つのステップ (いくつかのサブステップを含む) があります。
これらのステップのいずれかで問題が発生した場合、診断は非常に簡単です。
私のアドバイスは、できる限り曖昧な言葉でホワイトボードに手順を書き、それに基づいて手順を進めることです。私の場合、それは次のようになります。
- プラグイン部分を構築する
- Mac 用にコンパイルする
- PC用にコンパイルする
- Linux 用にコンパイルする
- 最終的なプラグインを作成する
- プラグインテストを実行する
- 中間 IDE をビルドします (ビルドをブートストラップする必要があります)
- 最終的な IDE をビルドする
- IDE テストを実行する
私は間違いなく仕事を壊すでしょう。ビルドに変更を加える可能性が高く、1 つのモノリシック ビルドを検索するよりも小規模なタスクを実行した方が問題を追跡しやすくなります。
とにかく、小さな部分から 1 つの大きなジョブを作成できるはずです。
こんにちは、
統合テストについて話しているので、私の大きな (明らかな) ヒントは、テスト サーバーを展開環境にできるだけ近づけて構築および構成することです。
</thebloodyobvious> (-:
乾杯、ロブ
タスクを個別の目標/操作に分割し、上位レベルのスクリプトを使用してそれらすべてを適切に結び付けます。
これにより、ビルド プロセスが他の人にとって理解しやすくなり (チームの誰もが手に入れることができるように、作業を文書化していますよね?)、再利用の可能性が高まります。高レベルのスクリプトを再利用することはおそらくないでしょう (ただし、同様のプロジェクトがある場合は再利用できる可能性があります) が、個別の操作は (コピー/ペーストであっても) かなり簡単に再利用できます。
リポジトリから最新のソースを取得する例を考えてみましょう。コードを取得するためのタスク/操作をいくつかのログ ステートメントでグループ化し、適切なアカウント情報を参照するとよいでしょう。これは、あるプロジェクトから次のプロジェクトに再利用するのが非常に簡単な種類のものです。
私のチームの環境では、開発マシン (スクリプトの作成/デバッグを行う) と CI サーバー (クリーンな環境で同じスクリプトを実行するだけなので) の間に共通のスクリプト環境を提供するため、NAnt を使用しています。ビルドの管理には Jenkins を使用していますが、その核心では、各プロジェクトは同じ NAnt スクリプトを呼び出しているだけで、結果を操作します (つまり、ビルド出力をアーカイブし、テストに失敗したことをフラグを立てるなど)。