如何从 azure devops rest api 获得 n 个工作项的交互

Posted

技术标签:

【中文标题】如何从 azure devops rest api 获得 n 个工作项的交互【英文标题】:how to get past n interations of workitems from azure devops rest api 【发布时间】:2021-06-12 15:12:57 【问题描述】:

我需要动态拉取当前迭代和过去 n 个具有特定字段的工作项迭代。

向您详细解释过去 n 次迭代。 假设我的 n 为 5,那么我需要当前迭代、过去迭代到当前迭代以及过去到过去到当前迭代的工作项。

我总共有超过 400 次迭代,我需要从中提取最近 5 次迭代的工作项。

要从当前迭代中获取具有特定字段的工作项,这是我编写的 powershell 脚本

$token = 'your PAT'
$url="https://dev.azure.com/Organizationname/_apis/wit/wiql?api-version=5.1"
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
$JSON = @'

   "query": "SELECT [System.Id], [System.WorkItemType],  [System.State],[System.AreaPath],[System.Tags],[System.CommentCount],[System.ChangedDate] 
                   FROM workitems 
              Where [System.AreaPath] = 'area path' 
                 and [System.IterationPath] = 'iteration path' 
                 and [System.WorkItemType] = 'Story' 
              order by [Microsoft.VSTS.Common.Priority] asc, [System.CreatedDate] desc"

'@
$response = Invoke-RestMethod -Uri $url -Headers @Authorization = "Basic $token" -Method Post -Body $JSON -ContentType application/json
$listOfTasks = New-Object Collections.Generic.List[String]
ForEach( $workitem in $response.workItems ) 
  $listOfTasks.Add($workitem.id)

$listOfTasks = $listOfTasks -join ','
$listOfTasks
$JSON1 = @"

  
  "ids": [$listOfTasks],
  "fields": [
    "System.Id",
    "System.Title",
    "System.WorkItemType",
    "System.IterationPath",
  ]      

"@
$JSON1
$url1="https://dev.azure.com/Organizationname/_apis/wit/workitemsbatch?api-version=5.0"
$response1 = Invoke-RestMethod -Uri $url1 -Headers @Authorization = "Basic $token" -Method Post -Body $JSON1 -ContentType application/json
Write-Host "result = $($response1 | ConvertTo-Json -Depth 100)"

有人可以帮我调整这个逻辑,这样我就可以获得当前和过去的 n 次迭代工作项。 非常感谢提前!

【问题讨论】:

【参考方案1】:

过去和当前的迭代都在团队设置中。因此,您必须知道团队名称才能获得迭代列表。那么:

    在团队设置中,您可以获得迭代:Iterations - List

https://dev.azure.com/organization/project/team/_apis/work/teamsettings/iterations?api-version=6.1-preview.1

    每次迭代都包含日期和时间范围(当前、未来、过去)。 您可以在源代码中使用列表中的迭代或使用Iterations - Get Iteration Work Items 获取迭代工作项:

https://dev.azure.com/organization/project/team/_apis/work/teamsettings/iterations/iterationId/workitems?api-version=6.1-preview.1

获取过去 5 次迭代的示例:

$user = ""
$token = "<PAT>"

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("0:1" -f $user,$token)))

$org = "<ORG_NAME>"
$teamProject = "<PROJECT_NAME>"
$teamName = "<TEAM_NAME>"

$restApiGetIterations = "https://dev.azure.com/$org/$teamProject/$teamName/_apis/work/teamsettings/iterations?api-version=6.1-preview.1"

$restApiGetIterations

function InvokeGetRequest ($GetUrl)
   
    return Invoke-RestMethod -Uri $GetUrl -Method Get -ContentType "application/json" -Headers @Authorization=("Basic 0" -f $base64AuthInfo)



$iterations = InvokeGetRequest $restApiGetIterations

$pastIterations = $iterations.value | Where-Object $_.attributes.timeFrame -eq "past" 

$past5Iterations = $pastIterations | Sort-Object -Property $_.attributes.finishDate | Select-Object -Last 5


$past5Iterations 

【讨论】:

是的,我知道这一点。但我想要的是我只需要获取最后 5 次迭代的工作项,而不是所有可用的。对于所有过去的迭代,为时间范围分配的值已经过去,在我的情况下,有超过 400 次过去的迭代,我只想要最近 5 次过去的迭代工作项:-( @Jennie,因​​此您只需从 400 次迭代中获得最后 5 次迭代。我已经更新了我的答案。 哇!它像专业人士一样工作。一个小问题!!如果我需要使用过去 5 次迭代详细信息获取当前迭代详细信息,该怎么办。 我也能得到当前的迭代信息。非常感谢您提供的精彩脚本。

以上是关于如何从 azure devops rest api 获得 n 个工作项的交互的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Azure DevOps REST Api 编写构建计划脚本?

ML.NET机器学习API容器化与Azure DevOps实践:RESTful API

C# - 如何从 Azure DevOps 工作项列表反序列化 json?

Azure devops Server 2019中的Analytics Widget-寻找Rest api和class libraby用于Analytics Widget

尝试使用 Azure DevOps Rest API 创建发布定义时出错

Azure DevOps 发布 Api 400 错误请求错误