TFS 2010 封閉簽入(Gated Check-in),拒絕Build失敗的程式碼簽入

  • 27447
  • 0
  • TFS
  • 2010-08-21

封閉簽入是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成功過的記錄,所以我還是可以簽入。

image

圖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

IC289948

圖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。

image

圖2-1 新增Build定義

 

4.輸入定義名稱

image

圖2-2 Build名稱設定

 

5.設定觸發方式,選擇Gated Check-in選項。

image

圖2-3 觸發方式設定

 

Tip:

第2-4個選項是簽入相關設定,而第5個選項是Daily Build的設定,有興趣可以玩玩。

6.設定從Source Control的那一個路徑下載原始檔。

image

圖2-4 工作區設定

 

7.設定Controller與檔案存放地

image

圖2-5 Controller設定

 

8.設定Build流程與Build設定與自動化測試的設定

image

圖2-6 簽入流程設定。

image

圖2-7 DefaultTemplate.xaml流程圖,超複雜的。

Tip:

Build是可以設定那些專案要執行的,可以新增一個方案檔(.sln),只加入需要Build的專案,或只載入部分專案檔(.*proj),加快Build速度,也可以封閉簽入時只Build較少的專案,定期Build時在執行全部的專案。

image

圖2-8 方案檔或專案檔設定

 

9.記錄保存設定

image

圖2-9 記錄保存設定

 

10.好,存檔,太棒了,現在所有人簽入都要先Build了。

 

3、簽入

封閉簽入與一般簽入操作上沒有大不同,只是多了一些步驟,如

  • 先簽入Shelveset
  • Build失敗,會保留Shelveset
  • Build成功,會刪除Shelveset,並通知你去CheckOut最新的版本

下圖是簡略的流程

 Gated check-in 

圖3-1 簡略封閉簽入流程

 

1.跟一般簽入一樣,可以從暫止的變更簽入,或方案總管上按右鍵簽入等方式簽入。

image

圖3-2 封閉簽入與一般簽入方式一樣

 

2.簽入時會詢問是否要執行封閉簽入

image

圖3-2 詢問視窗

 

3.確定後會開啟 視窗可以知道執行的結果。

image

圖3-4 Build Explorer

Tip:

Build Explorer可以從 Temp Explorer>Team Project>Builds>Build Definition>右鍵(或雙擊)>View Builds開啟,可以看每一個執行的Log。

image

圖3-5 開始Build Explorer

 

當發生Build失敗,看Log可以快速找到問題。

image

圖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會怎樣?不會怎麼樣,只是因為你的工作區版本比較舊,可能需要先簽出才能簽入。

image

圖3-7 封閉簽入完成

 

5.失敗後會詢問你是要簽出Shelevset,這個通常都是不用理他,因為本地端的Code通常就等於Shelveset(沒有亂改的話),何必多此一舉簽出呢。

image

圖3-8 封閉簽入失敗

 

4、問題

Q1.簽入時會不會很久,會不會停住等到簽入完成後才能繼續作業?

不會,簽入時只要將變動的程式碼上傳後,後續的Build與測試都是在別的電腦上執行,不會影嚮你的工作,你還是可以繼續在Visual Studio上寫Code,不過因為簽入後會需要執行Reconcile,你按下簽入後修改的檔案可能會發生衝突,需要去解決衝突,有點小麻煩。

 

Q2 .一個簽入還沒跑完,又在簽入會怎麼樣?

Controller會檢查現在有沒有空閒的Agent,如果有就馬上執行,沒有就會加入堆壘中,等到空閒時執行。 

image

圖4-2 同時簽入的情況

Note:

其實我很好奇如果我有二個Agent,同時簽入,但新版本的先執行完成並簽入,舊版的才執行完成並簽入,會不會蓋掉新版本,可惜試了好幾遍都沒有新的前執行完成的情況,不過現實中應該是不會出現這種情況才對。

 

Q3.如果執行封閉簽入而Build失敗會怎麼樣?

不會,簽入失敗的Code都會保留在Shelveset,也是存放在Server上,也可以在別台電腦上簽出Shelveset。

image

圖4-3 簽入失敗的Shelveset