如何使用Team Build部署ASP.NET Web应用程序?

4
我已成功安装了团队基础架构服务器2008,并创建了一个单独的构建服务器(它可以工作,因为我的构建目前失败了)。
我创建了一个简单的“Hello World”Web应用程序(所有内容都是标准的Default.aspx页面),并将其放在TFS的源代码控制系统中。
之前,在使用TFS之前,我只需对Web应用程序进行预编译,然后将结果复制到预先创建的IIS虚拟目录中。
在谷歌上搜寻了一段时间,我还没有找到一个正确部署从TFS源通过TeamBuild到指定测试Web服务器的应用程序的逐步指南。我知道MS Build也包括在此方程式中,因此任何指导都将是有帮助的。
我已看到一些关于部署的片段,提到了如_PublishedWebSites等文件夹,但尚未找到任何逐步指南。
3个回答

4
首先,您应该使用WebDeployment项目,因为它将对您的代码和标记进行更多编译和检查。有关更多信息,请参见此处
我设置了4个环境:DV [开发]、PY [原型]、PP [预生产]、PD [生产],每个环境都与TFS中的相应分支匹配。每个环境在sln配置管理器中也都有一个条目,您可以在其中设置需要构建的项目和构建标志。
一旦正确设置了这些内容,您就可以开始设置部署脚本了。我喜欢使用MSbuild进行部署,因为它可以提供更加精细的部署方法。MSbuild可能有点奇怪,但是一旦掌握了它,它就非常强大。
下面是我的部署脚本,已添加到TeamBuild配置中。基本上,如您所见,我会在复制到生产服务器之前进行一些后期清理工作。我还使用了两个MSbuild框架(在顶部导入)。
<Import Project="$(MSBuildExtensionsPath)\Microsoft\SDC Tasks - Release 2.1.3155.0\Microsoft.Sdc.Common.tasks"/>
<Import Project="$(MSBuildExtensionsPath)\FreeToDev\MSBuild Tasks Suite 3.5\FreeToDev.MSBuild.tasks"/>

<PropertyGroup>
    <InetpubFolder>\\PathToInetPub</InetpubFolder>
    <AppFolder>AppFolder</AppFolder>
    <AppFolderPath>$(InetpubFolder)$(AppFolder)</AppFolderPath>
    <WebDeployName>WebDeployProjectName</WebDeployName>
    <Debug>0</Debug>
    <AppConfiguration>DV</AppConfiguration>
</PropertyGroup>

<Target Name="AfterDropBuild">
    <Message Text="Begin Release to $(AppConfiguration) Webserver" />
    <Message Text="DropLocation = $(DropLocation)" />
    <CallTarget Targets="PostBuildCleanUp"  />
    <CallTarget Targets="DeployApp"  />
</Target>

<Target Name="DeployApp">

    <GetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)">
        <Output TaskParameter="DropLocation" PropertyName="DropLocation"></Output>
    </GetBuildProperties>

    <PropertyGroup>
        <CodeDropLocation>$(DropLocation)\$(AppConfiguration) Release</CodeDropLocation>
    </PropertyGroup>

    <ItemGroup>
        <AppFilesToDelete Include="$(AppFolderPath)\**\*.*" Exclude="$(AppFolderPath)\Library\*.*;$(AppFolderPath)\App_Offline.htm;$(AppFolderPath)\jobs\**\*.*" />
    </ItemGroup>

    <ItemGroup>
        <FilesToDeploy Include="$(CodeDropLocation)\$(AppFolder)\**\*.*" Exclude="" />
    </ItemGroup>

    <Copy SourceFiles="$(CodeDropLocation)\$(AppFolder)\App_Offline[RemoveToActivate].htm" DestinationFiles="$(AppFolderPath)\App_Offline.htm" OverwriteReadOnlyFiles="true"/>

    <Message Text="Deleting files in $(AppFolderPath)" />
    <Microsoft.Sdc.Tasks.File.DeleteFiles Files="@(AppFilesToDelete)" Force="true" Condition="$(Debug)==0" />

    <Message Text="Copy $(CodeDropLocation)\$(AppFolder) to $(AppFolderPath)" />
    <Copy Condition="$(Debug)==0" SourceFiles="@(FilesToDeploy)" DestinationFiles="@(FilesToDeploy->'$(AppFolderPath)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true"/>

    <Message Text="Deploy to $(AppConfiguration) Completed" />
    <Microsoft.Sdc.Tasks.File.DeleteFiles Files="$(AppFolderPath)\App_Offline.htm" Force="true" />

    <OnError ExecuteTargets="ErrorHandler" />
