编写 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测试管理(上)

为啥 Azure DevOps / TFS 中忽略了我的 repositoryPath?

将 Nuget 包从本地 TFS2017 发布到 azure DevOps

将 TFS2017.3 升级到 Azure DevOps 服务器