TeamCityをSubversionとMSBuildで使用しており、Subversionコミットによってトリガーされる連続ビルドに問題があります。継続的インテグレーションと組み合わせてインクリメンタルビルディングが可能ですか?
連続ビルドがセットアップされるインクリメンタルビルドを行うに(ナイトリービルドは、完全かつクリーンです)。
問題があれば、開発者の変更を発生し、ビルドが開始された後に(トリガーされたコミット)が、ファイルを使用するオブジェクトが構築される前に、二度目のファイルをコミットします。オブジェクトファイルは、2回目のコミットのタイムスタンプの後にあるタイムスタンプを取得します。これにより、それ以降のすべてのインクリメンタルビルドがファイルの変更をスキップします。
T1:ここに余分明確にするために
は、タイムラインで開発者がコミットfile.cpp(file.cppは、時間T1を持っている)
T2:まず、インクリメンタルビルドがビルドサーバー上
T3を開始します。サーバーを構築します(file.cppにはT4)
T4:開発者がfile.cppを2回目にコミットします。
T5:BuildserverがT1のfile.cppをfile.objにコンパイルします(今すぐfile.objに時間T5がある)
T6:最初のビルドが終了しました(結果は良好です)
T7:第二インクリメンタルビルドがビルドサーバー上
T8を開始:
T9:サーバーを構築する構築し、サーバには、最新の変更(T4でfile.cpp)
そして今、問題のファイルを取得しますfile.objがT5であるためコンパイラはそれがソースファイルより新しいと考えているので、file.cpp(T4の)をfile.objにコンパイルしません。
問題
は簡単に完全なビルドで固定されているが、これらは、長い時間(ユニットテストなしで30分)を取ります。は、継続的インテグレーションとの組み合わせで、増分建物は可能ですか?
編集:この問題は、サーバー側のチェックアウトモードを使用する場合に起こるようです。ビルドエージェントのサイドチェックアウトモードでは、変更されたファイルは取得時間のタイムスタンプを取得し、サーバサイドのチェックアウトではタイムスタンプとしてコミット時間を取得します。
CIサーバーはコード変更についてVCSに問い合わせることができます。 – jfs
です。問題はタイミングです。 CIサーバーがprevを取得した後にファイルが変更された場合。ビルドで実際に使用される前に問題があるようです。 – Halt
@Halt:あなたのVCSが実際に変更されたファイルを知ることができるので、ビルドシステムを正しく動作させるためにそれらのファイルに触れることができます。 'svn diff -r PREVのようなもの:HEAD --summarize | awk '{print $ 2}' | xargs touch ' – jfs