2010-08-19 26 views
9

Tôi đã xem xét các tính năng xây dựng và triển khai mới của TFS2010 với MSDeploy. Cho đến nay mọi thứ đang diễn ra tốt đẹp (mặc dù khó có thể tìm thấy thông tin về các tình huống cụ thể).TFS2010 Xây dựng định nghĩa để triển khai cho nhiều máy chủ?

Tôi có thể sửa đổi Định nghĩa xây dựng của mình để chỉ định 2 hoặc nhiều máy chủ để triển khai không? Những gì tôi cần làm là triển khai cho nhiều máy chủ (vì tôi có hai trong môi trường thử nghiệm của mình sử dụng NLB).

Những gì tôi có bây giờ là một định nghĩa xây dựng mà xây dựng, chạy thử nghiệm của tôi, và sau đó triển khai để ONE của máy chủ thử nghiệm của tôi (trong đó có MsDeployAgentService chạy trên nó). Nó hoạt động tốt và mỗi dự án web được triển khai như được cấu hình trong tệp dự án của nó. Các luận cứ MSBuild tôi sử dụng là:

* /p:DeployOnBuild=True 
* /p:DeployTarget=MsDeployPublish 
* /p:MSDeployServiceURL=http://oawww.testserver1.com.au/MsDeployAgentService 
* /p:CreatePackageOnPublish=True 
* /p:MsDeployPublishMethod=RemoteAgent 
* /p:AllowUntrustedCertificated=True 
* /p:UserName=myusername 
* /p:Password=mypassword 

NB: Tôi không sử dụng/p: DeployIISAppPath = "xyz" như nó không triển khai các dự án của tôi và ghi đè cấu hình dự án của tôi.

Tôi có thể thêm một đối số xây dựng khác để làm cho nó gọi nhiều hơn một MSDeployServiceURL không? Giống như một cái gì đó giống như một đối số thứ hai/p: MSDeployServiceURL chỉ định một máy chủ khác?

Hoặc tôi có phải tìm giải pháp khác, chẳng hạn như chỉnh sửa WF không?

Tôi đã thấy một câu hỏi gần giống y hệt ở đây được đăng cách đây 2 tháng: TFS 2010 - Deploy to Multiple Servers After Build, vì vậy, có vẻ như tôi là người duy nhất đang cố gắng giải quyết vấn đề này.

Tôi cũng đã đăng trên diễn đàn IIS.NET nơi MSDeploy được thảo luận: http://forums.iis.net/t/1170741.aspx. Nó có khá nhiều lượt xem, nhưng một lần nữa, không có câu trả lời.

Trả lời

7

Bạn không phải xây dựng dự án hai lần để triển khai cho hai máy chủ. Quá trình xây dựng sẽ xây dựng một tập các tệp triển khai. Sau đó, bạn có thể sử dụng InvokeProcess để triển khai cho nhiều máy chủ.

Trước tiên hãy tạo biến có tên là ProjectName. Sau đó, thêm hoạt động Chỉ định vào chuỗi "Biên dịch dự án". Điều này nằm trong chuỗi "Thử biên dịch dự án". Dưới đây là các thuộc tính của Assign:

To: ProjectName 
Value: System.IO.Path.GetFileNameWithoutExtension(localProject) 

Dưới đây là các tính chất của hoạt động InvokeProcess của chúng tôi triển khai tới các máy chủ thử nghiệm:

Arguments: "/y /M:<server> /u:<domain>\<user> /p:<password>" 
FileName: String.Format("{0}\{1}.deploy.cmd", BuildDetail.DropLocation, ProjectName) 

You will need to change <server>, <domain>, <user>, and <password> to the values that reflect your environment. 

Nếu bạn cần phải tự triển khai đến một máy chủ bạn có thể chạy lệnh bên dưới từ thư mục xây dựng của bạn:

deploy.cmd /y /M:<server> /u:<domain>\<user> /p:<password> 
+0

Điều này giống như điều đúng đắn cần làm nếu tôi có cơ hội thực hiện lại việc triển khai của mình. Nó chỉ là một điều đáng tiếc là nó không đi ra khỏi hộp với một cái gì đó như thế này. Cảm ơn! – Arkiliknam

+0

Tôi đã cập nhật quy trình của mình để chúng được tham số hóa. Đối với các đối số MSBuild bạn cũng có thể chỉ định Đường dẫn ứng dụng IIS. Điều này cũng có thể được tham số hóa nếu bạn cần triển khai nhiều phiên bản cho cùng một máy chủ. – 37Stars

