如何通过Azure DevOps REST API提取单元测试与SonarQube状态
Azure DevOps REST API 获取单元测试与SonarQube集成状态方案
一、检测Visual Studio Test任务(单元测试)状态
要判断项目是否集成单元测试(通过Visual Studio Test任务),需遍历构建定义和发布定义中的所有任务,检查是否存在对应类型任务:
所需API:
- 构建定义API:
$projectUri/_apis/build/definitions?$apiVersion(推荐使用apiVersion=7.1-preview.7) - 发布定义API:你已在使用的
$projectUri/_apis/release/definitions?$apiVersion
- 构建定义API:
检测逻辑:
- 遍历每个构建/发布定义的阶段、作业、任务集合
- 识别Visual Studio Test任务:任务固定ID为
ef087383-ee5e-42c7-9a53-ab56c98420f9,或任务名称包含Visual Studio Test - 只要任意定义中存在该任务,标记为
1;否则标记为0
PowerShell示例片段:
# 假设已配置好认证头$headers $buildDefs = Invoke-RestMethod -Uri "$projectUri/_apis/build/definitions?apiVersion=7.1-preview.7" -Headers $headers $releaseDefs = Invoke-RestMethod -Uri "$projectUri/_apis/release/definitions?apiVersion=7.1-preview.7" -Headers $headers $hasVSTest = $false # 检查构建定义中的任务 foreach ($def in $buildDefs.value) { foreach ($phase in $def.process.phases) { foreach ($task in $phase.tasks) { if ($task.id -eq "ef087383-ee5e-42c7-9a53-ab56c98420f9" -or $task.name -match "Visual Studio Test") { $hasVSTest = $true break } } if ($hasVSTest) { break } } if ($hasVSTest) { break } } # 构建中未找到则检查发布定义 if (-not $hasVSTest) { foreach ($def in $releaseDefs.value) { foreach ($env in $def.environments) { foreach ($phase in $env.deploymentProcess.phases) { foreach ($task in $phase.tasks) { if ($task.id -eq "ef087383-ee5e-42c7-9a53-ab56c98420f9" -or $task.name -match "Visual Studio Test") { $hasVSTest = $true break } } if ($hasVSTest) { break } } if ($hasVSTest) { break } } if ($hasVSTest) { break } } } $vsTestStatus = if ($hasVSTest) { 1 } else { 0 }
二、检测SonarQube集成状态
判断项目是否集成SonarQube,同样需遍历构建/发布定义中的任务,查找SonarQube相关任务:
所需API:
- 构建定义API:同上
$projectUri/_apis/build/definitions?$apiVersion - 发布定义API:同上
$projectUri/_apis/release/definitions?$apiVersion
- 构建定义API:同上
检测逻辑:
- 识别SonarQube核心任务:
- SonarQube Prepare Analysis Configuration:任务ID
15b84ca1-b62f-4a2a-a403-89b77a063157 - SonarQube Analyze:任务ID
cb2b9455-19e7-4a85-a666-5ca1288c656f
- SonarQube Prepare Analysis Configuration:任务ID
- 只要任意定义中存在上述任一任务,标记为
1;否则标记为0
- 识别SonarQube核心任务:
PowerShell示例片段:
$sonarTaskIds = @("15b84ca1-b62f-4a2a-a403-89b77a063157", "cb2b9455-19e7-4a85-a666-5ca1288c656f") $hasSonarQube = $false # 检查构建定义中的SonarQube任务 foreach ($def in $buildDefs.value) { foreach ($phase in $def.process.phases) { foreach ($task in $phase.tasks) { if ($sonarTaskIds -contains $task.id -or $task.name -match "SonarQube") { $hasSonarQube = $true break } } if ($hasSonarQube) { break } } if ($hasSonarQube) { break } } # 构建中未找到则检查发布定义 if (-not $hasSonarQube) { foreach ($def in $releaseDefs.value) { foreach ($env in $def.environments) { foreach ($phase in $env.deploymentProcess.phases) { foreach ($task in $phase.tasks) { if ($sonarTaskIds -contains $task.id -or $task.name -match "SonarQube") { $hasSonarQube = $true break } } if ($hasSonarQube) { break } } if ($hasSonarQube) { break } } if ($hasSonarQube) { break } } } $sonarStatus = if ($hasSonarQube) { 1 } else { 0 }
注意事项
- 确保请求头包含有效的Azure DevOps认证凭据(如
Authorization: Basic <Base64编码的PAT>) - API版本建议使用最新预览版,避免兼容性问题
- 部分自定义任务名称可能有差异,同时检测任务ID和名称能提升准确率
内容的提问来源于stack exchange,提问作者Alberto Smith
相关产品推荐
相关产品推荐

