如何通过PowerShell调用Azure DevOps REST API获取发布阶段状态
解决方案:持续轮询Azure DevOps发布阶段状态直至完成
我来帮你搞定这个需求——既然你已经能成功创建发布,接下来只需要在创建发布后拿到发布ID,然后循环轮询它的阶段状态,直到阶段完成(成功或失败)即可。下面是完整的PowerShell脚本,包含详细注释:
完整脚本
# 配置变量(根据你的实际情况修改) $organization = "你的组织名称" $project = "你的项目名称" $definitionId = 9 # 你的发布定义ID $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$env:SYSTEM_ACCESSTOKEN")) # 如果是本地运行,替换为你的个人访问令牌:":你的PAT" # -------------------------- # 第一步:创建发布并获取发布ID # -------------------------- $createReleaseUrl = "https://vsrm.dev.azure.com/$organization/$project/_apis/release/releases?api-version=5.1" $body = @{definitionId = $definitionId} | ConvertTo-Json -Depth 4 try { $release = Invoke-RestMethod -Uri $createReleaseUrl -Method POST -Body $body -ContentType "application/json" -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)} $releaseId = $release.id Write-Host "✅ 成功创建发布,发布ID: $releaseId" } catch { Write-Error "❌ 创建发布失败:$_" exit 1 } # -------------------------- # 第二步:持续轮询发布阶段状态 # -------------------------- $pollingInterval = 30 # 每次轮询间隔(秒) $maxWaitMinutes = 60 # 最大等待时间(防止无限轮询) $startTime = Get-Date while ($true) { # 检查是否超过最大等待时间 $elapsedMinutes = (Get-Date - $startTime).TotalMinutes if ($elapsedMinutes -ge $maxWaitMinutes) { Write-Error "❌ 轮询超时:已等待超过 $maxWaitMinutes 分钟,发布仍未完成" exit 1 } # 获取当前发布的详细状态 $statusUrl = "https://vsrm.dev.azure.com/$organization/$project/_apis/release/releases/$releaseId?api-version=5.1" try { $releaseStatus = Invoke-RestMethod -Uri $statusUrl -Method GET -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)} } catch { Write-Error "❌ 获取发布状态失败:$_" Start-Sleep -Seconds $pollingInterval continue } # 提取阶段状态(单阶段流水线,直接取第一个环境/阶段) $stage = $releaseStatus.environments[0] $stageName = $stage.name $currentStatus = $stage.status Write-Host "🔍 当前阶段 '$stageName' 状态:$currentStatus" # 根据状态处理逻辑 switch ($currentStatus) { "succeeded" { Write-Host "🎉 发布阶段 '$stageName' 执行成功!" exit 0 # 脚本成功退出 } "failed" { Write-Error "❌ 发布阶段 '$stageName' 执行失败!" exit 1 # 脚本失败退出,触发流水线失败 } "canceled" { Write-Error "❌ 发布阶段 '$stageName' 已被取消!" exit 1 } default { # 状态为notStarted/inProgress,继续等待 Write-Host "⏳ 等待 $pollingInterval 秒后再次查询..." Start-Sleep -Seconds $pollingInterval } } }
关键细节说明
- 获取发布ID:创建发布后,
Invoke-RestMethod返回的对象包含发布ID,我们用它来后续查询状态。 - 轮询逻辑:
- 设置了30秒的轮询间隔,避免频繁请求API导致限流。
- 增加了最大等待时间,防止脚本无限期运行。
- 状态判断:
- Azure DevOps发布阶段的核心状态有:
notStarted、inProgress、succeeded、failed、canceled。 - 单阶段流水线直接取
environments[0]即可;如果是多阶段,可以循环遍历所有environments,确保所有阶段都成功才返回。
- Azure DevOps发布阶段的核心状态有:
- 权限要求:你的认证令牌(无论是流水线的
SYSTEM_ACCESSTOKEN还是个人PAT)需要拥有Release Read和Release Execute权限。 - 错误处理:添加了
try/catch块处理API请求失败的情况,比如网络波动,避免脚本直接崩溃。
扩展建议
- 如果需要更详细的失败信息,可以从
$stage.deploymentStatus或$stage.errorMessage中提取具体错误内容。 - 可以调整轮询间隔(比如初期短间隔,后期长间隔)来优化性能。
内容的提问来源于stack exchange,提问作者norsk