0

Tôi là tác giả của bài đăng tương tự khác. Tôi vẫn chưa tìm được giải pháp. Tôi tin rằng nó sẽ sửa đổi quy trình làm việc để thêm một nhiệm vụ MSBUILD-sync sau xử lý. Điều đó có vẻ là thanh lịch nhất, nhưng vẫn hy vọng tìm được thứ gì đó ít xâm phạm hơn một chút.

+0

Tôi sẽ đi xuống con đường đó. Có một mục blog ở đây: http://blogs.blackmarble.co.uk/blogs/rfennell/archive/2010/08/13/running-msdeploy-to-a-remote-box-from-inside-a-tfs- 2010-build-part-2.aspx bao gồm cách thực hiện điều đó. Nhưng cuối cùng tôi đã thêm một cuộc gọi thứ hai để MSBUILD và tái sử dụng các ý tưởng Arguments họ cung cấp cho chúng tôi (như chi tiết trong câu trả lời của tôi). – Arkiliknam

6

Tôi không thể tìm thấy giải pháp mà tôi đang tìm kiếm, nhưng dưới đây là những gì tôi nghĩ ra.

Tôi muốn giữ cho giải pháp đơn giản và có thể định cấu hình trong các đối số TFS trong khi đồng thời vẫn phù hợp với phương thức đã được cung cấp MSBuildArguments đã được quảng cáo rất nhiều. Vì vậy, tôi đã tạo một Mẫu xây dựng mới và thêm đối số TFS WorkFlow mới được gọi là MSBuildArguments2 trong tab Đối số của WorkFlow.

alt text

Tôi đã tìm kiếm thông qua các BuildTemplate workflow cho tất cả các lần xuất hiện của các MSBuildArguments (có hai lần xuất hiện).

Hai tác vụ sử dụng MSBuildArguments được gọi là Run MSBuild for Project. Ngay dưới nhiệm vụ này, tôi đã thêm một mới "If" khối với điều kiện:

Not String.IsNullOrEmpty(MSBuildArguments2) 

tôi sau đó sao chép "Run MSBuild cho Dự án" Nhiệm vụ và dán nó vào "Then" khối các Nếu mới, cập nhật tiêu đề của nó cho phù hợp. Bạn cũng sẽ cần cập nhật thuộc tính ConmmandLineArguments của Nhiệm vụ mới để sử dụng đối số mới của bạn.

CommandLineArguments = String.Format("/p:SkipInvalidConfigurations=true {0}", MSBuildArguments2)

Sau những sửa đổi, các quy trình làm việc như sau:

alt text

Lưu và Kiểm tra trong công việc mới. Cập nhật Build Definition của bạn để sử dụng WorkFlow mới này, sau đó trong tab Process của quá trình xây dựng, bạn sẽ tìm thấy một phần mới gọi là Misc với đối số mới sẵn sàng để được sử dụng. Bởi vì tôi chỉ đơn giản sử dụng đối số mới này để triển khai, tôi đã sao chép chính xác cùng một đối số mà tôi đã sử dụng cho MSBuild Arguments và cập nhật MSDeployServiceURL thành máy chủ triển khai thứ hai của mình.

alt text

Và đó là điều đó. Tôi cho rằng một phương thức thanh lịch hơn sẽ là chuyển đổi MSBuildArguments thành một chuỗi các chuỗi và sau đó lặp lại chúng trong quá trình WorkFlow. Nhưng điều này phù hợp với yêu cầu 2 máy chủ của chúng tôi.

Hy vọng điều này sẽ hữu ích!

2

Giải pháp của tôi cho đây là Mục tiêu mới chạy sau Gói. Mỗi dự án cần tạo ra một gói bao gồm tệp đích này và tôi đã chọn làm cho Bao gồm có điều kiện trên thuộc tính "DoDeployment" được đặt bên ngoài. Ngoài ra, mỗi dự án định nghĩa thuộc tính DeploymentServerGroup để các máy chủ đích (s) được lọc đúng tùy thuộc vào loại dự án của nó.

Như bạn có thể thấy ở phía dưới, tôi chỉ cần thực thi tệp lệnh với danh sách máy chủ, khá đơn giản.

<!-- 
This targets file allows a project to deploy its package 

As it is used by all project typesconditionally included from the project file 

