2011-12-13 23 views
2

我試圖在TFS2010上實現一次編譯策略,我需要一些關於如何執行此操作的輸入。在CI上,我想編譯所有東西(例如調試版本和發行版本)並運行unittest。在下一個構建定義中,我想要在CI中編譯的相同二進制文件上運行集成測試。構建管道可能看起來像下面TFS2010並編譯一次策略

籤 - >第1步CI:編譯單元測試+ - >第2步每晚:集成測試 - >第3步發佈:配置和包裝

我不知道,如果它可以從放置位置獲取來自另一個團隊構建的最後一次成功構建。這將解決我的問題,在步驟2,當我需要從步驟1獲取預編譯的二進制文件。

任何關於從另一個構建def獲取最後一個成功構建的一般輸入或建議?

+0

僅供參考,如果基於配置的構建之間存在顯着差異,則此類事情將不起作用。例如,使用web.config轉換Web應用程序,您希望構建不同的配置,因爲它們會產生不同的配置設置。 –

+0

另外,你的CI構建和你的發佈版本之間是否真的有一對一的映射?通常,「n」CI構建最終會生成「m」版本,用於產生「1」版本的QA。 –

+0

因爲這個原因,我們不使用web.config轉換。配置在打包應用程序或安裝時發生。關於管道的想法,它當然不是1-1映射。我試圖實現的是,我測試的dev,devtest,qa等二進制文件也是使用或發送給用戶的二進制文件。這樣,我可以自信地說,發行包和這些確切的二進制文件都是睾丸。由於TFS的性質,大多數使用的範例似乎是在構建管道的每個步驟/階段進行編譯。 – jaspernygaard

回答

0

可以說是第2步每晚不是構建定義,它是一個控制檯應用程序:

  1. 獲取最新的接連的建立
  2. 抓鬥此版本的二進制文件從生成放置位置
  3. 根據他們是否成功執行測試&,執行某些操作(如發送電子郵件或在源代碼管理中應用標籤)。

這些動作也可以在一個高度定製生成過程模板,其中相同CreateWorkspace和運行的MSBuild主要構建步驟砍掉&上述邏輯是由手工實現製造。

在你的地方,我會去使用TFS-SDK的C#控制檯應用程序,上面的&是否計劃每天進行一次。


編輯
考慮您的意見考慮在內,我不明白爲什麼我的建議是從您的構建流水線帶你走。
在任何情況下,Step2的心臟(至少在我的理解中)是檢索先前成功構建的放置位置,然後對位於那裏的二進制文件執行一些操作。

這檢索可能類似於以下內容:

using System; 
using Microsoft.TeamFoundation.Build.Client; 
using Microsoft.TeamFoundation.Client; 

namespace GetDropLocationOfLastGoodBuild 
{ 
    class Program 
    { 
     static void Main() 
     { 
      TfsTeamProjectCollection tpc = 
       TfsTeamProjectCollectionFactory.GetTeamProjectCollection(
        new Uri("TFSURI")); 

      IBuildServer buildService = (IBuildServer) tpc.GetService(typeof (IBuildServer)); 
      IBuildDefinition buildDefinition = buildService.GetBuildDefinition("TeamProject", "BuildDefinitionName"); 
      Uri buildUri = buildDefinition.LastGoodBuildUri; 
      IBuildDetail buildDetail = buildService.GetAllBuildDetails(buildUri); 

      String binariesOfLastGoodBuild = buildDetail.DropLocation; 
     } 
    } 
} 

已經檢索到的放置位置,你應該能夠開始你有計劃的任何活動。
您需要的所有細節都在buildDetail

現在,這可以作爲高度自定義構建過程模板的自定義構建活動來運行,也可以作爲單獨的計劃控制檯應用程序運行。
個人我會做後者&將它設置爲Windows任務計劃程序在我的buildserver每天執行一次。

+0

這是我們項目中的一個簡化構建管道,因爲它包含多個步驟。但是我無法理解你爲什麼會從構建中走出這一步。我想創建一個構建管道,其中包含編譯,單元和集成測試,性能測試,負載測試,文檔,配置,打包和部署等步驟,並且希望將其保留在構建服務中。之前我曾與TeamCity合作過,並且有能力使用其他成功構建的「工件」,因此是一條管道。從構建管道中採取某些步驟只是沒有意義imho – jaspernygaard

+0

我明白你的方法,它可以被集成到TFS構建def。你的方法可以用來創建一個自定義的任務,只是爲了獲得最後一次成功的xx構建。我想我希望有一個更「原生」的方法。在使用TFS20xx時,我發現有關編譯一次方法的信息非常少。感謝迄今爲止的輸入! – jaspernygaard

0

一般來說,如果你想提供輸入的生成,有兩種方法:

  • 拷貝正常生成文件夾之外建立1的結果到一個安全的文件夾中。構建2然後將其需要的內容複製回其工作文件夾。

  • 檢查構建1的結果到tfs中,爲將來構建獲取和使用做好準備。

第二個策略是最好的,因爲它意味着你必須爲每個生成二進制輸入歷史版本 - 你可以做歷史的或分支建立並構建系統將使用一切合適的版本。

我想到的問題是:爲什麼要編譯一次?對於CI,您應該瞄準增量構建,以便儘可能快地構建構建。對於夜間測試和發佈構建,您希望從頭開始重建所有內容,而不是依賴增量構建來完美工作(他們永遠不會這樣做 - 最終源代碼和二進制文件會有點不同步,並且構建會產生中斷結果,或者無法完成)。

+0

檢查二進制文件可以工作,但似乎有點過分。我們得到了很多checkins :)。 – jaspernygaard

+0

關於爲什麼我只想建造一次,是爲了確保每個階段都使用相同的垃圾箱,並最終將其封裝/用於生產。這確保了這些準確的二進制文件已經過測試(請注意,不是變更集)並將其投入生產。這是Jez Humble持續交付的原則之一(優秀書!)。 http://jamesbetteley.wordpress.com/2011/08/04/continuous-delivery/ – jaspernygaard