如何判断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
相关产品推荐
相关产品推荐

