封閉簽入是Team Foundation Server 2010新增的功能,開啟這個功能後,所有的要簽入的程式碼先上傳到擱置集(Shelveset),然後在Bulid Sever中下載原始碼並Build成功後,才會真的簽入變更集(Changeset),這樣可以確保每一個簽入的都是可以Build的,在多人開發時不會照成一個人簽入不完成的程式碼,使其他所有人都無法在Build,照成其他的開發的困擾,如果在搭配單元測試做自動化測試,可以大幅增加程式碼的正確性。
一、什麼是封閉簽入?
封閉簽入是Team Foundation Server 2010新增的功能,開啟這個功能後,所有的要簽入的程式碼先上傳到擱置集(Shelveset),然後在Bulid Sever中下載原始碼並Build成功後,才會真的簽入變更集(Changeset),這樣可以確保每一個簽入的都是可以Build的,在多人開發時不會照成一個人簽入不完成的程式碼,使其他所有人都無法在Build,照成其他的開發的困擾,如果在搭配單元測試做自動化測試,可以大幅增加程式碼的正確性。
而在TFS 2008、2005雖然也有看似很像簽入原則,但那完全是一個假的簽入原則,只要本機有Build成功過就可以簽入(我試過應該是一個Visual Studio的Process中記憶體中有記錄就可以),如我寫一段Code,Build成功,後來做了些修改,有Bug,Build會失敗,但因為我前面有Build成功過的記錄,所以我還是可以簽入。
圖1-1 騙人的簽入原則
要執行封閉簽入需要安裝以下軟體:
- 可以簽入原始碼的工具:如Visual Studio 2010、TFS 2010 Prower Tool、Team EXPRO等等工具
- Team Foundation Server 2010
- Build Controller 分配工作,至少安裝一個
- Build Agent 執行工作,至少安裝一個
因為Build可能是非常耗資源與耗時的,所以Build的相關程式被折開成獨立軟體,可以在多台電腦上安裝分擔執行負載,相關資料可以參考MSDN文件, Team Foundation Build Reference
圖1-2 Build System的視示圖,來源:Understanding a Team Foundation Build System
2、封閉簽入設定
1.開啟Visual Studio 2010。
2.打開Team Explorer,並連線到TFS。
3.在Team Project下的Builds上按右鍵,選擇New Build Defintion。
圖2-1 新增Build定義
4.輸入定義名稱
圖2-2 Build名稱設定
5.設定觸發方式,選擇Gated Check-in選項。
圖2-3 觸發方式設定
Tip:
第2-4個選項是簽入相關設定,而第5個選項是Daily Build的設定,有興趣可以玩玩。
6.設定從Source Control的那一個路徑下載原始檔。
圖2-4 工作區設定
7.設定Controller與檔案存放地
圖2-5 Controller設定
8.設定Build流程與Build設定與自動化測試的設定
圖2-6 簽入流程設定。
圖2-7 DefaultTemplate.xaml流程圖,超複雜的。
Tip:
Build是可以設定那些專案要執行的,可以新增一個方案檔(.sln),只加入需要Build的專案,或只載入部分專案檔(.*proj),加快Build速度,也可以封閉簽入時只Build較少的專案,定期Build時在執行全部的專案。
圖2-8 方案檔或專案檔設定
9.記錄保存設定
圖2-9 記錄保存設定
10.好,存檔,太棒了,現在所有人簽入都要先Build了。
3、簽入
封閉簽入與一般簽入操作上沒有大不同,只是多了一些步驟,如
- 先簽入Shelveset
- Build失敗,會保留Shelveset
- Build成功,會刪除Shelveset,並通知你去CheckOut最新的版本
下圖是簡略的流程
圖3-1 簡略封閉簽入流程
1.跟一般簽入一樣,可以從暫止的變更簽入,或方案總管上按右鍵簽入等方式簽入。
圖3-2 封閉簽入與一般簽入方式一樣
2.簽入時會詢問是否要執行封閉簽入
圖3-2 詢問視窗
3.確定後會開啟 視窗可以知道執行的結果。
圖3-4 Build Explorer
Tip:
Build Explorer可以從 Temp Explorer>Team Project>Builds>Build Definition>右鍵(或雙擊)>View Builds開啟,可以看每一個執行的Log。
圖3-5 開始Build Explorer
當發生Build失敗,看Log可以快速找到問題。
圖3-6 Build Log
Build Log是一個文字檔,放在
{設定的資料夾}\N{Agent的ID}\Source\{SolutionName}.Log 最近一次Builds的Log
{設定的資料夾}\{BuildName}\{BuildName}_yyyyMMdd.No\logs\{SolutionName}.Log 保留的Log
4.成功後會詢問你是要更新,這個動作請按 Reconcile,因為你的工作還不知道你已經簽入了,要把簽入的檔案改成unchanged,如果沒執行Reconcile會怎樣?不會怎麼樣,只是因為你的工作區版本比較舊,可能需要先簽出才能簽入。
圖3-7 封閉簽入完成
5.失敗後會詢問你是要簽出Shelevset,這個通常都是不用理他,因為本地端的Code通常就等於Shelveset(沒有亂改的話),何必多此一舉簽出呢。
圖3-8 封閉簽入失敗
4、問題
Q1.簽入時會不會很久,會不會停住等到簽入完成後才能繼續作業?
不會,簽入時只要將變動的程式碼上傳後,後續的Build與測試都是在別的電腦上執行,不會影嚮你的工作,你還是可以繼續在Visual Studio上寫Code,不過因為簽入後會需要執行Reconcile,你按下簽入後修改的檔案可能會發生衝突,需要去解決衝突,有點小麻煩。
Q2 .一個簽入還沒跑完,又在簽入會怎麼樣?
Controller會檢查現在有沒有空閒的Agent,如果有就馬上執行,沒有就會加入堆壘中,等到空閒時執行。
圖4-2 同時簽入的情況
Note:
其實我很好奇如果我有二個Agent,同時簽入,但新版本的先執行完成並簽入,舊版的才執行完成並簽入,會不會蓋掉新版本,可惜試了好幾遍都沒有新的前執行完成的情況,不過現實中應該是不會出現這種情況才對。
Q3.如果執行封閉簽入而Build失敗會怎麼樣?
不會,簽入失敗的Code都會保留在Shelveset,也是存放在Server上,也可以在別台電腦上簽出Shelveset。
圖4-3 簽入失敗的Shelveset