</Target>

<Target Name="ErrorHandler">
    <Message Text="Error encountered!!" />
</Target>

<Target Name="PostBuildCleanUp">

    <GetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)">
        <Output TaskParameter="DropLocation" PropertyName="DropLocation"></Output>
    </GetBuildProperties>

    <PropertyGroup>
        <CodeDropLocation>$(DropLocation)\$(AppConfiguration) Release</CodeDropLocation>
    </PropertyGroup>

    <ItemGroup>
        <PostBuildCleanUpFilesToDelete Include="$(CodeDropLocation)\*.*;$(CodeDropLocation)\bin\*.xml;$(CodeDropLocation)\bin\*.pdb"/>
    </ItemGroup>

    <RemoveDir Directories="$(CodeDropLocation)\_PublishedWebsites\Web" />
    <Microsoft.Sdc.Tasks.File.DeleteFiles Files="@(PostBuildCleanUpFilesToDelete)" Force="true">
        <Output TaskParameter="DeletedFiles" ItemName="FilesThatWereDeleted" />
    </Microsoft.Sdc.Tasks.File.DeleteFiles>
    <Message Text="The files that were removed were @(FilesThatWereDeleted)" />

    <FTDFolder TaskAction="Move" Path="$(CodeDropLocation)\_PublishedWebsites\$(WebDeployName)" TargetPath="$(CodeDropLocation)\$(AppFolder)"/>

    <RemoveDir Directories="$(CodeDropLocation)\_PublishedWebsites" />

    <RemoveDir Directories="$(CodeDropLocation)\$(AppFolder)\WebDeploy" />

    <OnError ExecuteTargets="ErrorHandler" />
</Target>

显然,您需要根据自己的系统设置进行修改。在开始复制新构建之前,它还会清空目标文件夹。这是为了确保系统干净,但显然您需要将需要保留的任何内容添加到ExcludedFiles列表中。
我在主应用程序项目中为每个环境都创建了一个文件夹。这些文件夹包含web.config替换(WebDeployment项目的另一个功能)和其他特定于环境的文件。
要使其正常工作可能需要进行长时间的过程,但希望这篇文章能让您有所启发!(当然,如果您选择这种方式!)

4
我曾经在TFSBuild.proj文件的AfterDropBuild目标中使用过exec任务,并获得了成功。
<Target Name="AfterDropBuild>
    <Exec Command="xcopy /Y /E &quot;$(DropLocation)\\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)\_PublishedWebsites\MyWebsite1\*.*&quot; &quot;\\server\MyWebsite1\&quot;" />
    <Exec Command="xcopy /Y /E &quot;$(DropLocation)\\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)\_PublishedWebsites\MyWebsite2\*.*&quot; &quot;\\server\MyWebsite2\&quot;" />
</Target>

请注意,必须正确设置权限,以便TFS服务用户可以访问您要复制到的服务器上的文件夹。

我找到了一些其他的资源,概述了你在这里描述的内容,我成功地将一个Web应用程序从我的旧源代码控制系统迁移,使用复制命令创建了一个构建并部署它。 - Ta01

2
这可以通过直接使用构建脚本来完成,Vertigo Software的人通常是许多TFS问题的最佳信息来源...不幸的是,他们的博客文章在谷歌上的排名通常不太高。这篇文章是由Jeff Atwood撰写的,他是这个网站的创始人之一:在团队构建后复制Web文件

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接