使用Robocopy部署站点

时间:2010-09-12 09:04:52

标签: asp.net deployment windows-server-2003 robocopy

我希望能够快速将更新部署到相当繁忙的网站。对于较小的站点,我只是将新文件通过旧文件进行FTP。然而,这个有一些大的dll经常更新,并且他们正在复制网站实际上是有效的下降(加上在出现问题时备份它们的麻烦。

我的计划是使用TortoiseHg通过FTP与服务器上的暂存副本同步(使用netdrive或类似的东西)。然后我可以检查所有运行是否顺利,一旦完成,我想运行一个.bat文件(或其他东西),它将创建一个活动站点的备份(最好只有即将发生变化的文件,但那是并不重要)然后将新更改的文件复制到实际站点。

如果可能的话,我还想让副本忽略某些目录(比如用户上传),这样它就不会覆盖现场网站上的那些文件了?

我听说RoboCopy是要走的路,但我不知道从哪里开始。我是否需要调用2个命令(1个用于初始备份,1个用于复制)?有没有什么方法可以将现场恢复到之前的状态,如果出现问题?

该站点位于ASP.NET中,将被复制到Windows 2003服务器。

编辑:当web.config项目发生变化并需要合并时,它会变得有点棘手,因此登台服务器设置(appsettings,连接字符串等)不会部署到实际站点。如何处理?

9 个答案:

答案 0 :(得分:4)

我们使用的是以下

  • 首先使用cruisecontrol.net中的msbuild构建网站以构建二进制文件
  • 将当前部署的文件归档到带时间戳的文件夹下,以避免在出现问题时丢失数据

    C:\DevTools\Robocopy\robocopy.exe /R:1 /W:10 /mir "D:\WebSite\Files" "D:\Webarchive\ArchivedFiles\Documents.%date:~0,-8%.%date:~3,-5%.%date:~6%.%time:~0,-9%.%time:~3,-6%.%time:~6,-3%" /XF *.scc

  • 停止网站

  • 通过复制除我们存档的文件以外的所有内容来部署网站(/ XD是eXclude目录)

    C:\DevTools\Robocopy\robocopy.exe /R:1 /W:10 /mir "c:\dev\site" "D:\WebSite" /XF *.scc /XD "D:\WebSite\Files"

  • 将具有正确信息的release.config复制并重命名为d:\ Website \ web.config(事实上,这就是我们以前的工作,现在我们有了一个自制的转换引擎动态更改dev web.config的部分内容。

  • 重启网站
  • (可选)删除您在第二步中创建的存档

在您的情况下,您必须为要忽略的任何目录添加/ XD标记,例如用户的上传。除非生产web.config文件很复杂,否则我真的建议只需复制你作为项目一部分维护的release.config,与web.config一起复制

答案 1 :(得分:3)

Robocopy是一项艰难的要求吗?为什么不使用MSBuild?您列出的所有内容都可以在MSBuild中轻松完成。

<!-- Attempt to build new code -->
<MSBuild Projects="$(BuildRootPath)\ThePhotoProject.sln" Properties="Configuration=$(Environment);WebProjectOutputDir=$(OutputFolder);OutDir=$(WebProjectOutputDir)\" />

<!-- Get temp file references -->
<PropertyGroup>
  <TempConfigFile>$([System.IO.Path]::GetTempFileName())</TempConfigFile>
  <TempEnvironmentFile>$([System.IO.Path]::GetTempFileName())</TempEnvironmentFile>
</PropertyGroup>

<!-- Copy current web configs to temp files -->
<Copy SourceFiles="$(OutputFolder)\web.config" DestinationFiles="$(TempConfigFile)"></Copy>
<Copy SourceFiles="$(OutputFolder)\web.$(Environment).config" DestinationFiles="$(TempEnvironmentFile)"></Copy>
<ItemGroup>
  <DeleteConfigs Include="$(OutputFolder)\*.config" />
</ItemGroup>

<Delete Files="@(DeleteConfigs)" />

...

<!-- Copy app_offline file -->
<Copy SourceFiles="$(CCNetWorkingDirectory)\Builder\app_offline.htm"  DestinationFiles="$(DeployPath)\app_offline.htm"  Condition="Exists('$(CCNetWorkingDirectory)\Builder\app_offline.htm')"  />

<ItemGroup>
  <DeleteExisting Include="$(DeployPath)\**\*.*" Exclude="$(DeployPath)\app_offline.htm" />      
</ItemGroup>

<!-- Delete Existing files from site -->
<Delete Files="@(DeleteExisting)"  />
<ItemGroup>
  <DeployFiles Include="$(OutputFolder)\**\*.*" />
</ItemGroup>

<!-- Deploy new files to deployment folder. -->
<Copy SourceFiles="@(DeployFiles)"  DestinationFiles="@(DeployFiles->'$(DeployPath)\%(RecursiveDir)%(Filename)%(Extension)')"  />

<!-- Delete app_offline file -->
<Delete Files="$(DeployPath)\app_offline.htm" Condition="Exists('$(DeployPath)\app_offline.htm')"  />

答案 2 :(得分:2)

在基于Nix的服务器上,我会使用RSYNC,我知道在Windows上你可以使用DeltaCopy这是RSYNC的端口并且是开源的(从未使用过DeltaCopy所以请仔细检查)无论如何假设它像RSYNC一样工作然后它很快,只更新已更改的文件。

您可以使用各种配置选项删除目标上已在源上删除的文件,也可以使用添加文件来排除文件或目录,即本地配置,您不希望复制。等。

您应该能够将其全部折叠成一个脚本,以便在需要时运行,这意味着您可以测试并计时,以便了解正在发生的事情。

答案 3 :(得分:1)

查看这些链接以了解它们是否有用:

您会发现robocopy.exe /?非常有帮助。特别是,您需要/XF开关来排除文件,/XD用于排除文件夹。

您需要编写一个脚本(例如bat,powershell,cscript)来处理web.config问题。

答案 4 :(得分:0)

Microsoft自己使用robocopy将更新部署到某些站点。

我不知道你是否有多台服务器,但是我们的部署脚本类似于:1)停止IIS(这将使服务器脱离负载平衡器旋转,2)来自\ STAGING \ path \的RoboCopy / MIR to \ webroot to \ WEB ## \ path \ to \ webroot其中##是服务器的编号,3)启动IIS。这是在站点在登台服务器上进行了烟雾测试之后完成的。

这对您的配置问题没什么帮助,但我们的暂存和生产配置文件是相同的。

答案 5 :(得分:0)

您需要(我需要)的是同步程序,能够创建服务器上文件的备份,并使快速复制ftp 的文件可能是先在临时目录上复制它们,或者是部分更新。

这是我找到的一个程序:http://www.superflexible.com/ftp.htm

答案 6 :(得分:0)

WebDeploy是处理部署的更好方法(参见Scott H http://www.hanselman.com/blog/WebDeploymentMadeAwesomeIfYoureUsingXCopyYoureDoingItWrong.aspx

但是,Robocopy是一个很好的低成本部署工具,我仍然在某些网站上使用(没有时间将它们更改为webdeploy)。 Robocopy就像xcopy一样,但有更丰富的选项。因此,您需要2个Robocopy命令(1个用于备份,1个用于部署)。我通常在暂存文件时执行备份命令。

管理配置文件总是很棘手(并且是使用webdeploy的一个重要原因)。一种方法是为每个检查到源代码管理的环境保留配置文件的副本(例如,web.dev.config,web.uat.config,web.prod.config等)。登台(或部署脚本)将获取并重命名必要的配置文件。

答案 7 :(得分:0)

您可能需要使用工具组合。

我会看一下DFSR(文件服务器角色),在你的实际网站上有一个只读文件夹(所以它是单向复制)。

配置非常简单,具有良好的GUI,能够根据位置和/或掩码排除文件,并且启用了卷影复制,您可以在设置的日程表上运行它并更新仅更改的文件(或让它按计划运行,甚至手动运行)。它的美妙之处在于配置完成后,您无需再次触摸它。

一旦你复制了大量文件,你就可以获得自动化web.config上可能合并的帮助,假设你想要自动化。

答案 8 :(得分:0)

MSBuild很棒,除了一个未成年人(或主要取决于你的观点)缺陷。它每次运行构建时都会重建二进制文件。这意味着,对于从TEST部署到PRODUCTION,或从STAGE到PRODUCTION(或任何您的预生产环境被调用),如果您使用MSBuild,您不会将现有二进制文件从一个环境推广到下一个环境,您正在重新构建它们。这也意味着您肯定地依赖于源代码存储库中的NOTHING已经更改,因为您在预生产环境中执行了MSBuild。即使有任何改变任何主要或次要的机会,也意味着您不会将经过全面测试的产品推广到您的生产环境中。在我工作的地方,这不是一个可接受的风险。

输入Robocopy。使用Robocopy,您可以将(经过充分测试的)完全测试的产品复制到您的生产环境中。然后,您需要手动修改web.config / app.config以反映生产环境,或者使用转换工具来执行此操作。我一直在使用SourceForge上提供的“配置转换工具” - 它就像MSBuild web / app.config转换一样工作。