ADO CLI 无法删除标签

ADO CLI can't remove tags

我正在使用带有 az boards work-item update 命令的 Azure CLI(文档是 here)。这是一个更大的系统的一部分,该系统读取票证上的标签(除其他外),然后从该列表中删除 Ready 标签并尝试将标签设置回以将其删除。

az boards work-item update --organization $ORG --output json --id 12345 --fields System.Tags=Android

当使用 --fields System.Tags=Android 参数更新标签字段时,这用于将现有标签替换为指定的标签,例如如果票有 AndroidReady 标签,这将删除 Ready 标签。不过最近好像只能加标签,不能删标签。

我尝试了各种其他属性和格式,但似乎没有任何效果。有谁知道如何用我使用 CLI 指定的标签替换票证上的标签?

编辑:ADO 社区票已筹集 here

据我所知,目前还没有这样的方法可以使用 Rest API 或 Azure CLI 删除特定的工作项标签。

要解决此问题,我们需要先使用 Azure CLI/Rest API 获取工作项标签列表。然后我们可以修改标签字段并更新字段。

这是我给 运行 其余 APIs 的 powershell 示例。

$token = "PAT"

$url=" https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/{workitemid}?api-version=6.0"

$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))


$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Get  -ContentType application/json

$tags = $response.fields.'System.Tags'

echo $tags

$New = $tags -replace "tagname" -replace ""

echo $new


$url1 ="https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/{workitemid}?api-version=6.0"

$body = "[    


  {
    `"From`" : null,
    `"op`": `"replace`",
    `"path`": `"/fields/System.Tags`",
     `"value`" : `"$new`"
  }            
      
          ]"

$response = Invoke-RestMethod -Uri $url1 -Headers @{Authorization = "Basic $token"} -Method PATCH -Body $body -ContentType application/json-patch+json

这是关于 Rest APIs 的文档:Work Items - Get Work Item and Work Items - Update

我可以确认 az boards work-item update 命令不再是 removing/replacing 带有传递的标签,这肯定是一个错误。请在 Developer Community 上报告,以便修复。

同时,正如@Fairy Xu 提到的,此行为使您只能选择进行 REST 调用来更新工作项。但是,您不必将整个当前设置交换为 REST 即可解决该问题。也可以通过 Azure CLI 以及使用 az rest 命令进行相同的 REST 调用!

实现方法如下:

# Get current tags on the work item; Sample response: Tag1; Tag2; Tag3
$Tags = az boards work-item show --id 456 --query 'fields.\"System.Tags\"' -o tsv

# Sample headers.json
# {
#   "Authorization":"Basic OmZpYWxreG9xYnBwiZ2IyeDRyZm90d3psNmE=",
#   "Content-Type":"application/json-patch+json"
# }
#
# Sample body.json
# [
#   {
#     "op": "replace",
#     "path": "/fields/System.Tags",
#     "value": "Tag1; Tag3"
#   }
# ]

# Use az rest command to make the Update work item REST call
# In the response you'd see the System.Tags field showing only Tag1; Tag3
az rest --method patch --url https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/456?api-version=5.1 --headers '@headers.json' --body '@body.json'

编辑:

您可以通过两种方式处理身份验证:

  • 使用 AAD 不记名访问令牌

    看来可以使用499b84ac-1321-427f-aa17-267ca6975798作为--resource的值来调用az rest,如下所示:

    az rest --url 'https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/456?api-version=5.1' --resource 499b84ac-1321-427f-aa17-267ca6975798
    
  • 使用带有 PAT 的基本身份验证

    要填充授权 header,您首先必须 generate a Personal Access Token (PAT) 您的组织具有适当的范围。一旦你有了它,你必须将它转换为 Base64 字符串,如下所示:

    $Username=""
    $Password="<PAT>"
    $Token = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $Username,$Password)))
    

此外,请务必包含 Content-Type 并将其设置为 application/json-patch+json 作为 header 之一,因为 az rest 默认为 application/json

参考文献: