如何使用 Release Management 部署到远程数据中心

How to deploy with Release Management to remote datacenter

我们在本地进行 运行 TFS 和发布管理,我想将我的应用程序部署到远程数据中心。 访问是通过 Internet 进行的,因此没有 windows 可用的共享。 我正在使用 vNext 模板,afaik RM 似乎只支持 windows 共享的 unc 路径。

我如何使用 Release Management 将软件部署到这个数据中心?

我正在研究这个解决方案: 在位于数据中心内的 IIS 上使用 WebDav。 RM 服务器和 Target 可以使用 windows 内置的 WebDav 客户端并通过 unc 路径访问它。

我还没有让它工作,因为 RM 不会使用正确的凭据登录到 webdav 服务器。

更新了我的解决方案 这只是概念验证,未经生产测试。

  1. 设置可从 RM 服务器和目标服务器访问的 WebDav 站点
  2. 在两台服务器上安装功能 "Desktop experience"
  3. 制作如下DLL

    using System;
    using System.ComponentModel.Composition;
    using System.Diagnostics;
    using System.IO;
    using Microsoft.TeamFoundation.Release.Common.Helpers;
    using Microsoft.TeamFoundation.Release.Composition.Definitions;
    using Microsoft.TeamFoundation.Release.Composition.Services;
    namespace DoTheNetUse
    {
      [PartCreationPolicy(CreationPolicy.Shared)]
      [Export(typeof(IThreadSafeService))]
      public class DoTheNetUse : BaseThreadSafeService
      {
        public DoTheNetUse() : base("DoTheNetUse")
        {}
    
        protected override void DoAction()
        {
      Logger.WriteInformation("DoAction: [DoTheNetUse]");
      try
      {
        Logger.WriteInformation("# DoTheNetUse.Start #");
    
        Logger.WriteInformation("{0}, {1}", Environment.UserDomainName, Environment.UserName);
        {
          Logger.WriteInformation("Net use std");
          var si = new ProcessStartInfo("cmd.exe", @"/c ""net use \sharedwebdavserver.somewhere\DavWWWRoot\ /user:webdavuser webdavuserpassword""");
          si.UseShellExecute = false;
          si.RedirectStandardOutput = true;
          si.RedirectStandardError = true;
    
          var p = Process.Start(si);
    
          p.WaitForExit();
          Logger.WriteInformation("Net use output std:" + p.StandardOutput.ReadToEnd());
          Logger.WriteInformation("Net use output err:" + p.StandardError.ReadToEnd());
        }
        //##########################################################
            Logger.WriteInformation("# Done #");
          }
          catch (Exception e)
          {
            Logger.WriteError(e);
          }
        }
      }
    }
    
  4. 命名为"ReleaseManagementMonitor2.dll"

  5. 将它放在 子文件夹 到服务 "ReleaseManagementMonitor"
  6. 按照下面的解决方案配置共享路径。

不要覆盖现有的 "ReleaseManagementMonitor2.dll"

这有效的原因是 MEF。 ReleaseManagementMonitor 服务尝试从所有子文件夹加载 dll "ReleaseManagementMonitor2.dll"。 这个dll实现了一个RM可以识别的服务接口。 它运行 "net use" 以将凭据应用于运行服务的会话,从而授予对否则无法访问的 webdav 服务器的访问权限。

此解决方案已通过认证 "Works on my machine"

尝试在本地服务器上使用 Get-Content,然后在远程服务器上使用 Set-Content 传递文件内容;

可以将所有内容打包成某种存档。

发布管理正在将 VisualStudioRemoteDeployer.exe 复制到目标服务器上的 C:\Windows\DtlDownloads\VisualStudioRemoteDeployer 文件夹,然后使用 robocopy 将脚本从指定位置复制到目标服务器。

因此您必须从目标服务器向您的脚本位置授予权限。

RM 只适用于 UNC,你说得对。

您可以利用它来使您的场景发挥作用 -
理论上

  • 在 RM 域上创建一个边界机器,可以复制你的 drops。
  • 您的数据中心上的部署操作 运行 然后可以使用在该域上具有访问权限的凭据从该边界计算机复制位。 (这些凭据由您在 WPF 控制台中提供)

这是如何运作的

1. 在 RM 服务器域(比如 D1)上有一台专用机器将用作边界机器。

2. 通过指定您的数据中心将使用的共享路径,将此机器定义为 RM 中的边界机器。转到 WPF 控制台中的设置选项卡,创建一个新变量 - { Key = RMSharedUNCPath, Value = \\BoundaryMachine\DropsLocation }。 RM 现在知道你想使用这台机器作为你的边界机器。

3. 确保您照顾好这些权限

  • RM 服务器应该对 \\BoundaryMachine\DropsLocation 共享具有写入权限。
  • 将域 D1 的凭据向下传递到数据中心(域 D2)中的目标计算机,可用于访问共享。

4. 凭据可以从 WPF 控制台向下传递,您必须再次在设置选项卡中定义以下两个配置变量。

  • Key = RMSharedUNCPathUser ;值=域D1用户名
  • Key = RMSharedUNCPathPwd ;值 = 上面定义的用户的密码。

PS - 变量名区分大小写。

此外,要让 RM 知道您要使用 SharedUNC 机制,请选中 RM 服务器的相应复选框并通过 IP 而不是 DNS 名称连接到它,因为它们必须位于不同的域中,即

版本管理更新 4 支持 "Build drops stored on TFS servers"

http://blogs.msdn.com/b/visualstudioalm/archive/2014/11/11/what-s-new-in-release-management-for-vs-2013-update-4.aspx