TFS2010构建定义以部署到多个服务器?

Ark*_*nam 9 deployment msbuild msdeploy tfs2010 build-definition

我一直在研究TFS2010与MSDeploy的新构建和部署功能.到目前为止一切进展顺利(虽然很难找到有关特定场景的信息).

我可以修改构建定义以指定要部署的2个或更多服务器吗?我需要做的是部署到多个服务器(因为我在我的测试环境中有两个使用NLB).

我现在拥有的是构建定义,构建,运行我的测试,然后部署到我的一个测试服务器(其上运行了MsDeployAgentService).它工作正常,每个Web项目都按其项目文件中的配置进行部署.我使用的MSBuild参数是:

* /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 
Run Code Online (Sandbox Code Playgroud)

注意:我不使用/ p:DeployIISAppPath ="xyz",因为它没有部署我的所有项目并覆盖我的项目配置.

我可以添加另一个构建参数来让它调用多个MSDeployServiceURL吗?就像第二个/ p:MSDeployServiceURL参数,它指定另一个服务器?

或者我是否需要寻找其他解决方案,例如编辑WF?

我在2个月前看到了一个几乎完全相同的问题:TFS 2010 - 构建后部署到多个服务器,所以看起来我不是唯一一个试图解决这个问题的人.

我还发布了讨论MSDeploy的IIS.NET论坛:http://forums.iis.net/t/1170741.aspx .它有很多观点,但同样没有答案.

37S*_*ars 7

您不必两次构建项目以部署到两个服务器.构建过程将构建一组部署文件.然后,您可以使用InvokeProcess部署到多个服务器.

首先创建一个名为ProjectName的变量.然后将"分配"活动添加到"编译项目"序列.它位于"尝试编译项目"序列中.以下是Assign的属性:

To: ProjectName
Value: System.IO.Path.GetFileNameWithoutExtension(localProject)
Run Code Online (Sandbox Code Playgroud)

以下是部署到测试服务器的InvokeProcess活动的属性:

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.
Run Code Online (Sandbox Code Playgroud)

如果需要手动部署到服务器,可以从build文件夹运行以下命令:

deploy.cmd /y /M:<server> /u:<domain>\<user> /p:<password>
Run Code Online (Sandbox Code Playgroud)


Ark*_*nam 6

我找不到我想要的解决方案,但这就是我最终想出来的.

我希望在TFS参数中保持解决方案的简单性和可配置性,同时保持与已经提供的MSBuildArguments已经提升的方法一致.所以我创建了一个新的Build Template,并MSBuildArguments2在WorkFlow 的Arguments选项卡中添加了一个新的TFS WorkFlow Argument .

替代文字

我通过BuildTemplate WorkFlow搜索了所有出现的事件MSBuildArguments(有两次出现).

使用的两个任务MSBuildArguments被调用Run MSBuild for Project.在这个任务的正下方,我添加了一个新的"If"块,条件如下:

Not String.IsNullOrEmpty(MSBuildArguments2)
Run Code Online (Sandbox Code Playgroud)

然后我复制了"运行MSBuild for Project"任务并将其粘贴到新的If的"Then"块中,相应地更新其标题.您还需要更新新任务的ConmmandLineArguments属性以使用新的Argument.

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

经过这些修改后,WorkFlow看起来像这样:

替代文字

保存并检查新的WorkFlow.更新您的构建定义以使用这个新的WorkFlow,然后在构建定义的Process选项卡中,您将找到一个名为Misc的新部分,其中准备使用新参数.因为我只是使用这个新参数进行部署,所以我复制了我用过的完全相同的参数,MSBuild Arguments并将MSDeployServiceURL更新到我的第二个部署服务器.

替代文字

就是这样.我想更优雅的方法是将MSBuildArguments转换为字符串数组,然后在WorkFlow过程中循环遍历它们.但这符合我们的2服务器要求.

希望这可以帮助!