调用Azure REST API删除迭代后GUI仍显示,求排查原因
问题描述
我通过PowerShell脚本调用Azure DevOps REST API添加新迭代,并删除Iteration 1至3这三个基础迭代。API调用返回正常,查询迭代列表显示这三个迭代已被删除,但进入Azure DevOps GUI界面后,这些迭代仍然存在:
附删除迭代的脚本代码:
function deleteIteration { [CmdletBinding()] param ( [Parameter( Mandatory )] [string] $organization, [Parameter( Mandatory )] [string] $project, [Parameter( Mandatory )] [string] $iteration, [Parameter( Mandatory )] [hashtable] $header ) try { [string] $team = getMainTeamName -organization $organization -project $project [string] $iterationId = getIterationId -organization $organization -project $project -iteration $iteration -team $team -header $header [string] $uri = "$url/{0}/{1}/{2}/_apis/work/teamsettings/iterations/{3}?{4}" -f $organization, $project, $team, $iterationId, $apiVersion [Object] $query = Invoke-RestMethod -Uri $uri -Method Delete -Headers $header Write-Host "- Iteration $iteration has been deleted !" } catch { Write-Host "##[error] An error occurred while deleting Iteration $name at $uri." Get-Error throw } }
问题原因
你当前调用的是团队级迭代设置接口,这个操作仅将迭代从指定团队的可用迭代列表中移除,并没有真正删除项目级的迭代实体。Azure DevOps GUI显示的是项目级的分类节点(迭代的根实体),所以这些迭代看起来依然存在。
解决方法
要彻底删除迭代,需要完成两个步骤:
从所有关联团队中移除迭代
你的现有脚本只处理了主团队,需要确保迭代从项目下所有团队的迭代设置中移除(如果其他团队也引用了这些迭代)。调用项目级分类节点删除接口
使用以下API真正删除项目级的迭代实体:- 请求URI:
https://dev.azure.com/{organization}/{project}/_apis/wit/classificationnodes/Iterations/{iterationPath}?api-version=7.1 - 请求方法:DELETE
- 注意:
iterationPath需要是迭代的完整路径(比如根级的Iteration 1,或者父节点下的ParentIteration/Iteration 1)
- 请求URI:
修改后的脚本示例
可以在现有函数中添加项目级删除的逻辑:
function deleteIteration { [CmdletBinding()] param ( [Parameter( Mandatory )] [string] $organization, [Parameter( Mandatory )] [string] $project, [Parameter( Mandatory )] [string] $iteration, [Parameter( Mandatory )] [hashtable] $header ) try { # 1. 从主团队移除迭代(原有逻辑) [string] $team = getMainTeamName -organization $organization -project $project [string] $iterationId = getIterationId -organization $organization -project $project -iteration $iteration -team $team -header $header [string] $teamUri = "$url/{0}/{1}/{2}/_apis/work/teamsettings/iterations/{3}?{4}" -f $organization, $project, $team, $iterationId, $apiVersion Invoke-RestMethod -Uri $teamUri -Method Delete -Headers $header Write-Host "- Iteration $iteration removed from team $team" # 2. 删除项目级迭代实体 [string] $projectUri = "https://dev.azure.com/{0}/{1}/_apis/wit/classificationnodes/Iterations/{2}?api-version=7.1" -f $organization, $project, [Uri]::EscapeDataString($iteration) Invoke-RestMethod -Uri $projectUri -Method Delete -Headers $header Write-Host "- Iteration $iteration deleted from project" } catch { Write-Host "##[error] Error handling iteration $iteration : $_" Get-Error throw } }
注意事项
- 确保迭代没有关联任何工作项,否则项目级删除接口会返回错误
- 如果迭代被多个团队引用,需要先从所有团队中移除,才能删除项目级实体
- 迭代路径需要准确,有父节点时要包含完整层级(比如
Release 1/Iteration 1)
内容的提问来源于stack exchange,提问作者Takadox et compagnie
相关产品推荐
相关产品推荐

