如何在Azure DevOps中识别指定时间内无活动的项目及负责人?
识别Azure DevOps组织内无活动的项目及负责人
要批量排查指定时间段内无活动的项目,最可靠的方式是通过Azure DevOps REST API结合脚本自动化完成,以下是具体步骤和示例脚本:
一、前置准备
- 生成一个Azure DevOps个人访问令牌(PAT),需要包含以下权限:
- Code (Read)
- Build (Read)
- Release (Read)
- Work Items (Read)
- Project and Team (Read)
- 确定要排查的起始日期(比如过去一年:
(Get-Date).AddYears(-1).ToString("yyyy-MM-ddTHH:mm:ssZ"),需为ISO 8601格式)
二、核心步骤
1. 获取组织内所有项目
调用Projects API获取组织下所有项目的ID、名称等基础信息:
$orgName = "你的组织名" $pat = "你的PAT令牌" $startDate = (Get-Date).AddYears(-1).ToString("yyyy-MM-ddTHH:mm:ssZ") $headers = @{ Authorization = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")) } $projects = Invoke-RestMethod -Uri "https://dev.azure.com/$orgName/_apis/projects?api-version=7.1-preview.4" -Headers $headers -Method Get
2. 检查项目是否有活动
对每个项目,依次检查以下四类活动,只要有一类存在活动,就标记为活跃项目:
- Git提交(若项目使用TFVC,需替换为TFVC变更集查询)
- 构建记录
- 发布记录
- 工作项变更
示例检查逻辑:
$inactiveProjects = @() foreach ($project in $projects.value) { $projectId = $project.id $projectName = $project.name $hasActivity = $false # 检查Git提交 $repos = Invoke-RestMethod -Uri "https://dev.azure.com/$orgName/$projectName/_apis/git/repositories?api-version=7.1-preview.1" -Headers $headers -Method Get foreach ($repo in $repos.value) { $commits = Invoke-RestMethod -Uri "https://dev.azure.com/$orgName/$projectName/_apis/git/repositories/$($repo.id)/commits?searchCriteria.fromDate=$startDate&api-version=7.1-preview.1" -Headers $headers -Method Get if ($commits.value.Count -gt 0) { $hasActivity = $true break } } if (-not $hasActivity) { # 检查构建记录 $builds = Invoke-RestMethod -Uri "https://dev.azure.com/$orgName/$projectName/_apis/build/builds?minTime=$startDate&api-version=7.1-preview.7" -Headers $headers -Method Get if ($builds.value.Count -gt 0) { $hasActivity = $true } } if (-not $hasActivity) { # 检查发布记录 $releases = Invoke-RestMethod -Uri "https://dev.azure.com/$orgName/$projectName/_apis/release/releases?minCreatedTime=$startDate&api-version=7.1-preview.8" -Headers $headers -Method Get if ($releases.value.Count -gt 0) { $hasActivity = $true } } if (-not $hasActivity) { # 检查工作项变更 $wiqlQuery = @" { "query": "Select [System.Id] From WorkItems Where [System.ChangedDate] >= '$startDate'" } "@ $workItems = Invoke-RestMethod -Uri "https://dev.azure.com/$orgName/$projectName/_apis/wit/wiql?api-version=7.1-preview.2" -Headers $headers -Method Post -Body $wiqlQuery -ContentType "application/json" if ($workItems.workItems.Count -gt 0) { $hasActivity = $true } } # 如果无任何活动,加入待清理列表 if (-not $hasActivity) { $inactiveProjects += [PSCustomObject]@{ ProjectName = $projectName ProjectId = $projectId } } }
3. 获取无活动项目的负责人
通过Security Roles API获取项目的Project Administrators组成员(通常即为项目负责人):
foreach ($proj in $inactiveProjects) { $roleAssignments = Invoke-RestMethod -Uri "https://dev.azure.com/$orgName/_apis/securityroles/scopes/projectrole/$($proj.ProjectId)/roleassignments?api-version=7.1-preview.1" -Headers $headers -Method Get # 筛选Project Administrator角色的用户 $adminRole = $roleAssignments.value | Where-Object { $_.roleName -eq "Project Administrator" } $owners = $adminRole.members | ForEach-Object { $_.displayName } -join ", " $proj | Add-Member -MemberType NoteProperty -Name "Owners" -Value $owners } # 输出结果 $inactiveProjects | Format-Table ProjectName, ProjectId, Owners -AutoSize
三、注意事项
- 若项目使用TFVC版本控制,需替换Git提交检查为TFVC变更集查询:
Invoke-RestMethod -Uri "https://dev.azure.com/$orgName/$projectName/_apis/tfvc/changesets?searchCriteria.fromDate=$startDate&api-version=7.1-preview.1" - 部分项目可能存在未关联到上述四类活动的操作(如Wiki编辑),若需要排查可额外调用Wiki API补充检查
- 脚本可根据实际需求调整活动检查的范围(比如忽略某些类型的构建)
内容的提问来源于stack exchange,提问作者Manu Mishra
相关产品推荐
相关产品推荐

