2009-07-24 46 views
14

Tôi có một kịch bản mà tôi muốn gọi một TFS xây dựng từ một khác, người đầu tiên không xây dựng và thứ hai một dàn dựng. Điều này sẽ cho phép tôi thực hiện nhiều phân đoạn tùy chỉnh cho cùng một giải pháp.Làm thế nào để xây dựng chuỗi TFS?

Tôi biết, tôi có thể thực hiện thao tác này với lệnh exec trong phiên bản thứ hai và gọi tfsbuild.exe để xếp hàng một bản dựng từ định nghĩa bản dựng đầu tiên. Nhưng đã tự hỏi nếu ai đó biết một cách tốt hơn?

+1

Chúng tôi chuyển sang CC.NET - mà dễ dàng hỗ trợ loại kịch bản này. – Sneal

+0

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

Trả lời

5

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.

7

Nó phụ thuộc vào những gì bạn đang cố gắng làm.

1) Bạn có muốn tạo + dàn dựng để chạy dưới dạng một thao tác không? Vì vậy, bạn kết thúc với một báo cáo xây dựng hợp nhất, một tệp nhật ký, một công việc trong hàng đợi xây dựng của máy chủ, mỗi bước được thực hiện tuần tự bởi cùng một tác nhân xây dựng đã thực hiện bước trước đó?

Nếu có, thì bạn đang đi đúng về cơ bản. Tôi sẽ không <Exec> ra tfsbuild.exe mặc dù - chạy một xây dựng hoàn toàn mới có rất nhiều chi phí, và tôi không chắc chắn những gì các tác dụng phụ tiềm năng được. Thay vào đó, tôi sẽ sử dụng tác vụ <Call> để thực thi các tác vụ msbuild được xác định trong (các) tập lệnh dàn dựng của bạn.

2) Bạn có muốn "build build" thực sự xếp hàng "staging build" riêng biệt không? Tách các báo cáo, tệp nhật ký, & các vị trí trong hàng đợi? Cơ hội được thực hiện song song nếu bạn có nhiều Đại lý xây dựng?

Nếu vậy, thì:

  • tạo ra một định nghĩa mới xây dựng (s) cho dàn
  • thêm một số mã để xây dựng định nghĩa ban đầu của bạn mà hàng đợi [một/nhiều] các định nghĩa xây dựng mới sử dụng API Team Build. Sample code.
  • loại bỏ bất cứ điều gì không liên quan đến cốt lõi xây dựng từ việc xây dựng định nghĩa ban đầu
  • đảm bảo mới "dàn" định nghĩa không có bất kỳ trigger tự động (khoảng thời gian, sự kiện checkin, vv)
+0

Tốt nhất là bước 1, nhưng không thể sử dụng tác vụ như bạn đề xuất. Việc xây dựng dàn dựng cần phải được trình điều khiển của xây dựng trong trường hợp này. Nó gọi là xây dựng cốt lõi và sau đó hiện dàn dựng tùy chỉnh của nó. Vấn đề với việc sử dụng tệp tin tfsbuild tối thiểu là, tệp định nghĩa TFSBuild được tạo thông qua giao diện người dùng đặt tất cả thuộc tính đường dẫn dựa trên giải pháp được chọn để xây dựng (như chúng tôi đồng ý, định nghĩa xây dựng dàn dựng không nên xây dựng lại giải pháp) một nỗi đau để có được các đường dẫn được cấu hình để gọi tệp lõi TFSBuild.proj chính xác mà không cần mã hóa chúng. – user22242

+0

Tôi không hiểu vấn đề. Tại sao không lưu trữ các tập lệnh dàn dựng của bạn trong cùng thư mục với các tập lệnh xây dựng của bạn? Trên thực tế, ngay cả điều đó cũng không cần thiết - chỉ cần đảm bảo các đường dẫn tương đối vẫn giữ nguyên. ///// Nếu điều đó không hữu ích, vui lòng cung cấp thêm thông tin chi tiết về những gì bạn đang cố gắng thực hiện. Những điều chính xác bạn mong đợi xảy ra trong "xây dựng đầu tiên" và "xây dựng thứ hai là gì?" Họ có điểm gì chung và những gì cần phải được tùy chỉnh? –

+0

BTW, tùy thuộc vào những gì bạn đang cố gắng làm, Team Build có thể không phải là cách tiếp cận đúng. Ví dụ, môi trường thử nghiệm của tôi được thiết lập trên một mô hình "kéo" thay vì "đẩy". Mỗi máy đăng ký vào hệ thống thông báo TFS. Khi một sự kiện BuildCompletion được nâng lên, một dịch vụ trên máy sẽ kiểm tra các tiêu chí khác nhau được cấu hình cho hộp đó và tái tạo một môi trường thử nghiệm khi thích hợp. –

0

Are bạn đang cố triển khai giải pháp cho môi trường dàn dựng của mình? Nếu vậy một phương pháp tốt nhất là sử dụng TFSDeployer từ CodePlex mà sẽ chạy một kịch bản khác nhau PowerShell dựa trên việc xây dựng chất lượng mà bạn chọn ...

+1

Tôi có thể làm điều đó trong CC thay vì đối phó với đường cong học tập cho TFSDeployer cho một nhiệm vụ khá đơn giản như thế này. Tại sao việc khó làm điều gì đó đơn giản như vậy trong TFS là bạn cần phải dựa vào các công cụ khác? Tôi ngạc nhiên không nhiều người thậm chí còn nói về chuỗi TFS bị xây dựng – user22242

+2

Xây dựng xích sẽ làm giảm số phiên bản của tôi. Tôi sử dụng một bản xây dựng duy nhất để xây dựng tất cả các "hiện vật" và sau đó tôi cần triển khai nó cho DEV sau đó System Test rồi QA sau đó là Beta và cuối cùng là Live. Điều này được thực hiện vì vậy có một cách tuyệt đối không có tính khả thi của một công trình bị ô nhiễm (kiểm tra của nhà phát triển). Nếu có sự cố thì chúng tôi sẽ quay lại DEV. Điều này được thực hiện trên tất cả các chi nhánh tính năng cho đến khi nó được thông qua QA/UAT trước khi được sáp nhập vào chính và các chi nhánh cho một bản phát hành. :) –

1

Dưới đây là các liên kết hữu ích khác. Nó có thể giúp đỡ người khác.

Tạo Định nghĩa bản dựng khác và gọi các định nghĩa xây dựng khác sẽ được kích hoạt.

http://blogs.objectsharp.com/post/2012/02/04/Create-a-Master-Build-that-calls-other-Builds.aspx

http://blog.stangroome.com/2011/09/06/queue-another-team-build-when-one-team-build-succeeds/

Passing Arguments để trẻ xây dựng.

http://blog.stangroome.com/2014/02/19/queue-a-team-build-from-another-and-pass-parameters/

TFS Xây dựng mở rộng để xếp các file khác xây dựng nét

http://tfsbuildextensions.codeplex.com/

Các vấn đề liên quan