2013-11-03 43 views
1

我在本地使用TFS 2013。我在Build機器上配置了四個構建代理。幾個構建定義編譯ASP .NET網站。我配置了msbuild參數來將IIS應用程序部署到位於Rackspace中的集成服務器。TFS 2013構建代理共享通用構建文件夾

默認情況下,webdeploy通過比較文件日期來進行差異部署。在我的情況下,這是一個很大的優勢,因爲將文件從我們的網絡複製到Rackspace需要相當長的一段時間。現在,爲了保存文件日期,構建代理必須編譯相同的基本源代碼集。在每個構建中,只有差異源代碼纔會生成新的DLL,從而最大限度地減少部署的文件數量。

所有這些工作正常,有一個警告:給定的構建定義必須分配給構建代理(通過代理名稱或標記)。問題是我創建了很多意外情況,當分配給同一個代理的所有構建都排隊等候時。他們排隊等待,直到先前的構建完成。

在理想的世界中,任何代理應該能夠處理任何構建,但編譯的源代碼必須相同,無論代理如何。

我試圖改變所有代理的工作文件夾指向相同的位置,但我得到一個錯誤,因爲兩個代理不能映射到同一個文件夾。我想每個代理有一個工作區。

任何想法?

+0

我同意@Jason Williams--目前尚不清楚爲什麼你會希望多個代理商從你描述問題的方式。擁有多個代理人的重點是並行構建,他的選擇經過深思熟慮;自發布以來已經有幾個月了 - 從那以後,您是否對您的流程做過任何更改?無論哪種方式,它怎麼樣? –

回答

2

最後我找到了一種方法來做到這一點。這裏是所有你需要做的更改:每個代理的工作文件夾爲$

  • 默認情況下(系統驅動器)\構建\ $(BuildAgentId)\ $(BuildDefinitionPath)。這意味着每個BuildAgentId都有一個工作文件夾。我修改了它,以便所有代理共享相同的文件夾:$(SystemDrive)\ Builds \ WorkingFolder \ $(BuildDefinitionPath)
  • 默認情況下,運行時工作流會創建一個看起來像[[BuildDefinitionId] [AgentId] [計算機名]」。由於所有代理共享相同的工作文件夾,因此嘗試創建每個單獨的工作區時出錯。解決方案在構建定義中:編輯xaml並查找名爲「從Team Foundation版本控制獲取源」的活動。有一個名爲WrokspaceName的屬性。由於我想每個構建定義都有一個工作空間,我將該屬性設置爲BuildDetail.BuildDefinition.Name。
  • 保存您的自定義構建模板並創建使用它的構建。
  • 確保選項「1. TF VersionControl/1。Clean workspace」設置爲False。否則,構建將清除每個構建中的所有源代碼。
  • 確保選項「2. Build/3。Clean build」設置爲false。否則,構建會清除每個構建中的輸出二進制文件。

使用此設置,您可以在任何代理上排隊相同的構建,並且它們都將指向相同的源代碼和bin輸出。當源代碼更改時,只有受影響的二進制文件被重新編譯。我使用msdeploy.exe將模板中的自定義步驟部署到IIS中的所有服務器的輸出文件。現在,我的構建+部署需要一兩分鐘的時間,因爲只有在構建過程中更改的dll或內容纔會與服務器同步。

1

您不能在同一個文件夾中運行兩個構建代理。構建代理的重點是並行運行多個構建,通常在不同的PC上運行。如果你試圖在相同的源代碼上運行它們,那麼(a)由於兩個完全相同的源代碼應該產生相同的結果,所以它毫無意義;(b)它們幾乎肯定會相互轉移並導致構建失敗或產生意外的結果。

如果你希望能夠生成並部署了一系列的代碼庫的版本,則有兩種選擇:

  • ,如果你排隊了多個版本,那麼最後一個會「贏「,所以中間版本沒有實際價值。因此,如果您在第一次構建完成之前檢入新代碼,則最好停止活動構建並開始新構建。你應該問自己爲什麼這個構建太慢了,或者你爲什麼經常檢查變化,這是必要的。

  • 如果每個構建都生成對部署結果的增量更新,那麼您需要將構建的輸出傳遞給某個部署代理,該部署代理可以根據部署的版本進行區分,並僅發送要部署的更改。這可以設置爲從多個構建代理收集結果,如果這將是有益的。

  • 但我想知道是否你的版本很慢,因爲你每次都在做一個完整的構建(清理構建文件夾,獲取所有的源代碼並完成重建),當你想要的是一個增量構建(獲取最新更改,僅編譯受影響的內容,並快速完成)。也許你應該調查使你的構建增量。

+0

關於第1項,我應該澄清我不希望同一個構建定義在多個代理上同時構建。我使用滾動構建觸發器來一次只保留一個構建。在這種情況下,代理商不會互相絆倒。對於第2項,假設我將msdeploy.exe作爲工作流的單獨步驟調用,我想我會遇到同樣的問題;日期時間將不匹配來自不同代理的輸出,並且它將部署更多文件而不是必要的。關於第3項,我不清理生成文件夾。構建本身非常快。耗時的活動是部署 – oscarmorasu

+0

我不認爲我理解你的問題。如果您可以快速構建,但部署速度較慢,並且部署覆蓋以前的版本,則選項聽起來像:kill intermediate build,因爲它們會被覆蓋;檢查部署速度如此之慢的原因(可以將鏈接升級到服務器,可以壓縮部署文件等) –