->

<UsingTask TaskName="Microsoft.TeamFoundation.Build.Tasks.BuildStep" AssemblyFile="$(TeamBuildRefPath)\Microsoft.TeamFoundation.Build.ProcessComponents.dll" /> 

<!-- Each Server needs the Group metadatum, either Webservers, Appservers, or Batch. --> 
<Choose> 
    <When Condition="'$(Configuration)' == 'DEV'"> 
     <ItemGroup> 
      <Servers Include="DevWebServer"> 
       <Group>Webservers</Group> 
      </Servers> 
      <Servers Include="DevAppServer"> 
       <Group>Appservers</Group> 
      </Servers> 
     </ItemGroup> 
    </When> 
    <When Condition="'$(Configuration)' == 'QA'"> 
     <ItemGroup> 
      <Servers Include="QAWebServer1"> 
       <Group>Webservers</Group> 
      </Servers> 
      <Servers Include="QAWebServer2"> 
       <Group>Webservers</Group> 
      </Servers> 
      <Servers Include="QAAppServer1"> 
       <Group>Appservers</Group> 
      </Servers> 
      <Servers Include="QAAppServer2"> 
       <Group>Appservers</Group> 
      </Servers> 
     </ItemGroup> 
    </When> 
</Choose> 

<!-- DoDeploy can be set in the build defintion --> 
<Target Name="StartDeployment" AfterTargets="Package"> 

    <PropertyGroup> 
     <!-- The _PublishedWebsites area --> 
     <PackageLocation>$(WebProjectOutputDir)_Package</PackageLocation> 

     <!-- Override for local testing --> 
     <PackageLocation Condition="$(WebProjectOutputDirInsideProject)">$(IntermediateOutputPath)Package\</PackageLocation> 

    </PropertyGroup> 

    <Message Text="Tier servers are @(Servers)" /> 

    <!-- A filtered list of the servers. DeploymentServerGroup is defined in each project that does deployment --> 
    <ItemGroup> 
     <DestinationServers Include="@(Servers)" Condition="'%(Servers.Group)' == '$(DeploymentServerGroup)'" /> 
    </ItemGroup> 

    <Message Text="Dest servers are @(DestinationServers)" /> 

</Target> 

<!-- Only perform the deployment if any servers fit the filters --> 
<Target Name="PerformDeployment" AfterTargets="StartDeployment" Condition="'@(DestinationServers)' != ''"> 

    <Message Text="Deploying $(AssemblyName) to @(DestinationServers)" /> 

    <!-- Fancy build steps so that they better appear in the build explorer --> 
    <BuildStep 
        TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
        BuildUri="$(BuildUri)" 
        Message="Deploying $(AssemblyName) to @(DestinationServers)..."> 
     <Output TaskParameter="Id" PropertyName="StepId" /> 
    </BuildStep> 

    <!-- The deployment command will be run for each item in the DestinationServers collection. --> 
    <Exec Command="$(AssemblyName).deploy.cmd /Y /M:%(DestinationServers.Identity)" WorkingDirectory="$(PackageLocation)" /> 

    <BuildStep 
        TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
        BuildUri="$(BuildUri)" 
        Id="$(StepId)" 
        Status="Succeeded" 
        Message="Deployed $(AssemblyName) to @(DestinationServers)"/> 
    <OnError ExecuteTargets="MarkDeployStepAsFailed" /> 
</Target> 

<Target Name="MarkDeployStepAsFailed"> 
    <BuildStep 
      TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
      BuildUri="$(BuildUri)" 
      Id="$(StepId)" 
      Status="Failed" /> 
</Target> 

+0

Thú vị ... vì vậy bạn đang lấy công việc ra khỏi quy trình làm việc TFS và đưa nó trở lại vào một kịch bản MSBUILD. Mọi dự án trong giải pháp của bạn có gọi mục tiêu này sau khi xây dựng không? Và ở đây tôi nghĩ MSBUILD đã chết và chôn cất :) – Arkiliknam

+0

Một khi tôi đã tốt hơn khi viết các tập tin MSBuild, tôi bắt đầu thích chúng hơn bằng cách sử dụng trình thiết kế WorkFlow clunky và dễ bị hỏng. Mỗi dự án cần triển khai gói của nó bao gồm tệp mục tiêu này từ csproj của nó, và lời gọi đích là tự động khi nó được thực hiện sau mục tiêu Gói. –

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