【问题标题】:What is the recommended release definition for starting and stopping an Azure VM?启动和停止 Azure VM 的推荐版本定义是什么?
【发布时间】:2016-06-14 23:33:09
【问题描述】:

我想增强发布定义,这样我就不需要一个只启动 Azure VM 的单独环境。

如果我们假设我们有测试、Beta 和生产环境。客户希望将应用程序安装在其本地网络上的 Beta 版和生产版中。我们在内部想要一个测试环境来运行 E2E 测试,允许非技术人员在不需要 VPN 访问客户测试环境的情况下使用应用程序等。

所以这里我们有环境,然后是代理运行的位置:

Test - Azure VM Beta - Client machine Production - Client machine

我们解决这个问题的方法是在客户端的机器上安装 VSTS 代理,这样我们就可以在为该版本定义的 Beta 和生产环境中定位该代理队列。然后,我们通常会构建一个 Azure VM,并将该代理队列作为测试环境的目标。

我们不想 24/7/365 运行该 Azure VM。但是,如果它没有运行,那么它就无法响应来自发布管理的请求。

我所做的是创建一个名为Start Test VMStop Test VM 的环境,它们使用Azure Resource Group Deployment 来启动和停止VM。这 2 个额外的环境可以将其代理队列设置为 Hosted

我想弄清楚如何将前 3 个环境组合成一个逻辑 Test,而不必创建 3 个发布管理环境。

Start Test VM - Hosted Test - Azure VM Stop Test VM - Hosted Beta - Client machine Production - Client machine

问题是,当我在 3 个月后回过头来想“这到底是什么环境?哦,这只是开始/停止虚拟机。”

选项:

  1. 保持现状 - 保持现状,无法修复
  2. 我们可以在 Azure VM 上打开一个端口并使用 Powershell 远程处理。然后在托管代理或本地代理上运行以启动 VM,然后部署应用程序,然后停止 VM。 - 我们真的不喜欢这个,因为部署与客户端本地部署不同。我们希望每个环境的任务都相同,只是变量不同。

【问题讨论】:

  • 测试环境是否由 Azure 托管?如果是,为什么不直接通过托管代理将构建部署到它?
  • 测试环境由 Azure 托管。所以你提倡选项#2?这将涉及使用 powershell 远程处理,并且构建步骤会有所不同,不是吗?例如,我们有一堆用于 Web 应用程序的文件 - 在客户端环境中,我们只是通过 UNC 路径将这些文件复制到目标计算机,在 Azure 中,您无法通过 UNC 将文件从托管代理复制到您的 Azure VM .
  • 您可以使用“AzureVMs 文件复制”任务将文件复制到 Azure VM。
  • 好的,解决了问题一。现在我们需要配置诸如幂等脚本之类的东西来创建 IIS 应用程序池(如果它不存在),在其上设置 Windows 身份验证,发布 dacpac 等。当它从正在安装的机器的上下文中执行时,即。从 VM 上的 VSTS 代理运行脚本看起来是一种方式。当 VSTS 代理处于托管状态并尝试远程控制虚拟机时,脚本看起来会有所不同吗?
  • 等等...如果是iirc,在远程处理时您可以向它传递一个脚本,并且该脚本会被物理复制到远程计算机,然后从该远程计算机执行,就像您直接执行一样...这可能可行,这样部署应用程序的脚本集将是相同的,除了“测试”环境将有一个“包装器”脚本,该脚本将使用远程复制脚本。

标签: azure-devops ms-release-management


【解决方案1】:

您可以使用“Azure PowerShell”和“Azure SQL 数据库部署”任务来配置您的 Azure VM 和 SQL,或调用其他脚本在 Azure VM 上运行。

没有任何方法可以为任务设置代理。为此,您可以在 VSTS User Voice 上提交功能请求。

另一种减少环境的方法是:如果您部署链接到发布的每个构建,那么您可以在构建定义中添加“启动测试虚拟机”任务以在构建成功时启动虚拟机并添加“停止测试VM”任务进入“Beta”环境。

【讨论】:

  • 感谢您的建议,埃迪。它在办公室引发了一些有趣的对话。最后,我们按照我发布的答案进行。
【解决方案2】:

我们目前的决定是继续使用environment,这并不是我真正认为的环境,而是更多stage 在发布管道中启动和/或关闭虚拟机。我们在 hosted 代理上运行它,以便它可以启动 VM 并确保检查 environment 上的 Skip artifacts download

对于持续集成构建,我们设置了一个链,以便启动 VM,启动 CI environment,然后停止 VM。剩余的environments 然后根据需要手动部署到链上。

下面是一个例子:

  • 启动 CI 虚拟机
  • CI
  • 停止 CI 虚拟机
  • 测试版
  • 生产

这是截至 2016.06.27 它在发布管理中的外观图片:

我在environment 周围加上了单引号,因为我认为我同意this user voice request 的观点,它实际上更像是发布管道中的一个阶段。就像数据库开发一样,逻辑和物理不一定是一对一的映射。

【讨论】:

  • 截至今天,2016.10.11,我看到我们现在有了阶段的概念!一个阶段有一个指定的代理,您可以在一个环境中拥有多个阶段,从而解决了拥有虚假环境只是为了在不同的代理上运行事物的确切问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多