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

如何判断Azure预览版部署交换是否已重启实例

自动化检测Azure部署槽实例预热状态并安全执行预览交换

核心思路

通过Azure DevOps Pipeline结合Azure CLI/脚本,批量验证目标部署槽的所有实例是否完成重启与预热,确认全部符合条件后再触发预览交换,替代人工长时间等待的低效方式。

具体实现步骤

1. 获取目标槽的运行中实例列表

使用Azure CLI命令筛选出处于Running状态的实例(确保已完成重启):

az webapp instance list --resource-group <你的资源组名> --name <Web App名称> --slot <目标槽名称> --query "[?state=='Running'].id" -o json

2. 逐个验证实例预热健康状态

针对每个运行中的实例,调用配置的预热检测路径(对应WEBSITE_SWAP_WARMUP_PING_PATH),校验返回状态码是否匹配WEBSITE_SWAP_WARMUP_PING_STATUSES设定值:

az webapp curl --resource-group <你的资源组名> --name <Web App名称> --slot <目标槽名称> --instance-id <实例ID> --path <预热检测路径> --headers "Host:<Web App域名>"

解析返回的HTTP状态码,判断是否符合预期(如200、204等)。

3. 循环等待直到所有实例达标

在Azure DevOps Pipeline中用脚本实现循环检测逻辑:

  • 设定最大等待时长(如30分钟)和检测间隔(如1分钟)
  • 每次检测统计健康实例数量,直到12个实例全部满足条件
  • 超时则抛出错误终止流程

示例PowerShell脚本片段:

$resourceGroup = "你的资源组名"
$webAppName = "Web App名称"
$slotName = "目标槽名称"
$warmupPath = "/health/check"
$expectedStatuses = @(200,204)
$maxWaitMinutes = 30
$checkIntervalSeconds = 60
$totalInstances = 12

$elapsedMinutes = 0
while ($elapsedMinutes -lt $maxWaitMinutes) {
    $instances = az webapp instance list --resource-group $resourceGroup --name $webAppName --slot $slotName --query "[?state=='Running'].id" -o json | ConvertFrom-Json
    $healthyCount = 0

    foreach ($instanceId in $instances) {
        $response = az webapp curl --resource-group $resourceGroup --name $webAppName --slot $slotName --instance-id $instanceId --path $warmupPath --headers "Host:$webAppName.azurewebsites.net" --output json | ConvertFrom-Json
        $statusCode = $response.statusCode

        if ($expectedStatuses -contains $statusCode) {
            $healthyCount++
        }
    }

    if ($healthyCount -eq $totalInstances) {
        Write-Host "所有实例已完成预热,准备执行交换"
        break
    } else {
        Write-Host "当前$healthyCount/$totalInstances实例完成预热,等待$checkIntervalSeconds秒后重试"
        Start-Sleep -Seconds $checkIntervalSeconds
        $elapsedMinutes++
    }
}

if ($elapsedMinutes -ge $maxWaitMinutes) {
    throw "超时:超过$maxWaitMinutes分钟仍有实例未完成预热"
}

4. 触发预览交换

确认所有实例健康后,执行交换命令:

az webapp deployment slot swap --resource-group <你的资源组名> --name <Web App名称> --slot <源槽名称> --target-slot <目标槽名称> --preview

优化建议

  • 为Pipeline添加超时告警逻辑,避免无感知失败
  • 结合Azure Monitor的实例CPU、响应时间指标,辅助判断预热完成状态
  • 将资源组、Web App名称等配置为Pipeline变量,提升脚本复用性

内容的提问来源于stack exchange,提问作者Kode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:43:31