【问题标题】:How can I deploy an ASP.NET web application using Team Build?如何使用 Team Build 部署 ASP.NET Web 应用程序?
【发布时间】:2010-10-12 07:30:41
【问题描述】:

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

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

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

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

我已经看到有关部署的点点滴滴,其中提到了诸如 _PublishedWebSites 之类的文件夹,但还没有逐步找到任何东西。

【问题讨论】:

    标签: asp.net tfs tfsbuild


    【解决方案1】:

    我在 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 应用程序,创建构建并使用复制命令进行部署跨度>
    【解决方案2】:

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

    我有 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 项目的另一个功能)和任何其他环境特定文件。

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

    【讨论】:

      【解决方案3】:

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

      Copying Web Files After a Team Build

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多