能否使用Powershell导出Azure DevOps流水线运行历史并生成统计报告
实现方案说明
可以实现近一个月Azure DevOps流水线运行统计报告的生成,你现有脚本已经完成了调用Azure DevOps Build REST API拉取运行记录的基础逻辑,只需补充时间过滤、字段解析、统计计算、报告导出的逻辑即可,具体操作方法如下:
1 前置准备
- 你使用的身份(个人访问令牌PAT或流水线内置服务账号)需要有目标项目的生成读取权限
- 如果是在本地运行脚本,需要把
$env:SYSTEM_ACCESSTOKEN替换为你自己的Azure DevOps个人访问令牌(PAT),令牌范围勾选Build (Read)即可
2 完善后的完整脚本
# 配置基础参数 $organization = "chealey" $project = "personal test" $apiVersion = "5.1" # 计算近一个月的UTC起始时间 $startTime = (Get-Date).AddMonths(-1).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") $strURL = "https://dev.azure.com/$organization/$([Uri]::EscapeDataString($project))/_apis/build/builds?api-version=$apiVersion&minFinishTime=$startTime&`$top=1000" # 授权配置:本地运行替换为自己的PAT,流水线运行保留环境变量即可 $token = $env:SYSTEM_ACCESSTOKEN # 本地运行示例:$token = "你的PAT字符串" $headers = @{ Authorization = "Bearer $token" } # 拉取构建记录 $buildRecords = Invoke-RestMethod -Uri $strURL -Headers $headers -Method GET # 处理单条构建记录,生成结构化统计数据 $pipelineStats = $buildRecords.value | ForEach-Object { $runDuration = if ($_.finishTime -and $_.startTime) { [datetime]$_.finishTime - [datetime]$_.startTime } else { $null } [PSCustomObject]@{ 流水线ID = $_.definition.id 流水线名称 = $_.definition.name 运行ID = $_.id 运行状态 = $_.status 运行结果 = $_.result 启动时间 = [datetime]$_.queueTime 完成时间 = if ($_.finishTime) { [datetime]$_.finishTime } else { $null } 运行时长_分钟 = if ($runDuration) { [math]::Round($runDuration.TotalMinutes,2) } else { $null } 触发人 = $_.requestedBy.displayName } } # 导出明细数据到CSV,可直接用Excel打开生成可视化报告 $outputPath = "D:\pipeline_stats.csv" $pipelineStats | Export-Csv -Path $outputPath -Encoding UTF8 -NoTypeInformation # 生成按流水线聚合的汇总统计 $summary = $pipelineStats | Group-Object 流水线名称 | ForEach-Object { $failedRuns = $_.Group | Where-Object { $_.运行结果 -eq "failed" } | Measure-Object | Select-Object -ExpandProperty Count $successRuns = $_.Group | Where-Object { $_.运行结果 -eq "succeeded" } | Measure-Object | Select-Object -ExpandProperty Count $avgDuration = $_.Group | Where-Object { $_.运行时长_分钟 -ne $null } | Measure-Object 运行时长_分钟 -Average | Select-Object -ExpandProperty Average [PSCustomObject]@{ 流水线名称 = $_.Name 总运行次数 = $_.Count 成功次数 = $successRuns 失败次数 = $failedRuns 成功率 = if ($_.Count -gt 0) { [math]::Round($successRuns / $_.Count * 100,2) } else { 0 } 平均运行时长_分钟 = [math]::Round($avgDuration,2) } } # 导出汇总报告 $summaryPath = "D:\pipeline_summary.csv" $summary | Export-Csv -Path $summaryPath -Encoding UTF8 -NoTypeInformation # 控制台输出汇总结果验证 Write-Host "近一个月流水线统计汇总:" $summary | Format-Table -AutoSize
3 报告使用说明
- 运行脚本后会生成两个文件:
pipeline_stats.csv是所有运行的明细数据,pipeline_summary.csv是按流水线聚合的统计数据,包含你需要的运行时长、失败次数、成功率等核心信息 - 你可以用Excel打开CSV文件,插入数据透视表、柱状图、折线图等可视化元素,生成正式的统计报告
- 如果需要定期自动生成报告,可以把这个脚本配置成Azure DevOps定时运行的流水线,生成的CSV可以作为流水线产物留存,或者自动发送邮件给相关人员
4 补充说明
- 如果拉取的记录超过1000条,需要处理API分页逻辑,在请求中添加continuationToken参数循环拉取即可
- 若需要包含发布流水线的运行数据,把请求地址替换为发布管理的REST API接口即可
内容的提问来源于stack exchange,提问作者chealey
相关产品推荐
相关产品推荐

