Visual Studio TFS 團(tuán)隊(duì)項(xiàng)目和集合指南
在 MSDN 雜志 文章,“Visual Studio TFS 分支和合并指南”(msdn.microsoft.com/magazine/gg598921) 中,Visual Studio ALM Rangers 推出了一些新的分支方案和相關(guān)指導(dǎo),可幫助您處理復(fù)雜的真實(shí)分支和合并環(huán)境,以便改進(jìn)解決方案的一致性和質(zhì)量以及應(yīng)用程序生命周期管理 (ALM) 的整體過程。
概括來說,Rangers 就是通過解決功能缺失問題以及消除阻礙產(chǎn)品采用的因素來提倡 Visual Studio 產(chǎn)品組、Microsoft 服務(wù)和 Microsoft 最有價(jià)值專家 (MVP) 社區(qū)之間協(xié)作的一組專家。
在本文中,Rangers 提供了組織和配置 Team Foundation Server (TFS) 團(tuán)隊(duì)項(xiàng)目和團(tuán)隊(duì)項(xiàng)目集合的指南。
閱讀完本文后,您能更好地了解以下內(nèi)容:
- 團(tuán)隊(duì)項(xiàng)目集合及其優(yōu)點(diǎn)
- 有關(guān)如何選擇將一個(gè)或更多團(tuán)隊(duì)項(xiàng)目合并到一個(gè)團(tuán)隊(duì)項(xiàng)目集合中或?qū)⑺鼈儽A粼趩为?dú)團(tuán)隊(duì)項(xiàng)目集合中的注意事項(xiàng)
- 有關(guān)如何通過組織團(tuán)隊(duì)項(xiàng)目和團(tuán)隊(duì)項(xiàng)目集合來提高隔離或改進(jìn)可伸縮性的注意事項(xiàng)
- 如何存檔一個(gè)或更多不活動(dòng)的團(tuán)隊(duì)項(xiàng)目
本文將幫助您理解團(tuán)隊(duì)項(xiàng)目和團(tuán)隊(duì)項(xiàng)目集合組織是如何受下列問題影響的:
- 安全性和 TFS 配置、團(tuán)隊(duì)項(xiàng)目集合和團(tuán)隊(duì)項(xiàng)目
- 選擇過程模板
- 過程模板自定義,包括自定義工作流、工作項(xiàng)類型自定義、自定義報(bào)告、自定義查詢和自定義過程指南
- 團(tuán)隊(duì)組織
- 團(tuán)隊(duì)項(xiàng)目組織,包括區(qū)域和迭代
- 項(xiàng)目管理注意事項(xiàng),包括項(xiàng)目里程碑和計(jì)劃
規(guī)劃
為了確保所有利益干系人具有有效和可伸縮的 ALM 系統(tǒng),Visual Studio TFS 規(guī)劃通常會(huì)從建議的基礎(chǔ)結(jié)構(gòu)以及團(tuán)隊(duì)項(xiàng)目和團(tuán)隊(duì)項(xiàng)目集合的架構(gòu)開始。
Visual Studio 2010 快速參考指南 (vs2010quickref.codeplex.com) 以及 Visual Studio 2010 和 TFS 2010 虛擬機(jī) (VM) 工廠 (rangersvsvmfactory.codeplex.com) Rangers 指南項(xiàng)目提供了概念、指南和快速參考海報(bào),用于支持容量規(guī)劃并幫助回答有關(guān)基礎(chǔ)結(jié)構(gòu)應(yīng)為物理或虛擬基礎(chǔ)結(jié)構(gòu)還是兩者并存的問題。
雖然您通常先規(guī)劃和定義團(tuán)隊(duì)項(xiàng)目集合,然后再在 TFS 2010 環(huán)境中定義團(tuán)隊(duì)項(xiàng)目,但是我們會(huì)首先介紹團(tuán)隊(duì)項(xiàng)目。
Visual Studio 團(tuán)隊(duì)項(xiàng)目
在 TFS 2005 和 TFS 2008 中,一個(gè) TFS 服務(wù)器可能會(huì)承載一個(gè)或更多團(tuán)隊(duì)項(xiàng)目。 每個(gè)團(tuán)隊(duì)項(xiàng)目實(shí)質(zhì)上都是一個(gè)產(chǎn)物容器,包括源代碼(組織在各文件夾、分支文件夾和分支中),并包括一個(gè)或更多 Visual Studio 解決方案、Team Build 配置文件、Team Load Test Agent 以及可選的 SharePoint 存儲(chǔ)庫,該存儲(chǔ)庫包含項(xiàng)目相關(guān)文檔以及由團(tuán)隊(duì)用來跟蹤和執(zhí)行由過程模板控制的一組工作的安全設(shè)置。 不能將團(tuán)隊(duì)項(xiàng)目與 Visual Studio .NET 項(xiàng)目混淆,后者包含生成 Microsoft .NET Framework 程序集所需的全部生成和配置設(shè)置;一個(gè) Visual Studio .NET 解決方案包含一個(gè)或多個(gè) Visual Studio .NET 項(xiàng)目并定義項(xiàng)目依賴關(guān)系、生成過程和順序;或包含一個(gè)項(xiàng)目計(jì)劃,該計(jì)劃用于從一組要求進(jìn)行生成。
有關(guān)創(chuàng)建和管理團(tuán)隊(duì)項(xiàng)目的更多信息,請(qǐng)參見“創(chuàng)建和管理團(tuán)隊(duì)項(xiàng)目”MSDN 庫頁面 (bit.ly/eCP0yX)。
讓我們討論一下將項(xiàng)目計(jì)劃組織到團(tuán)隊(duì)項(xiàng)目中時(shí)的注意事項(xiàng)。 團(tuán)隊(duì)項(xiàng)目常常包含與開發(fā)單個(gè)產(chǎn)品或產(chǎn)品系列關(guān)聯(lián)的最大工作單元。 例如,在 Microsoft 產(chǎn)品中,Visual Studio 和 Office 是兩個(gè)產(chǎn)品系列,每個(gè)產(chǎn)品系列都包含在其自身的單獨(dú)團(tuán)隊(duì)項(xiàng)目中(請(qǐng)參見圖 1),因?yàn)檫@兩個(gè)產(chǎn)品系列的開發(fā)是按照完全不同的日程表進(jìn)行的,并具有各自的里程碑和發(fā)布計(jì)劃。

圖 1 Visual Studio 和 Office 團(tuán)隊(duì)項(xiàng)目
注意配置問題和安全隔離十分重要。 創(chuàng)建新的團(tuán)隊(duì)項(xiàng)目過程中最費(fèi)時(shí)的一項(xiàng)工作是對(duì)項(xiàng)目進(jìn)行配置以便它由一個(gè)或更多團(tuán)隊(duì)使用,主要通過定義安全用戶、組和權(quán)限來控制對(duì)團(tuán)隊(duì)項(xiàng)目及其產(chǎn)物的訪問。需要針對(duì)在正確粒度級(jí)別上正確定義安全性的利益對(duì)這種配置工作進(jìn)行平衡,以便讓團(tuán)隊(duì)中的成員能夠完成他們需要 完成的工作。 同時(shí),正確的安全配置可以防止不應(yīng)該執(zhí)行某些任務(wù)的人員無意間或故意對(duì)團(tuán)隊(duì)項(xiàng)目及其資產(chǎn)其造成損壞。
對(duì)于具有不同里程碑和發(fā)布計(jì)劃的產(chǎn)品系列(如 Visual Studio 和 Office),合理的做法是將每個(gè)產(chǎn)品系列組織為獨(dú)立團(tuán)隊(duì)項(xiàng)目以實(shí)現(xiàn)安全隔離。 與每個(gè)產(chǎn)品系列相關(guān)聯(lián)的開發(fā)團(tuán)隊(duì)可能是完全分開的,他們不大可能需要和被授予兩個(gè)團(tuán)隊(duì)環(huán)境中的參與和生成權(quán)限。
對(duì)于使用不同方法的項(xiàng)目計(jì)劃(例如,一個(gè)團(tuán)隊(duì)選擇使用 Microsoft Solutions Framework (MSF) 開發(fā) Agile Software Development 5.0 版,而另一個(gè)團(tuán)隊(duì)選擇使用 Microsoft Solutions Framework (MSF) for Agile Software Development 5.0 版),這就需要兩個(gè)獨(dú)立的團(tuán)隊(duì)項(xiàng)目,因?yàn)橐粋€(gè)給定團(tuán)隊(duì)項(xiàng)目有且只有一個(gè)與之關(guān)聯(lián)的過程模板。
對(duì)于需要“區(qū)域”和“迭代”的唯一定義的項(xiàng)目計(jì)劃,建議將團(tuán)隊(duì)項(xiàng)目分開,因?yàn)橐粋€(gè)給定團(tuán)隊(duì)項(xiàng)目只定義一個(gè)區(qū)域和迭代層次結(jié)構(gòu)。 或者,一個(gè)團(tuán)隊(duì)項(xiàng)目可以使用區(qū)域來組織多個(gè)功能團(tuán)隊(duì)(請(qǐng)參見圖 2),這些功能團(tuán)隊(duì)共享相同的迭代(請(qǐng)參見圖 3)。 另請(qǐng)參見由 Martin Hinshelwood 撰寫的文章“使用 Team Foundation Server 2010 創(chuàng)建項(xiàng)目”(在 bit.ly/hSnHGw 上),該文章討論了使用區(qū)域而不是具有許多小型團(tuán)隊(duì)項(xiàng)目的方案。

