2008-11-17 76 views
7

我們遇到性能問題與我們的團隊基礎構建服務器的實施和我正在運行的想法如何加快事情。我們已經添加了幾個PropertyGroup元素來提高几個步驟的性能(SkipClean,SkipLabel,SkipInitializeWorkspace),但我認爲我們需要進行重大的重組來解決問題。下面是我們的設置:團隊建立現在痛苦緩慢

  • 我們已經得到了每一個有很大的不同約40 web應用程序,但運行一串共享組件
  • 每一種網絡應用程序都有自己的解決方案;
  • 每個這些Web應用程序引用了大約10到25個共享程序集;
  • 存在一個構建定義,其中包含在每次檢入到主幹時觸發的所有解決方案;

下面是我們遇到

  • 在生成的基本問題,將建立每個共享組件,多次被引用,而不是建立一次,並使用每個應用
  • 放置目錄的文件複製時間很慢。它必須通過網絡共享,並且不會採用本地路徑。
  • 每一個如此多的構建,一個或多個輸出文件都會被「鎖定」並導致構建在編譯良好時中斷。
  • 另一件事 - 我也嘗試了單獨的構建定義,但這樣做也會強制另一個工作空間被獲取到最新版本。我寧願它是建立服務器包含一個版本的幹線建立。

在過去的幾個月中,我們已經屈服於嗜睡,並忽略了這個問題,但現在構建時間超過一個半小時到一個半小時。

我正在玩弄學習和切換到巡航控制的想法,以獲得更好的控制。任何人都不同意?

任何幫助最受讚賞。謝謝!

回答

2

首先,它聽起來好像您的所有網絡應用都包含在同一個團隊項目中。如果這是真的,將它們分成邏輯分組。通常情況下,單個團隊項目應該包含單個部署模型。

其次,將共享程序集分成他們自己的團隊項目。一旦移動,您有幾個選擇,您可以將源代碼或編譯的DLL分支到需要它們的團隊項目。他們可以有自己的單元測試,並且如果你非常喜歡,你可以擴展團隊構建以在成功的測試中自動合併。總結一下,你需要簡化你的構建策略。

0

從CruiseControl建議的個人經驗談起 - 記住它是一個持續集成的「框架」。它不會立即解決所有問題(組件化構建,每個組件更改觸發,以及序列化構建雖然會使事情變得更好)。它需要相當多的配置(甚至可能是定製)來獲得你想要的東西,所以準備投入一些時間。當然,如果你的構建時間縮短了,你將獲得長期的巨大回報 - 如果你不能再忽視這個問題,值得投入一些時間在更好的CI解決方案上。

請注意,任何CI工作都只與您所採取的政策一樣好。當涉及到版本標籤,釋放,依賴關係,二進制文件的測試版,歸檔版本......以及當時我們甚至沒有考慮過的其他許多問題時,我們遇到了巨大的政策空白。

此外,準備投入至少一些資源來維護這件事。這不是一份全職工作(我喜歡這樣做,因爲它會持續改進流程)。我們的定製將我們從第一款產品的2小時整體構建帶到20多種產品中的400多個組件,這些產品在大約20分鐘內並行地在多臺機器上構建,因此非常值得。

+0

可以肯定地說,Team Foundation Build的開箱即用行爲有點短視嗎?在嚮導中定義構建時,您可以選擇要包含哪些Visual Studio解決方案。聽起來你提倡從這個標準中分離出來,對嗎? – 2008-11-24 13:28:29

1

你真的需要在每個網絡應用程序中構建一切嗎?如果共享程序集沒有更改,爲什麼一遍又一遍地構建它們?

這裏有一個想法:

  1. 讓每一個Web應用程序有自己的\ lib文件夾。
  2. 將每個共享程序集放在lib文件夾中。
  3. 讓Web應用程序只從其本地lib文件夾引用共享程序集。
  4. 檢查一切。

現在構建不應該啓動,除非事情已經改變,並構建將不包括共享組件。

  • 應該有一個包含所有共享程序集的中央文件夾。
  • 此處的任何更改都應傳播到所有本地\ lib文件夾。
  • 最後,任何共享程序集在更改時應該被複制到中央文件夾。

這裏的想法是讓共享程序集項目只知道中央文件夾。這將簡化複製構建所需的任何構建後操作。

中央文件夾必須以任何更改將被複制到所有引用Web應用程序的方式進行管理。

3

所以這就是我所做的,我已經將構建時間縮短到了9分鐘。對於我正在編譯的項目數量,我很好。

  • 創建一個包含所有共享庫和所有網絡的解決方案。在這一步中有很多額外的工作,因爲我必須修復一堆遺留代碼或以其他方式存儲在多個位置的引用。
  • 節省最多時間的事情是執行文件系統移動而不是所有輸出文件的網絡副本。由於我們的放置位置實際上位於構建服務器上,因此這是有道理的。

要執行移動,我只需重寫TFSBuild中的CoreDropBuild目標。proj文件:

<Target Name="CoreDropBuild" 
     Condition=" '$(SkipDropBuild)'!='true' and '$(IsDesktopBuild)'!='true' " 
     DependsOnTargets="$(CoreDropBuildDependsOn)" > 
      <Exec Command="move $(BinariesRoot)\Release d:\BuildOutput\$(BuildNumber)\Release"/>  
</Target>