我正在尝试列出尚未完成的用户故事,并使用比我目前更好的方法将其延续到当前的sprint。输出应列出不是在当前sprint迭代中创建的用户案例,并且必须至少在要列出的任何先前迭代中将其激活一次。我的输出是正确的,但是问题是我必须手动更改日期,因为我使用了创建日期字段,并手动将其设置为大于当前sprint迭代的开始日期。我还有另一种方法可以检测用户故事是否在以前的sprint迭代中,以便将其延续到当前sprint时列出它们吗?我在想类似比较故事的创建日期的事情,这样就不会列出新故事,但我没有找到正确的参数。
答案 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 Wiql和Revisions - 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
更新
如果要按查询中的创建日期进行过滤,则只需添加过滤条件,例如: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"