使用Robocopy部署网站

我希望能够将更新快速部署到相当繁忙的站点。 对于较小的网站,我只是将新文件通过旧文件进行FTP传输。 然而,这个有一些大型的dll,它们会定期更新,而他们复制该网站的效率会有所下降(此外,如果出现问题,还有备份它们的麻烦。

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

如果可能的话,我还希望复制忽略某些目录(如用户上传),以便它不会覆盖活网站上的这些文件?

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

该网站在ASP.NET中,并将被复制到Windows 2003服务器。

编辑:它变得有点棘手时,web.config项目已更改,需要合并,使暂存服务器设置(appsettings,连接字符串等)不会部署到现场。 如何处理?


我们使用的是以下内容

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

    C:DevToolsRobocopyrobocopy.exe /R:1 /W:10 /mir "D:WebSiteFiles" "D:WebarchiveArchivedFilesDocuments.%date:~0,-8%.%date:~3,-5%.%date:~6%.%time:~0,-9%.%time:~3,-6%.%time:~6,-3%" /XF *.scc

  • 停止网站

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

    C:DevToolsRobocopyrobocopy.exe /R:1 /W:10 /mir "c:devsite" "D:WebSite" /XF *.scc /XD "D:WebSiteFiles"

  • 复制并重命名(此时使用xcopy)带有正确信息的release.config到d: Website web.config(实际上,这就是我们过去做的,现在我们有一个自制转换引擎来更改dev的部分在运行web.config)。

  • 重新启动网站
  • (可选)删除您在第二步中创建的档案
  • 在你的情况下,你必须为你想忽略的任何目录添加/ XD标志,例如用户上传。 除非生产web.config文件很复杂,我真的建议只是复制一个作为项目一部分维护的release.config,与web.config并排


    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)Builderapp_offline.htm"  DestinationFiles="$(DeployPath)app_offline.htm"  Condition="Exists('$(CCNetWorkingDirectory)Builderapp_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')"  />
    


    在基于Nix的服务器上,我会使用RSYNC,并且我知道在Windows上,您可以使用DeltaCopy,它是一个RSYNC端口并且是开放源代码(从未使用过DeltaCopy,因此请仔细检查)无论如何,假设它的工作方式与RSYNC相似,那么速度很快,已更改的文件。

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

    您应该能够将其全部折叠为一个脚本,以便在需要时运行,这意味着您可以测试并计时,以便知道发生了什么。

    链接地址: http://www.djcxy.com/p/81653.html

    上一篇: Using Robocopy to deploy sites

    下一篇: Is there a good tutorial on MSBuild scripts?