圖 2 使用區(qū)域來組織單獨(dú)功能團(tuán)隊(duì)的團(tuán)隊(duì)項(xiàng)目

圖 3 多個(gè)功能團(tuán)隊(duì)共享迭代層次結(jié)構(gòu)的團(tuán)隊(duì)項(xiàng)目
版本控制簽出設(shè)置(例如,獨(dú)占簽出、簽入策略和簽入說明)是為某個(gè)團(tuán)隊(duì)項(xiàng)目定義的,并且這些設(shè)置不跨越團(tuán)隊(duì)項(xiàng)目邊界共享。 如果分開的項(xiàng)目計(jì)劃需要不同的源代碼管理設(shè)置,則這些項(xiàng)目計(jì)劃必須與單獨(dú)的團(tuán)隊(duì)項(xiàng)目相關(guān)聯(lián)。
過程模板自定義包括已自定義(或自定義)工作流、工作項(xiàng)類型 (WIT)、報(bào)告和查詢。 您可以自定義用于創(chuàng)建新團(tuán)隊(duì)項(xiàng)目的過程模板,或自定義由某個(gè)團(tuán)隊(duì)項(xiàng)目使用的特定過程模板,這種特定過程模板不會(huì)跨多個(gè)團(tuán)隊(duì)項(xiàng)目共享。
共享團(tuán)隊(duì)項(xiàng)目產(chǎn)物通常是通過從一個(gè)團(tuán)隊(duì)項(xiàng)目分支到另一個(gè)團(tuán)隊(duì)項(xiàng)目實(shí)現(xiàn)的。 在前一篇文章中,我們討論了共享公共代碼的各種方法,其中很多方法都涉及到分支。
您可以看到,決定分開的項(xiàng)目或項(xiàng)目計(jì)劃是可以共享相同的團(tuán)隊(duì)項(xiàng)目還是必須與不同的團(tuán)隊(duì)項(xiàng)目相關(guān)聯(lián)需要考慮很多因素。 您應(yīng)考慮各種因素,并做出最適合您的組織的團(tuán)隊(duì)項(xiàng)目組織決定。
Visual Studio 團(tuán)隊(duì)項(xiàng)目集合
雖然團(tuán)隊(duì)項(xiàng)目在一定程度上是相互獨(dú)立的,但在 TFS 2005 和 TFS 2008 中,某些維護(hù)活動(dòng)(例如,將多個(gè) TFS 服務(wù)器合并為一個(gè)服務(wù)器)在過去是很難實(shí)現(xiàn)的。 并且,組織內(nèi)的獨(dú)立業(yè)務(wù)部門只能通過在組織內(nèi)實(shí)現(xiàn)兩個(gè)或更多 TFS 服務(wù)器來取得組織隔離,這就提高了基礎(chǔ)結(jié)構(gòu)成本,增加了維護(hù)和整體復(fù)雜性。
Visual Studio 2010 引入了團(tuán)隊(duì)項(xiàng)目集合。 每個(gè) TFS 服務(wù)器可以有一個(gè)或更多團(tuán)隊(duì)項(xiàng)目集合。 反過來,一個(gè)團(tuán)隊(duì)項(xiàng)目集合包含一個(gè)或更多團(tuán)隊(duì)項(xiàng)目。 團(tuán)隊(duì)項(xiàng)目集合是 TFS 的基本恢復(fù)單位。 從備份和還原的角度看,團(tuán)隊(duì)項(xiàng)目集合與 SharePoint 站點(diǎn)集合類似。
Visual Studio 2010 快速參考指南項(xiàng)目 (vs2010quickref.codeplex.com) 提供了快速參考海報(bào),可幫助您計(jì)劃新團(tuán)隊(duì)項(xiàng)目集合功能和團(tuán)隊(duì)項(xiàng)目。 團(tuán)隊(duì)項(xiàng)目集合提供了更具可伸縮性的 TFS 服務(wù)器部署。 在 TFS 2010 中,一個(gè)團(tuán)隊(duì)項(xiàng)目集合大致相當(dāng)于 TFS 2005 或 TFS 2008 中的一個(gè) TFS 服務(wù)器。 有關(guān)創(chuàng)建和管理團(tuán)隊(duì)項(xiàng)目集合的更多信息,請(qǐng)參見 msdn.microsoft.com\library\dd236915。
將團(tuán)隊(duì)項(xiàng)目隔離為獨(dú)立團(tuán)隊(duì)項(xiàng)目集合時(shí)的注意事項(xiàng)包括可伸縮性、備份、恢復(fù)、安全隔離以及在團(tuán)隊(duì)項(xiàng)目間共享信息。
利用通常與數(shù)據(jù)庫環(huán)境相關(guān)聯(lián)的可伸縮性和負(fù)載平衡基礎(chǔ)結(jié)構(gòu),團(tuán)隊(duì)項(xiàng)目集合能夠在物理 SQL 服務(wù)器和 SQL 服務(wù)器實(shí)例之間實(shí)現(xiàn)負(fù)載平衡,從而為 TFS 服務(wù)器的可伸縮性提供支持。 如果您能夠在 SQL 服務(wù)器之間實(shí)現(xiàn)負(fù)載平衡,就可獲益于將團(tuán)隊(duì)項(xiàng)目拆分成多個(gè)團(tuán)隊(duì)項(xiàng)目集合。
如前所述,TFS 的基本恢復(fù)單位是團(tuán)隊(duì)項(xiàng)目集合。 不能對(duì)團(tuán)隊(duì)項(xiàng)目單獨(dú)進(jìn)行備份或還原。 如果您需要粒度備份和恢復(fù)功能(例如,如果您不想恢復(fù)一個(gè)以上團(tuán)隊(duì)項(xiàng)目),則將團(tuán)隊(duì)項(xiàng)目隔離為獨(dú)立的團(tuán)隊(duì)項(xiàng)目集合以便進(jìn)行備份和恢復(fù)會(huì)使您的組織獲益。
如果要以適當(dāng)?shù)目刂瞥潭群土6日_管理團(tuán)隊(duì)項(xiàng)目集合的安全設(shè)置,則可能會(huì)比較耗時(shí)。 在添加新的團(tuán)隊(duì)項(xiàng)目集合時(shí),必須考慮用于設(shè)置每個(gè)集合的初始和后續(xù)工作。 如果在一個(gè) TFS 服務(wù)器上管理的團(tuán)隊(duì)項(xiàng)目的項(xiàng)目團(tuán)隊(duì)具有不同的安全要求,則出于安全原因?qū)F(tuán)隊(duì)項(xiàng)目隔離為獨(dú)立的團(tuán)隊(duì)項(xiàng)目集合會(huì)讓您受益。
另一方面,如果在一個(gè) TFS 服務(wù)器上管理的團(tuán)隊(duì)項(xiàng)目的項(xiàng)目團(tuán)隊(duì)不需要安全隔離,則讓組織的團(tuán)隊(duì)項(xiàng)目位于同一個(gè)團(tuán)隊(duì)項(xiàng)目集合中會(huì)使組織受益(請(qǐng)參見圖 4)。

