2010-11-18 31 views
4

我們在Subversion和MSBuild中使用TeamCity,並且我們遇到了由Subversion提交觸發的連續構建的問題。漸進式建築可與持續集成結合使用嗎?

連續構建設置爲增量構建(每晚構建完整且乾淨)。

如果開發人員在構建開始(提交觸發)後但在構建使用該文件的對象之前第二次更改並提交文件,則會出現此問題。現在,目標文件獲得第二次提交時間戳之後的時間戳。這會導致所有後來的增量構建跳過對文件的更改。

對於此額外的清晰度是時間線:

T1:開發商承諾file.cpp(file.cpp有時間T1)
T2:一是增量編譯生成服務器上啓動
T3:構建服務器獲取最新變化的文件(file.cpp在T1)
T4:開發人員第二次提交file.cpp(file.cpp有T4)
T5:Buildserver將T1的file.cpp編譯成file.obj(現在file.obj有時間T5)
T6:第一次建造完成(效果很好)
T7:第二增量編譯生成服務器上啓動
T8:建立服務器獲取最新變化中的文件(在T4 file.cpp)

而現在的問題:

T9:構建服務器不會將file.cpp(T4)編譯到file.obj中,因爲file.obj是T5,因此編譯器認爲它比源文件更新。

這個問題很容易修復,但需要很長時間(30分鐘沒有單元測試)。

漸進式建築是否可以與持續集成相結合?

編輯:此問題似乎只在使用服務器端結帳模式時發生。使用構建代理端檢出模式更改的文件獲取檢索時間的時間戳,而在服務器端檢出時,它們將提交時間作爲時間戳。

+0

您的CI服務器可以詢問您的VCS有關代碼更改的信息。 – jfs 2010-11-18 19:37:59

+0

它的確如此。問題在於時機。如果在CI服務器獲得prev後更改文件。版本,但在構建中實際使用它之前,似乎存在問題。 – Halt 2010-11-19 09:55:46

+0

@Halt:我的意思是你的VCS可以知道哪些文件真的發生了變化,所以你可以觸摸它們以使你的構建系統正常工作。類似'svn diff -r PREV:HEAD --summarize | awk'{print $ 2}'| xargs touch' – jfs 2010-11-20 09:29:01

回答

2

是的,你一定有比賽條件。我想你可以嘗試通過詢問更改日誌並觸摸其中列出的任何文件來獲得更高的靈活性 - 或者更好的是,如果支持,Subversion不會保留文件修改時間,而是將文件的日期戳記作爲它們的日期更新位於。

我在附近看到的一個問題是大部分時間只能運行增量構建,但有一部分構建運行乾淨(可能每晚)。你可能會週期性地陷入這種競爭狀態,但你會定期擺脫它。根據這種情況發生的頻率,這種混合物可能已經足夠好了。

+0

我想過定期清理,但是決定不要這樣做,因爲在問題發生之後,如果它打破了構建過程(這就是我們發現的),它會在每次構建之後破壞它。如果它沒有破壞構建,你不能相信它包含你的改變,所以成功的測試不會意味着很多,直到下一次清理。 – Halt 2010-11-20 08:10:16

+1

「如果支持,Subversion不會保留文件修改時間,而是讓文件的日期標記爲更新日期」這是Subversion的默認行爲,除非您明確設置了「use-commit-times」選項配置文件(http://svnbook.red-bean.com/nightly/en/svn.advanced.confarea.html#svn.advanced.confarea.opts.config) – slowdog 2010-11-24 23:51:50