【问题标题】:Automatically start/stop Existing Azure VM as build agent in VSTS自动启动/停止现有 Azure VM 作为 VSTS 中的构建代理
【发布时间】:2017-09-04 06:28:47
【问题描述】:

我能够在 VSTS 中将我现有的 Azure VM 注册为构建代理。构建工作正常,但我只想在有任何工作的情况下打开和关闭机器。如果我看到队列中有一些工作可以打开虚拟机,然后如果队列空闲 5 分钟就关闭它,有什么方法可以打开它?

【问题讨论】:

    标签: azure azure-devops azure-pipelines


    【解决方案1】:

    在开头添加托管代理作业以启动 VM,并在末尾添加代理作业或其他步骤以在完成后关闭 VM。

    添加一个代理作业以将其作为托管运行以启动 VM。然后将所有构建步骤用作自托管(私有)。

    添加您的 Azure 订阅

    选择内联脚本以添加以下内容以使用 VM 名称和资源组启动它

    start-AzureRmVM -Name ""-ResourceGroupName ""
    

    添加另一个代理作业或附加步骤作为最后一步 构建完成后关闭 VM。 使用以下脚本

    stop-AzureRmVM -Name ""-ResourceGroupName "" -Force
    

    【讨论】:

      【解决方案2】:

      我想知道这是否对您有所帮助,因为这不是您所要求的。我在构建之前和构建之后使用 REST API 调用来启动和停止特定的 VM。在API documentation 中查看如何start 和power off 虚拟机。

      作为第一步,我创建了一个无代理作业,其任务名为Invoke REST API。该任务允许您对 Azure 帐户进行身份验证,因此您不必手动处理。您所要做的就是指定 URL 后缀。例如,要启动一个名为 MyVm 的 VM,您需要添加一个类似于以下的后缀:

      /subscriptions/subscription-id/resourceGroups/resource-group-name/providers/Microsoft。 Compute/virtualMachines/MyVm/start?api-version=2018-06-01

      订阅 ID 和资源组可以在 Azure 中虚拟机的概览页面中进行验证。

      在构建之后,您可以添加另一个无代理作业,但这次使用 powerOff 端点的 REST 调用:

      /subscriptions/subscription-id/resourceGroups/resource-group-name/providers/Microsoft。 Compute/virtualMachines/MyVm/powerOff?api-version=2018-06-01

      【讨论】:

      • 另外,如果您想最小化计算成本,您可能希望使用“Deallocate”端点而不是“PowerOff”端点。
      • 起初在身份验证方面有点挣扎。关键是,在设置REST api任务时,一定要选择Connection Type的Azure Resource Manager
      【解决方案3】:

      在 VSTS 中构建时没有启动/停止 azure VM 的好方法。关于WebHook,没有队列构建的事件,对于其他事件,它们不满足很多要求(例如非CI构建,手动构建队列)

      我建议您使用托管代理,通过免费的托管管道,您可以获得每月 4 小时(240 分钟)的时间,并且在 Team Services 中每次构建或部署的最长持续时间为 30 分钟。

      How to buy more pipeline capacity for builds and releases in Visual Studio Team Services

      解决方法:

      1. 在指定时间建立队列,例如周一和周四早上 7:00,然后您可以自动启动和自动关闭虚拟机
      2. 在托管代理上运行(执行 Powershell 以启动 VM)=>在私有代理上运行

      更多信息,可以参考:How to Create a Monster Build Agent in Azure for Cheap

      【讨论】:

      • 托管管道不是很有限吗?例如,它不支持 Xamarin iOS 构建,或者我无法使用本地 SQL Server Developer 进行快速集成测试 [通过快照]。另外,目前 afaik 只支持 VS 2017 15.1,而 15.3.3 已经出来了,不是吗?
      • @milanio 是的,托管代理的环境有一些限制。所以有私有构建代理,但不支持自动启动/停止代理机器。
      • 感谢@starain-MSFT!你认为它会在不久的将来得到支持吗?这种方法怎么样:托管管道启动 VM,然后 VM 监控队列,如果它看到它有一段时间是空的,它会自行关闭 [WebHook]。你怎么看?
      • @milanio 不知道托管代理如何工作。您可以检查一下解决方法。 (更新了我的答案)
      • 如果您希望看到有助于实现此目的的“构建排队/构建开始”网络钩子,请投票支持此建议 developercommunity.visualstudio.com/content/idea/365870/…。
      【解决方案4】:

      您可以尝试在 VSTS 中使用WebHook,然后选择最合适的事件(如代码推送或发布创建)。在 Visual Studio Team Services 中打开团队项目的管理页面,在 Service Hooks 选项卡上,运行订阅向导,选择您感兴趣的事件,并填写相关条件。

      然后您可以使用Azure Automation Runbook to subscribe to the WebHook 并使用PowerShell,如果它已经启动,则使用构建VM,或者启动它。您可以使用另一个 WebHook 来表示构建已完成,或者通过其各种 API 从 VM 发送poll VSTS。

      您可能希望在构建后延迟关闭虚拟机,因为启动/关闭会产生时间成本。

      【讨论】:

      • 嗯,谢谢,我正在使用类似于 start&stop teamcity 构建代理的东西,虽然它有效,但我希望在 VSTS 中避免它。除了 TeamCity,您还必须自己监控构建队列,而且似乎您必须在 VSTS 中执行相同操作 [请参阅@starain-MSFT 答案]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      相关资源
      最近更新 更多