4

我希望能够快速将更新部署到相当繁忙的站点。对于较小的站点,我只需将新文件通过 FTP 传输到旧文件上。然而,这个有几个大的 dll 会定期更新,而当他们复制网站时,网站实际上已经关闭(另外,如果出现问题,还存在备份它们的麻烦。

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

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

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

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

编辑:当 web.config 项目发生变化并且需要合并以便临时服务器设置(应用程序设置、连接字符串等)不会部署到实时站点时,它会变得有点棘手。这怎么处理?

4

9 回答 9

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 是排除目录)

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

  • 将具有正确信息的 release.config 复制并重命名(这次使用 xcopy)到 d:\Website\web.config web.config 即时)。

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

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

于 2010-09-21T09:47:08.703 回答
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')"  />

于 2010-09-18T04:14:40.657 回答
2

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

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

您应该能够将其全部折叠到一个脚本中,以便在需要时运行,这意味着您可以对其进行测试和计时,以便了解发生了什么。

于 2010-09-12T10:06:24.743 回答
1

查看这些链接,看看它们是否有帮助:

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

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

于 2010-09-18T03:47:36.123 回答
0

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

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

这对您的配置问题没有多大帮助,但我们的登台和生产配置文件是相同的。

于 2010-09-18T04:07:53.983 回答
0

你需要(我需要)是一个同步程序,它能够在服务器上创建文件的备份,并通过可能首先将它们复制到临时目录或通过部分更新来快速复制文件的 ftp .

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

于 2010-09-22T08:21:17.360 回答
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 等)。登台(或部署脚本)将抓取并重命名必要的配置文件。

于 2010-09-22T13:39:55.730 回答
0

您可能需要使用多种工具。

我会在您的实时站点上查看带有只读文件夹的 DFSR(文件服务器角色)(因此它是单向复制)。

它非常易于配置,具有良好的 GUI,能够根据位置和/或掩码排除文件,并且启用卷影复制后,您可以让它按照您设置的计划运行并更新那些仅更改的文件(或让它按计划运行,甚至手动运行)。它的美妙之处在于,一旦配置好,您就不必再次触摸它。

一旦您复制了大部分文件,您就可以在自动化 web.config 上可能的合并方面获得帮助,假设您希望自动化。

于 2010-09-22T13:47:17.030 回答
0

MSBuild 很棒,除了一个小(或主要取决于您的观点)缺陷。每次运行构建时,它都会重新构建二进制文件。这意味着,对于从 TEST 部署到 PRODUCTION,或从 STAGE 部署到 PRODUCTION(或任何您的预生产环境),如果您使用 MSBuild,您不会将现有的二进制文件从一个环境升级到另一个环境,而是重新构建它们. 这也意味着您可以肯定地依赖源代码存储库中的任何内容,因为您对预生产环境进行了 MSBuild。允许对任何事情进行任何重大或次要的更改,哪怕是最微小的机会,都意味着您不会将经过全面测试的产品推广到您的生产环境中。在我工作的地方,这是不可接受的风险。

输入 Robocopy。使用 Robocopy,您可以将(希望)经过全面测试的产品复制到您的生产环境中。然后,您要么需要手动修改 web.config/app.config 以反映生产环境,要么使用转换工具来做到这一点。为此,我一直在使用 SourceForge 上可用的“配置转换工具”——它的工作原理与 MSBuild web/app.config 转换一样。

于 2012-08-24T18:36:52.370 回答