Azure DevOps生成-Invoke-RestMethod-具有相同密钥的项目已添加错误

时间:2018-09-24 15:00:06

标签: azure-devops

在DevOps构建中,我们有一个powershell脚本,可查找自上次良好构建以来的变更集详细信息。

$TfsUrl = 'https://' + $RestAPIAccount + '.visualstudio.com/defaultcollection/' + $ProjectName
$BaseUrl =  "https://" + $RestAPIAccount + ".visualstudio.com/defaultcollection/_apis/tfvc/changesets"
$ChangeSetHistoryUrl = $TfsUrl + "/_apis/build/builds/$BuildId/changes?api-version=$RestAPIVersion"
$changeSetHistoryDef = (Invoke-RestMethod -Uri $ChangeSetHistoryUrl -Headers $Headers -Method Get).Value

最后一条语句开始失败,并出现以下错误:

"Invoke-RestMethod : {"$id":"1","innerException":null,"message":"An item with the same key has already been added.","typeName":"System.ArgumentException, mscorlib, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","typeKey":"ArgumentException","errorCode":0,"eventId":0}" 

在过去的一年或更长时间里,我们一直在运行相同的脚本,没有任何问题。

关于可能导致此问题或如何进一步解决问题的任何想法。

2 个答案:

答案 0 :(得分:0)

这是因为自上次良好构建以来,您请求的构建没有任何更改。

根据我的测试,如果您具有 2 个构建定义 A B ,并且它们设置了相同的源...编辑并修改一些文件/代码,然后签入更改。

  1. 触发构建定义 A 并生成build#1,这一次 它可以通过调用以下REST API来工作:

    _apis/build/builds/build#1/changes?api-version=$RestAPIVersion
    
  2. 然后触发构建定义 B 并生成build#2,即使他们使用相同的Source版本,但这 时间REST API无法正常工作...并且您将收到错误消息...因为build#2build#1相比没有任何变化...

    _apis/build/builds/build#2/changes?api-version=$RestAPIVersion(build#2 / changes在这里将无法工作,因为没有任何更改...。)

enter image description here

使用以下脚本进行了测试:(Allow Scripts to Access OAuth Token

$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/builds/$env:Build_BuildId/changes"
Write-Host $url
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}

Write-Host "Pipeline:" $pipeline.value | ConvertTo-Json -Depth 100

答案 1 :(得分:0)

今天上午,我们的构建步骤正在运行,而我们的流程没有任何更改。

我本周早些时候使用失败的特定内部版本ID来解决此问题的测试用例现在也可以正常工作。

Microsoft必须更改了某些内容,此问题随后已得到解决??