You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure VM Run Command冻结阻塞DevOps管道,求稳定执行方案

解决Azure VM Run Command冻结导致流水线阻塞的问题

问题场景

在DevOps流水线中使用az vm run-command create在Windows Azure VM上执行PowerShell脚本时,多次运行后出现命令冻结情况:命令无法在超时时间内完成,后续新命令无法执行,甚至执行az vm run-command delete删除命令时也会冻结,导致流水线阻塞。全新VM首次运行正常,问题仅在多次流水线执行后出现。

流水线原执行及删除命令示例:

# 执行Run Command脚本
az vm run-command create \
    --name RecreateBinariesFolder$(Build.BuildId) \
    --vm-name ${{ parameters.vmName }} \
    --resource-group my-group-${{ parameters.environment }} \
    --timeout-in-seconds 600 \
    --script "if(Test-Path C:\\temp\\packages\\){ Remove-Item -Path c:\\temp\\packages -Force -Recurse } ; if(!(Test-Path C:\\temp\\packages\\)){ mkdir c:\\temp\\packages }"
# 删除Run Command
az vm run-command delete \
    --name RecreateBinariesFolder$(Build.BuildId) \
    --vm-name ${{ parameters.vmName }} \
    --resource-group my-group-${{ parameters.environment }} \
    --yes

已验证的有效解决方法

方法1:添加--no-wait参数并重建异常VM

2024-01-23更新:在删除Run Command的命令中添加--no-wait参数,并重建出现异常的VM后,连续数十次流水线运行未再出现冻结问题。推测原因为VM本身或CustomScriptExtension存在累积性异常。

修改后的删除命令:

az vm run-command delete \
    --name RecreateBinariesFolder$(Build.BuildId) \
    --vm-name ${{ parameters.vmName }} \
    --resource-group my-group-${{ parameters.environment }} \
    --yes \
    --no-wait

方法2:预清理所有现有Run Command

2024-03-12更新:在每次执行新的Run Command前,批量删除指定资源组内所有VM的现有Run Command,进一步降低冻结概率。示例代码:

RG_NAME=my-resource-group
VM_NAMES=$(az vm list -o json|jq -r '.[].name')
for VM_NAME in $VM_NAMES; do
  VM_NAME=$(echo $VM_NAME|tr -d '\r\n')
  RUN_COMMANDS=$(az vm run-command list --vm-name $VM_NAME --resource-group $RG_NAME -o json)
  for CMD_NAME in $(echo $RUN_COMMANDS|jq -r '.[].name'); do
    CMD_NAME=$(echo $CMD_NAME|tr -d '\r\n')
    az vm run-command delete --name $CMD_NAME --vm-name $VM_NAME --resource-group $RG_NAME --yes --no-wait
  done
done

替代方案推荐

如果Run Command的稳定性问题仍无法彻底解决,可以考虑以下更稳定的替代方案:

  • Azure Automation Runbook:通过Azure Automation账户管理并执行PowerShell脚本,不依赖VM本地的扩展组件,适合批量、周期性的VM操作场景。
  • WinRM直接执行:在流水线中使用PowerShell的Invoke-Command通过WinRM直接连接VM执行脚本,绕过Azure Run Command的中间层,减少潜在的阻塞点。
  • 优化脚本逻辑:检查脚本是否存在可能导致阻塞的操作(如长时间未响应的文件操作),添加日志输出和超时控制,便于快速定位问题。

内容的提问来源于stack exchange,提问作者Tommi L.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:24:52