提问人:Julie 提问时间:2/25/2023 最后编辑:Shamrai AleksanderJulie 更新时间:2/26/2023 访问量:146
Azure DevOps:获取包工作项状态
Azure Devops Get package Workitem state
问:
我正在使用 Azure DevOps 工作项中的 Powershell 脚本创建一个包工作项,并在成功完成部署后将其更新为“已完成”。
问题: 如何查询包状态? 我尝试使用下面的powershell,它查询现有的包,但找不到获取包的system.state的逻辑
我的 Powershell:
function TestState{
Param(
[Parameter(Mandatory)]
[string[]]
$package,
[Parameter(Mandatory)]
[string[]]
$secret,
[Parameter(Mandatory)]
[string[]]
$DevopsProject
)
$header = prepareHeader $secret
$query = "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '$DevopsProject' AND [System.WorkItemType] = 'Package' AND [System.Title] = '$PackageName' "
$json = @{ query = $query }
$jsonBody = ConvertTo-Json $json
$url = "http://10.0.0.5/Test/$DevopsProject/_apis/wit/wiql?api-version=6.0"
$output = Invoke-RestMethod -Uri $url -Method Post -ContentType "application/json" -Headers $header -Body $jsonbody
$testurl = $output.workitems.url
$testurl = $testurl.Split('')
$test_url = $testurl[0]+'?api-version=6.0'
$output1 = Invoke-webrequest -uri "$test_url" -useBaseParsing -Method Get -ContentType "application/json" -Headers $header | ConvertFrom-json
return $output1
}
我的管道:
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
$test = checkPackagestate "$PackageName" "$(secret)" $(DevopsProject)"
答:
0赞
Shamrai Aleksander
2/25/2023
#1
因为您只使用一个查询: Query By Wiql 它返回一组工作项 ID:
{
"queryType": "flat",
"asOf": "2014-12-29T20:49:34.617Z",
"columns": [
{
"referenceName": "System.Id",
....
},
...
],
"sortColumns": [
{
"field": {
"referenceName": "Microsoft.VSTS.Common.Priority",
....
},
"descending": false
},
...
],
"workItems": [
{
"id": 300,
"url": "https://dev.azure.com/fabrikam/_apis/wit/workItems/300"
},
{
"id": 299,
"url": "https://dev.azure.com/fabrikam/_apis/wit/workItems/299"
},
{
"id": 298,
"url": "https://dev.azure.com/fabrikam/_apis/wit/workItems/298"
},
.....
]
}
然后,必须使用每个来获取工作项详细信息:获取工作项id
或在 ID 下使用url
评论
1赞
jessehouwing
2/25/2023
基本上,它已经为每个工作项提供了 URL 来获取详细信息。您可以传入所需的字段,以防您不需要所有字段。
0赞
Shamrai Aleksander
2/25/2023
@jessehouwing是的,你是对的
0赞
Julie
2/26/2023
非常感谢您的回复。我现在知道从哪里获得system.state了。我修改了脚本,但它不起作用。请提出任何建议。
0赞
jessehouwing
2/26/2023
什么不起作用?有什么错误吗?看起来您正在尝试读取工作项数组的 Url 属性。但是您可能希望从该数组中获取第一项,因此.还要检查外壳,这可能很重要。testurl = $output.workItems[0].url
Items
0赞
Julie
2/27/2023
非常感谢@ShamraiAleksander,jessehouwing。它工作正常。
0赞
Shamrai Aleksander
2/26/2023
#2
您可以将脚本更新到此版本
function TestState{
Param(
[Parameter(Mandatory)]
[string[]]
$package,
[Parameter(Mandatory)]
[string[]]
$secret,
[Parameter(Mandatory)]
[string[]]
$DevopsProject
)
$header = prepareHeader $secret
$query = "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '$DevopsProject' AND [System.WorkItemType] = 'Package' AND [System.Title] = '$PackageName' "
$json = @{ query = $query }
$jsonBody = ConvertTo-Json $json
$url = "http://10.0.0.5/Test/$DevopsProject/_apis/wit/wiql?api-version=6.0"
$output = Invoke-RestMethod -Uri $url -Method Post -ContentType "application/json" -Headers $header -Body $jsonbody
$outputres = ""
foreach ($wi in $output.workitems)
{
$test_url = $wi.url +'?api-version=6.0'
$output1 = Invoke-webrequest -uri "$test_url" -Method Get -ContentType "application/json" -Headers $header | ConvertFrom-json
$outputres += "$($output1.id) : $($output1.fields.'System.Title') : $($output1.fields.'System.State')`n"
}
return $outputres
}
评论
env: secret: $(system.accesstoken)