圖 4 團(tuán)隊(duì)項(xiàng)目集合共享和隔離邊界
雖然可以在相同團(tuán)隊(duì)項(xiàng)目集合中的團(tuán)隊(duì)項(xiàng)目間實(shí)現(xiàn)產(chǎn)物(如源代碼文件)共享,但這些產(chǎn)物不能跨越團(tuán)隊(duì)項(xiàng)目集合邊界共享(請(qǐng)參見圖 4)。 如果兩個(gè)團(tuán)隊(duì)項(xiàng)目必須共享產(chǎn)物,則他們必須位于同一團(tuán)隊(duì)項(xiàng)目集合中。
有關(guān)使用團(tuán)隊(duì)項(xiàng)目集合來共享和隔離源代碼并進(jìn)行分支和合并的討論不在本文范圍之內(nèi)。 建議您參考tfsbranchingguideiii.codeplex.com 以了解今后的指南中包含的相關(guān)討論和信息。
團(tuán)隊(duì)項(xiàng)目存檔策略
定期維護(hù)必不可少,因?yàn)?TFS 環(huán)境從來不能安裝在無限制的物理資源上。 管理員需要計(jì)劃定期維護(hù)以存檔完整的項(xiàng)目數(shù)據(jù)并釋放服務(wù)器上壓力,以免開發(fā)團(tuán)隊(duì)遇到性能問題。
Rangers 升級(jí)指南 (vs2010upgradeguide.codeplex.com) 定義了一些可能的策略以作為升級(jí)指南的一部分,這些策略與 Microsoft 咨詢服務(wù)已開發(fā)的過程類似(請(qǐng)參見圖 5):

