繁体   English   中英

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

[英]How can I deploy an ASP.NET web application using Team Build?

我已经成功安装了 Team Foundation Server 2008,并创建了一个单独的构建服务器(因为我的构建当前失败,所以它可以工作)。

我已经创建了一个简单的“Hello World”Web 应用程序(都是标准的 Default.aspx 页面)并将它放在 TFS 的源代码控制系统中。

以前,在 TFS 之前,我只需预编译我的 web 应用程序并将结果复制到预先创建的 IIS 虚拟目录中。

在谷歌上搜索了一段时间,我还没有找到关于通过 TeamBuild 将应用程序从 TFS 源正确部署到指定的测试 web 服务器的分步指南。 我知道 MS Build 属于这个等式,所以任何指导都会有所帮助。

我已经看到了有关部署的点点滴滴,其中提到了 _PublishedWebSites 等文件夹,但还没有一步一步地找到任何东西。

我在 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 服务用户正确设置权限,才能访问您要复制到的服务器上的文件夹。

首先,您应该使用 WebDeployment 项目,因为这将对您的代码和标记进行更多的编译和检查。 请参阅此处了解更多信息。

我有 4 个环境设置 DV [开发]、PY [原型]、PP [预生产]、PD [生产] TFS 中的所有匹配分支。 其中每一个在 sln 配置管理器中也有一个条目,您可以在其中设置需要构建的项目和构建标志。

一旦设置正确,您就可以开始设置部署脚本。 我更喜欢使用 MSbuild 进行部署,因为它将为您提供更细粒度的部署方法。 MSbuild 一开始有点奇怪,但是一旦你掌握了它,它就会非常强大。

我添加到 TeamBuild 配置中的部署脚本如下。 基本上如您所见,在复制到实时服务器之前,我会进行一些构建后清理。 我还使用了 2 个 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 项目的另一个功能)和任何其他环境特定文件。

让它正常工作将是一个漫长的过程,但希望这能让你开始! (显然,如果您选择此方法!)

这可以直接通过构建脚本来完成,Vertigo Software 的家伙通常是很多 TFS 这样的问题的最佳信息来源......不幸的是,他们的博客文章在谷歌上的排名通常不那么高。 这是本网站的创建者之一杰夫·阿特伍德 (Jeff Atwood) 的作品:

团队构建后复制 Web 文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM