代码之家  ›  专栏  ›  技术社区  ›  Ta01

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

  •  4
  • Ta01  · 技术社区  · 15 年前

    我已经成功安装了Team Foundation Server 2008,并且我创建了一个单独的构建服务器(因为我的构建目前失败了)。

    我已经创建了一个简单的“hello world”Web应用程序(所有都是标准的default.aspx页面),并将其放在TFS的源代码管理系统中。

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

    搜索Google有一段时间了,我还没有找到一个循序渐进的指南,通过teambuild正确地将一个应用程序从tfs源部署到一个指定的测试Web服务器上。我知道ms-build属于这个等式,所以任何指导都是有帮助的。

    我已经看到了一些关于部署的零碎内容,其中提到了一些文件夹,例如publishedwebsites,但还没有一步一步地找到任何内容。

    3 回复  |  直到 15 年前
        1
  •  4
  •   ryan.rousseau    15 年前

    我在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服务用户访问要复制到的服务器上的文件夹的权限。

        2
  •  4
  •   caveman_dick    15 年前

    首先,您应该使用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项目的另一个功能)和任何其他环境特定的fc文件。

    要让它正常工作需要很长的过程,但希望这能让你开始工作!!(显然,如果您选择此应用程序!)

        3
  •  2
  •   Nick Craver    15 年前

    这可以直接通过构建脚本来完成,眩晕软件人通常是很多像这样的TFS问题的最佳信息来源……不幸的是,他们的博客文章在谷歌上的排名并不高。这是杰夫·阿特伍德写的,他是这个网站的创建者之一:

    Copying Web Files After a Team Build