Dưới đây là cách tôi thực hiện điều này (http://sajojacob.com/2009/08/how-to-chain-tfs-builds/)
Làm thế nào để Chain TFS Xây dựng? Đăng ngày 5 tháng 8 năm 2009 bởi Sajo - No Comments ↓
Một trong những đồng nghiệp của tôi @gdurzi gần đây đã hỏi tôi câu hỏi này. Âm thanh đơn giản, đủ để được hỗ trợ ra khỏi hộp với TFS phải không? Quá nhiều quirks với điều này. Và tôi khuyên bạn nên sử dụng tác vụ MSBuild trung thành bao giờ để thực hiện cuộc gọi tới TFSBuild.exe để xếp hàng một bản dựng mới từ TFSBuild.proj đầu tiên với cái gì đó như thế này
TFSBuild.exe start/queue% TFSSVR%% TEAMPROJECT%% BUILDTYPE %
Một vấn đề với việc sử dụng TFSBuild.exe là bạn không thể vượt qua các tác nhân xây dựng như một đối số dòng lệnh, đó là một bộ ngắt giao dịch cho chúng tôi.
Có một số phương pháp bạn có thể thực hiện dựa trên kịch bản cụ thể của bạn, hãy định nghĩa kịch bản ở đây, bạn có định nghĩa xây dựng Main_Build TFS xây dựng dự án cốt lõi của bạn và bạn muốn có nhiều bản dựng chạy cùng Main_Build để biên soạn/xây dựng, nhưng được dàn dựng tùy chỉnh để triển khai dựa trên người gọi Main_Build. Rất hữu ích khi bạn có một sản phẩm được triển khai cho nhiều khách hàng với nhu cầu về các hành động dựng sẵn và xây dựng sau tùy chỉnh cho mỗi khách hàng. Vì vậy, đây là một cách để xây dựng chuỗi kết nối với TFS 2008.
Bước 1: Hãy tạo một tác vụ MSBuild tùy chỉnh bằng mô hình đối tượng Team Foundation xếp hàng xây dựng bằng cách sử dụng tác nhân xây dựng mặc định liên kết với tệp Định nghĩa xây dựng.
Mẫu mã cho Queuing: QueueTFS.cs
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Build.Client;
// Get the team foundation server.
TeamFoundationServer _tfsServer = TeamFoundationServerFactory.GetServer(_tfs);
// Get the IBuildServer
IBuildServer buildServer = (IBuildServer)_tfsServer.GetService(typeof(IBuildServer));
// Get the build definition for which a build is to be queued.
IBuildDefinition definition = buildServer.GetBuildDefinition(teamProject, buildDefinition);
// Create a build request for the build definition.
IBuildRequest request = definition.CreateBuildRequest();
request.CommandLineArguments = "Pass any custom command line args here"; // Ex: Custom Targets file
// Queue the build.
buildServer.QueueBuild(request, QueueOptions.None);
Bước 2: Bây giờ sao chép QueueTFS.dll vào một thư mục mới trong TFS nơi bạn muốn tạo dàn tập tin định nghĩa xây dựng.
Bây giờ, hãy tạo tệp TFSBuild.proj tối thiểu sử dụng tác vụ MSBuild mới của chúng tôi và ghi đè mục tiêu EndToEndIteration. Đây sẽ là định nghĩa xây dựng dàn dựng của chúng tôi sẽ kích hoạt bản dựng Main_Build. Lưu ý rằng bạn sẽ phải tạo TFSBuild.proj này bằng tay và chỉ cần trỏ vị trí tệp dự án từ giao diện người dùng định nghĩa xây dựng vào thư mục mới.
Mẫu mã cho một TFSBuild.proj tối thiểu:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" />
<UsingTask TaskName="MyNewCustomTFSTask" AssemblyFile="QueueTFS.dll"/>
<Target Name="EndToEndIteration">
<Message Text="About to trigger main build" Importance="high"/>
< MyNewCustomTFSTask TFS="http://TFSServer.com:8080/" TeamProject="TeamProject" BuildDefinition="Main_Build" TargetsFile="Custom.Target" XYZ="XYZ" />
<!-- When everything is done, change the status of the task to "Succeeded" -->
<SetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" TestStatus="Succeeded" CompilationStatus="Succeeded"/>
</Target>
</Project>
Bước 3: Chỉnh sửa tập tin Main_Build TFSBuild.proj của bạn với pre-build và các cuộc gọi mục tiêu sau xây dựng.
<Target Name=“BeforeCompile“>
<CallTarget Targets=“Custom_PreBuild“/>
</Target>
<Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>
<CallTarget Targets=“Custom_PostBuild“/>
</Target>
Chúng tôi muốn khả năng chạy Main_Build bởi chính nó là tốt, để hỗ trợ này, chúng tôi thêm hàng nhập khẩu có điều kiện trong Main_Build TFSBuild.proj của chúng tôi để nhập mặc định tập tin mục tiêu với mục tiêu Custom_PreBuild và Custom_PostBuild trống. $ (CustomTarget) là những gì bạn sẽ vượt qua như một đối số dòng lệnh trong Bước 1 cho request.CommandLineArguments
<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/>
<!--Import CustomContoso.Target if no partner is passed in—>
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/>
Bước 4: Bây giờ tạo ra mục tiêu của bạn nộp Custom.Target và EmptyCustom.Target với mục tiêu Custom_PreBuild và Custom_PostBuild và bạn đã xong.
Tôi đã thêm hỗ trợ để cập nhật các bước xây dựng và một số thứ nhỏ khác nằm ngoài phạm vi của bài đăng trên blog này, nhưng điều này hy vọng sẽ giúp bạn bắt đầu.
Chúng tôi chuyển sang CC.NET - mà dễ dàng hỗ trợ loại kịch bản này. – Sneal
Tôi đã làm điều này nhiều lần với CC.NET, phải có một cách gọn gàng để làm tương tự với TFS, tôi giả sử! – user22242