10

我們有一個相當複雜的Visual Studio解決方案(57個項目,其中19個是網站,幾乎每次通過推送代碼觸發時都無法構建,但隨後我們手動觸發構建並這個解決方案包含57個項目,其中19個是網站項目(不是web應用程序項目,沒有.csproj文件)其餘的是類庫和後臺作業。19網站項目在IIS虛擬目錄中構成一個大型多功能內容管理系統。Visual Studio網站構建在CI服務器上間歇性地失敗

構建服務器是Hudson v1.395。用於構建的命令是:

"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com" "SolutionName.sln" /rebuild Debug 

當構建失敗,它總是等完全相同的網站項目,具有完全相同的消息:

------ Rebuild All started: Project: C:\...\WebsiteName\, Configuration: Debug Any CPU ------ 
Validating Web Site 
: Build (web): The application domain in which the thread was running has been unloaded. 

Validation Complete 

一個Google Search for this message目前比少很有幫助。 This link最接近實際問題,但沒有解決方案。很顯然,在構建過程中我們不會更改任何解決方案文件,因爲它在構建服務器上發生。

當它失敗時,我們手動觸發構建,並且我們得到像我們預期的(對不起,刪節):

------ Rebuild All started: Project: C:\...\News2\, Configuration: Debug Any CPU ------ 
Validating Web Site 
Building directory '/WebsiteName/Dir1/Dir2/'. 
Building directory '/WebsiteName/'. 
Building directory '/WebsiteName/Dir3/'. 
// 22 more but you get the point 

// A few warnings caused by our own use of the ObsoleteAttribute, nothing to be concerned about 
Validation Complete 

這是什麼原因卸載消息此應用程序域?

其他一些注意事項:

  • 我們認爲這可能是哈德森運行內存,因爲我們觀察到的java泄露它頗有幾分。所以,我們增加了一項任務,每天早上6點重新啓動Hudson服務。即使在構建過程中有足夠的可用內存,它仍然會失敗。
  • 推送到同一個存儲庫還會導致構建更簡單(只有22個項目,無網站項目)解決方案。那個總是成功的。另外,手動觸發它們同時運行也會成功。
  • 我知道我們應該升級哈德森,但這永遠是那些我們從來沒有時間看到的後退項目之一。無論如何,我相當強烈地感到這是一個Visual Studio/MSBuild問題,而不是哈德森問題。

編輯1:MSBuild的

與MSBuild的問題是,有這麼多來自在Visual Studio中生成不同的小怪癖。在開發人員機器上的Visual Studio中編譯解決方案,然後在構建服務器上失敗,這是非常令人沮喪的。即使msbuild的輸出與我們的開發人員在其構建輸出窗口中看到的內容截然不同(更加冗長的一件事情)。是否有額外的命令行標誌使MSBuild輸出更符合您在Visual Studio生成窗口中獲得的內容?

還有其他的東西也很尷尬。如果碰巧有一個與項目命名相同的解決方案文件夾,MSBuild會拋出一個錯誤,但Visual Studio處理它就好了。這些都是真正讓你脫穎而出的怪癖。

回答

2

我不太熟悉Hudson或網站項目(我使用TeamCity和Web應用程序項目),但我想我會拋出一些東西,看看它是否會有所幫助。

您是否嘗試過直接使用MSBuild構建解決方案而不是使用Visual Studio?該命令會是這樣的:

%windir%\Microsoft.NET\Framework\<version>\MSBuild SolutionName.sln /t:Rebuild /p:configuration=debug 

我注意到,你沒有通過命令行開關Visual Studio中的生成後關閉完成/ RunExit MSDN Link那麼會不會是在Visual Studio IDE中打開在每個構建的構建服務器上,而不是關閉?我可以看到具有相同解決方案的IDE的多個實例打開導致問題。

我會建議如果可能的話,使用MSBuild而不是Visual Studio來執行你的構建,除非你在IDE中有一些依賴。您至少應該獲得更快的構建時間,因爲您不必加載Visual Studio,並且可以消除構建過程中的一層複雜性。

希望得到這個幫助!

+0

關於MSBuild,請參閱我附加到我的問題的「編輯1」。雖然不是我最喜歡的選項,但我會嘗試。我也會嘗試/ RunExit,儘管我們沒有觀察到在服務器上存在的devenv實例。還澄清 - 即使他們是從*同*庫,這兩種解決方案是完全克隆,所以沒有分享任何類型的兩個併發devenv的實例之間回事。 –

+0

的問候上的MSBuild的日誌記錄級別,您可以使用/冗長標誌[MSDN鏈接]改變它(http://msdn.microsoft.com/en-us/library/ms164311.aspx) –

+0

**此選項不適用於Visual Studio 7.0-9.0(2003-2008)和C++項目!(VS 10.0將C++項目轉換爲msbuild,因此可能在那裏)。 –

2

由於同一個checkin而運行的另一個併發構建感覺他們是相關的。一個資源在我的構建中消失,而相關的構建運行使我懷疑相關的構建。

我知道你說過你可以在同一時間手動運行它們,一切都很好。儘管如此,它聞起來像是一種競爭條件。嘗試在較小的項目上禁用自動觸發器並將其作爲最終的完整性檢查,以確保它不會讓您感到困擾。

我想如果你完全沒有懷疑它,你就不會在你的帖子中提到它。規則出來。

6

我不得不用C++的問題建立在哈得遜/詹金斯這很可能是相關的,如果你有兩個版本會同時再壞的事情都可能發生。

這是因爲Hudson/Jenkins將在構建結束時運行進程樹殺手來清理進程,而MsBuild/VisualStudio將在構建之間共享一些常見進程。

我曾與C++的實際問題,建立體現了自己的另一個錯誤:

fatal error C1090: PDB API call failed, 
error code '23' : '( 

的問題在這裏提出:

https://issues.jenkins-ci.org/browse/JENKINS-9104

關閉進程樹殺手可能會解決您的問題。