圖 5 可能的存檔策略
- 首先制作團(tuán)隊(duì)項(xiàng)目集合的副本。
- 從新克隆的存檔團(tuán)隊(duì)項(xiàng)目集合中刪除活動(dòng)的團(tuán)隊(duì)項(xiàng)目(使用 TFSDeleteProject 命令行實(shí)用工具)。
- 從原始(活動(dòng))團(tuán)隊(duì)項(xiàng)目集合中刪除存檔的項(xiàng)目。
- 然后,可以將新的團(tuán)隊(duì)項(xiàng)目集合存儲(chǔ)至外部介質(zhì)上(例如,磁帶或閃存),再從硬盤將其刪除。 如果對(duì)系統(tǒng)進(jìn)行審核,則很容易將存檔介質(zhì)還原。
- 分離新的團(tuán)隊(duì)項(xiàng)目集合,以便以后輕松地重新獲取該集合。
從概念上看,此策略似乎并不重要,但確實(shí)需要一種策略來確定哪些團(tuán)隊(duì)項(xiàng)目可以存檔,而哪些不能。 請(qǐng)?zhí)貏e注意,在執(zhí)行 TFSDeleteProject 操作時(shí),會(huì)將源代碼分支從系統(tǒng)中移除,并且這個(gè)事件是可以撤消的。
以下是用于存檔策略的建議:
- 為開發(fā)團(tuán)隊(duì)建立項(xiàng)目收尾策略以清理項(xiàng)目數(shù)據(jù)并將其存儲(chǔ)。 源代碼不是唯一需要保存的資料。 項(xiàng)目要求很有趣,但是它們的格式很可能不能重新使用,或者不能從其進(jìn)行增強(qiáng)。 功能規(guī)范需要與以前的功能規(guī)范混合才能反映產(chǎn)品在項(xiàng)目完成時(shí)處于生產(chǎn)條件下的狀態(tài)。 隨后,可以對(duì)該項(xiàng)目的要求進(jìn)行存檔,無需擔(dān)心數(shù)據(jù)丟失。 工作項(xiàng)不能像源代碼那樣從一個(gè)團(tuán)隊(duì)項(xiàng)目合并至另一個(gè)團(tuán)隊(duì)項(xiàng)目,因此,需要在項(xiàng)目完成后做出如何存儲(chǔ)完成的工作項(xiàng)的決定。
- 向所有團(tuán)隊(duì)發(fā)送標(biāo)準(zhǔn)要求,通知他們?cè)撌录坝幸粋€(gè)掛起的存檔操作,并列出針對(duì)該存檔的所有團(tuán)隊(duì)項(xiàng)目。
- 在每個(gè)團(tuán)隊(duì)項(xiàng)目中建立一個(gè)里程碑文件夾以作為完整項(xiàng)目計(jì)劃的最終項(xiàng)目數(shù)據(jù)的容器,包括要求列表、最終項(xiàng)目報(bào)告以及項(xiàng)目收尾時(shí)按正常方法策略存儲(chǔ)的全部文檔。
實(shí)質(zhì)上,若要成功進(jìn)行存檔,需要保留所有項(xiàng)目數(shù)據(jù),而不僅僅是保留源代碼。
為了對(duì)某個(gè)業(yè)務(wù)部門可能分離為兩個(gè)或更多管理實(shí)體做出響應(yīng),需要拆分團(tuán)隊(duì)項(xiàng)目集合。 在這種情況下,雖然不會(huì)存檔任何團(tuán)隊(duì)項(xiàng)目,但將部署與用于存檔團(tuán)隊(duì)項(xiàng)目的方法類似的方法。 第二個(gè)團(tuán)隊(duì)項(xiàng)目集合必須要像原始團(tuán)隊(duì)項(xiàng)目集合那樣進(jìn)行處理,原因在于它現(xiàn)在需要獨(dú)立于原始團(tuán)隊(duì)項(xiàng)目集合的定期維護(hù)。
在團(tuán)隊(duì)項(xiàng)目集合間移動(dòng)團(tuán)隊(duì)項(xiàng)目不太容易,并且一旦將集合拆分,就不能簡(jiǎn)單地將其重新合并,因?yàn)橹荒軐⑿碌膱F(tuán)隊(duì)項(xiàng)目添加到集合中。 為了合并團(tuán)隊(duì)項(xiàng)目集合,需要使用 TFS API 獲得自定義代碼,以便將項(xiàng)目數(shù)據(jù)從一個(gè)集合復(fù)制到另一個(gè)集合。
雖然并未建議這樣做,但可使用 TFS 集成工具將團(tuán)隊(duì)項(xiàng)目合并成團(tuán)隊(duì)項(xiàng)目集合中,請(qǐng)參見 TFS 集成工具文檔 (bit.ly/9tHWdG)。
在以后的文章中,我們將研究 Rangers 如何使用 Visual Studio ALM 工具來應(yīng)對(duì)分布式敏捷團(tuán)隊(duì)管理所帶來的挑戰(zhàn)。