You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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
        }
    }
}

关键细节说明

  1. 获取发布ID:创建发布后,Invoke-RestMethod返回的对象包含发布ID,我们用它来后续查询状态。
  2. 轮询逻辑
    • 设置了30秒的轮询间隔,避免频繁请求API导致限流。
    • 增加了最大等待时间,防止脚本无限期运行。
  3. 状态判断
    • Azure DevOps发布阶段的核心状态有:notStartedinProgresssucceededfailedcanceled
    • 单阶段流水线直接取environments[0]即可;如果是多阶段,可以循环遍历所有environments,确保所有阶段都成功才返回。
  4. 权限要求:你的认证令牌(无论是流水线的SYSTEM_ACCESSTOKEN还是个人PAT)需要拥有Release ReadRelease Execute权限。
  5. 错误处理:添加了try/catch块处理API请求失败的情况,比如网络波动,避免脚本直接崩溃。

扩展建议

  • 如果需要更详细的失败信息,可以从$stage.deploymentStatus$stage.errorMessage中提取具体错误内容。
  • 可以调整轮询间隔(比如初期短间隔,后期长间隔)来优化性能。

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

火山引擎 最新活动