在Azure DevOps中,如何查询尚未完成并延续到当前sprint迭代的用户故事?

时间:2019-12-27 03:09:16

标签: azure-devops azure-boards

我正在尝试列出尚未完成的用户故事,并使用比我目前更好的方法将其延续到当前的sprint。输出应列出不是在当前sprint迭代中创建的用户案例,并且必须至少在要列出的任何先前迭代中将其激活一次。我的输出是正确的,但是问题是我必须手动更改日期,因为我使用了创建日期字段,并手动将其设置为大于当前sprint迭代的开始日期。我还有另一种方法可以检测用户故事是否在以前的sprint迭代中,以便将其延续到当前sprint时列出它们吗?我在想类似比较故事的创建日期的事情,这样就不会列出新故事,但我没有找到正确的参数。

My inefficient query

2 个答案:

答案 0 :(得分:0)

我认为,您使用最好的方法。您可以添加日期宏(例如@ StartOfWeek-1),该宏可帮助您分析用户故事,而无需更改查询(Start of Day, Week, Month, or Year date-based queries)中的日期。此外,您可以使用Power BI报表,在其中可以分析工作项的每个历史记录修订并查找以前的迭代。 Connect to Analytics with Power BI Data Connector

答案 1 :(得分:0)

我们无法通过内置工作项查询来实现这一点,但是我们可以通过在脚本(Wiql - Query By WiqlRevisions - Get)中调用REST API来实现。

请尝试以下对我有用的PowerShell脚本:(您也可以将列表导出到CSV文件,然后使用Microsoft Excel打开)

它从特定团队的当前迭代中查询未完成的User Story,然后为每个团队检索工作项修订,以检测System.IterationPath字段以获取所有值。如果该字段具有多个唯一值,则意味着该工作项将从先前的迭代进行到当前的sprint迭代:

Param(
   [string]$baseurl = "https://dev.azure.com/{organization}", 
   [string]$projectName = "project name",
   [string]$user = "username",
   [string]$token = "password/PAT"  
)

# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))


# Query the work items with wiql
$uri = "$baseurl/$($projectName)/_apis/wit/wiql?api-version=5.1"


function CreateJsonBody
{
    $value = @"
{
  "query": "Select [System.Id], [System.Title], [System.State],[System.Tags] From WorkItems Where [System.WorkItemType] = 'User Story' AND [System.State] <> 'Closed' AND [System.State] <> 'Removed' AND [System.IterationPath] = @currentIteration('[Agile-0219]\Agile-0219 Team') order by [System.CreatedDate] desc"
}

"@
 return $value
}
$json = CreateJsonBody

#Get the urls for WIs
$queryresult = Invoke-RestMethod -Uri $uri -Method POST -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

$wiurls = $queryresult.workItems.url


#Filter the work items which carried from other iterations to current iteration
$wis = @()
cls
foreach($wiurl in $wiurls){

#Set the work item revision URL
$revurl = "$wiurl/revisions"

$wi = (Invoke-RestMethod -Uri $revurl -Method GET -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)})

#Detect the Unique iterations which the work item ever been involved  
$iterationcount = ($wi.value.fields.'System.IterationPath'|select -Unique).count
#write-host $iterationcount

if ($iterationcount -gt 1) # Filter the work items which moved from other iterations
    { 
      # Select the latest revision 
       $wilatest = ($wi.value | Select -last 1) 

        $customObject = new-object PSObject -property @{
          "WitID" = $wilatest.id
          "Title" = $wilatest.fields.'System.Title'
          "AssignedTo" = $wilatest.fields.'System.AssignedTo'.displayName
          "ChangedDate" = $wilatest.fields.'System.ChangedDate'
          "ChangedBy" = $wilatest.fields.'System.ChangedBy'.displayName
          "WorkItemType" = $wilatest.fields.'System.WorkItemType'
          "State" = $wilatest.fields.'System.State'
          "URL" = $wilatest.url
        } 

    $wis += $customObject   
    }

}
    $wis | Select-Object `
                WitID,
                Title, 
                AssignedTo,
                ChangedDate, 
                ChangedBy,
                WorkItemType,
                State,
                URL #|export-csv -Path D:\sample.csv -NoTypeInformation

enter image description here


更新

如果要按查询中的创建日期进行过滤,则只需添加过滤条件,例如:AND [System.CreatedDate] < '2019-10-10'

因此,查询应为:

"Select [System.Id], [System.Title], [System.State],[System.Tags] From WorkItems Where [System.WorkItemType] = 'User Story' AND [System.State] <> 'Closed' AND [System.State] <> 'Removed' AND [System.IterationPath] = @currentIteration AND [System.CreatedDate] < '2019-10-10' order by [System.CreatedDate] desc"