编写 Azure Devops / TFS API 脚本时 - 有没有办法在不退出的情况下处理“Get Repo 不存在”错误响应?
Posted
技术标签:
【中文标题】编写 Azure Devops / TFS API 脚本时 - 有没有办法在不退出的情况下处理“Get Repo 不存在”错误响应?【英文标题】:When scripting Azure Devops / TFS API - Is there a way to handle "Get Repo does not exist" error response without exiting? 【发布时间】:2020-03-17 17:48:14 【问题描述】:在 TFS 管道内部,我使用 Powershell 脚本中的 Get Repo API 来验证 TFS 中是否存在 GIT 存储库,然后脚本开始在 TFS 中创建新的 GIT 存储库。
我已经验证 Invoke-Method 语法很好。当 TFS GIT 存储库存在时,它会毫无问题地返回值。
当 repo 不存在时,API 会响应以下错误并以代码“1”退出。
Invoke-RestMethod : "$id":"1","innerException":null,"message":"TF401019: The
Git repository with name or identifier TFS-GIT-REPO-NAME-GOES-HERE does not
exist or you do not have permissions for the operation you are attempting.","ty
peName":"Microsoft.TeamFoundation.Git.Server.GitRepositoryNotFoundException,
Microsoft.TeamFoundation.Git.Server, Version=14.0.0.0, Culture=neutral, PublicK
eyToken=b03f5f7f11d50a3a","typeKey":"GitRepositoryNotFoundException","errorCode
":0,"eventId":3000
At //filepath/scriptName.ps1
+ $results= Invoke-RestMethod @args
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:Htt
pWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShe
ll.Commands.InvokeRestMethodCommand
##[error]PowerShell exited with code '1'.
目前,Invoke-RestMethod 行的结构如下:
$results= Invoke-RestMethod @args
我希望脚本能够将这种情况处理为“不存在”而不会崩溃。
谁能建议我忽略此错误代码的方法?欢迎任何建设性的建议!谢谢!
【问题讨论】:
您好,nuprap,您有机会实施 Darrell Agee 建议的解决方案吗?你能解决吗? 我最终从 Get Repo List API 中提取并遍历返回的 repos 列表以进行匹配。我将在星期一发布详细信息。 感谢您的友好分享。自己修复总是更好;正如您了解它是如何工作的!:) 您也可以将您的回复标记为答案。这也将帮助社区中的其他人。 发布更新解决方案。 【参考方案1】:根据您的答案上下文,您需要一个 try-catch 块。这意味着如果在 try 部分发生错误,它不会使程序崩溃,而是会捕获错误并让您决定在块的 catch 部分中做什么。如果您想了解更多信息,请转到here。还有另一个部分称为 finally 块,无论您的代码是否失败,它都会执行。不过,这部分是完全可选的。
try $results= Invoke-RestMethod @args
catch "do nothing or record the error out to a log"
try $results= Invoke-RestMethod @args
catch "do nothing or record the error out to a log"
finally "do something else"
【讨论】:
谢谢!我还将按照您的建议将 Get Repo List API 调用包装在 Try/Catch 中。【参考方案2】:我使用 Get Repo List API 来收集项目中的所有 repo。 Documentation here.
... /_apis/git/repositories?api-version=5.1
从那里,我检查了 Get Repo List 结果是否与我正在寻找的任何 repo 名称匹配。如果匹配,我会在屏幕上写一个通知,并从我的查询数组中删除 repo 名称。
$getRepoListResultsTemp = tfsRepoAPI $BuildPathStage $apiModeTemp $DIRdata
$repoCheckArray = $newRepoName.split(",")
$repoCheckCount = $repoCheckArray.count
if ($repoCheckCount -gt 0)
foreach ($tfsRepoName in $getRepoListResultsTemp[0].value.name)
foreach ($repoCheckName in $repoCheckArray)
if ($tfsRepoName -eq $repoCheckName)
write-host "The repo exists. The repo name is $tfsRepoName"
$repoCheckArray = $repoCheckArray | ? $_ -ne $tfsRepoName
然后我遍历查询数组中的每个剩余条目,向屏幕写入通知,并为每个条目返回 null。
if (-! [string]::IsNullOrWhiteSpace($repoCheckArray))
foreach ($repoCheckName in $repoCheckArray)
write-host "Repo does not exist - $repoCheckName"
return $null,$null
对于存储库列表中存在的名称,他们将启动 Get Repo API 并收集必要的数据。 Documentation here.
... /_apis/git/repositories/" + $repoName+ "?api-version=5.1
【讨论】:
嗨@nuprap,要获取特定repo的详细信息,我们需要在Get Repo API中发送repo ID,这是如何在上面的脚本中完成的?我的意思是作为你提到的最后一段的一部分 $reponame... 这个 repo ID 吗?以上是关于编写 Azure Devops / TFS API 脚本时 - 有没有办法在不退出的情况下处理“Get Repo 不存在”错误响应?的主要内容,如果未能解决你的问题,请参考以下文章
Tfs / Azure DevOps 客户端库合并 Azure DevOps 分支上的冲突解决
text 创建构建代理 - devops azure(TFS在线)
为啥 Azure DevOps / TFS 中忽略了我的 repositoryPath?