Asp.net 使用Robocopy部署站点
我希望能够快速地将更新部署到相当繁忙的站点。对于较小的站点,我只需将新文件FTP到旧文件上。然而,这一个有几个大型dll,它们会定期更新,当它们复制站点时,站点会有效地关闭(另外,如果出现问题,还需要备份它们) 我的计划是使用TortoiseHg通过FTP(使用netdrive或类似工具)与服务器上的暂存副本同步。然后,我可以检查所有操作是否正常运行,一旦完成,我希望运行一个.bat文件(或其他文件),以创建实时站点的备份(最好只修改即将更改的文件,但这并不重要),然后将新更改的文件复制到实时站点 如果可能的话,我也想让副本忽略某些目录(如用户上传),这样它就不会覆盖实时站点上的那些文件了 我听说RoboCopy是一个不错的选择,但我不确定从哪里开始。我是否需要调用两个命令(一个用于初始备份,一个用于副本)?如果出现问题,有没有办法将live站点恢复到以前的状态 该网站位于ASP.NET中,将被复制到Windows 2003 serverAsp.net 使用Robocopy部署站点,asp.net,deployment,windows-server-2003,robocopy,Asp.net,Deployment,Windows Server 2003,Robocopy,我希望能够快速地将更新部署到相当繁忙的站点。对于较小的站点,我只需将新文件FTP到旧文件上。然而,这一个有几个大型dll,它们会定期更新,当它们复制站点时,站点会有效地关闭(另外,如果出现问题,还需要备份它们) 我的计划是使用TortoiseHg通过FTP(使用netdrive或类似工具)与服务器上的暂存副本同步。然后,我可以检查所有操作是否正常运行,一旦完成,我希望运行一个.bat文件(或其他文件),以创建实时站点的备份(最好只修改即将更改的文件,但这并不重要),然后将新更改的文件复制到实时站
编辑:当web.config项发生更改并且需要合并以便临时服务器设置(appsettings、连接字符串等)时,这会变得有点棘手不要部署到实时站点。这是如何处理的?在基于Nix的服务器上,我会使用RSYNC,我知道在Windows上,您可以使用哪个端口的RSYNC,并且是开源的(从未使用过DeltaCopy,因此请仔细检查)无论如何,假设它像RSYNC一样工作,那么它很快,只更新已经更改的文件 您可以使用各种配置选项删除目标上已在源上删除的文件,也可以使用将排除文件或目录的文件中的外接程序,即本地配置,您不希望复制。等等
您应该能够将其全部折叠到一个脚本中,以便在需要时运行,这意味着您可以对其进行测试和计时,以便了解发生的情况。查看这些链接以了解它们是否有帮助:
robocopy.exe/?
非常有用。您尤其需要使用/XF
开关排除文件,使用/XD
排除文件夹
不过,您需要编写一个脚本(例如bat、powershell、cscript)来解决web.config问题。Microsoft自己使用robocopy将更新部署到某些站点 我不知道您是否有多台服务器,但我们的部署脚本类似于:1)停止IIS(这将使服务器脱离负载平衡器轮换,2)RoboCopy/MIR从\STAGING\path\to\webroot到\WEB\path\to\webroot,其中##是服务器的编号,3)启动IIS。这是在登台服务器上对站点进行冒烟测试后完成的
这对解决配置问题没有多大帮助,但我们的暂存和生产配置文件是相同的 机器人技术是一项硬性要求吗?为什么不使用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)" />
$([System.IO.Path]::GetTempFileName())
$([System.IO.Path]::GetTempFileName())
我们使用的是以下内容
- 首先使用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”
- 复制并重命名(这次使用xcopy)一个包含正确信息的release.config到d:\Website\web.config(事实上,这就是我们过去的做法,现在我们有了一个自制的转换引擎来动态更改dev web.config的部分内容)
- 重新启动网站
- (可选)删除在第二步创建的存档
这是我发现的一个程序:WebDeploy是处理部署的一种更好的方法(参见Scott H) 但是,Robocopy是一个非常好的低成本部署工具,我仍然在一些站点上使用它(还没有时间将它们更改为webdeploy)。Robocopy与xcopy类似,但具有更丰富的选项集。因此,您需要2个Robocopy命令(1个用于备份,1个用于部署)。我通常在文件暂存时执行备份命令
管理配置文件总是很棘手(这也是使用webdeploy的一个重要原因)。一种方法是将每个环境的配置文件副本签入源代码管理(例如web.dev.config、web.uat.config、web.prod.config等)。登台(或部署脚本)将获取并重命名必要的配置文件。您可能需要使用多种工具的组合 我想看看
<!-- 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')" />