首页 > 解决方案 > Try Catch Powershell 中的重试问题

问题描述

我正在尝试通过 http 触发器使用 Azure 函数和 powershell 脚本执行 ACR 到 ACR 同步。我添加了一个重试逻辑,在函数因错误而失败之前重试 3 次。但是,重试逻辑似乎无法按预期工作。下面是代码,请帮忙

using namespace System.Net
param($Request, $TriggerMetadata)

$global:erroractionpreference = 1

$counter = 0
$error.Clear()

do {
    Write-Host "ACR to ACR sync triggered"
    az login --service-principal --username $env:APP_ID --password $env:PASSWORD --tenant $env:TENANT_ID
    Write-Host $Request.Body.action
    $repo = $Request.Body.target.repository | Out-String
    $repo= $repo -replace "\n",""
    $aztag  = $Request.Body.target.tag | Out-String
    $aztag= $aztag -replace "\n",""
    $imageString = "${repo}:${aztag}"
    Write-Host $imageString
    try {
        az acr import --name $env:acr_name --source "$env:promoted_acr_name.azurecr.io/${imageString}" --image "${imageString}" --username $env:PromotedAPPID --password $env:PromotedPassword --force
    }
    catch {
        $ErrorMessage = $_.Exception.Message
        Write-Output "Sync failed with error: $ErrorMessage"
        Write-Host "Retrying ACR to ACR sync"
        $counter += 1
        Write-Host "Attempt number: $counter"
        Start-Sleep -Seconds 120
        Continue
    }
    if(!$error){
        Exit
    }
} while ($counter -lt 4)

if($counter -gt 3){
    Write-Host "Sync Failed"
    $StatusCode = [HttpStatusCode]::BadRequest
}
else {
    Write-Host "imported image from ACR to ACR"
    $StatusCode = [HttpStatusCode]::OK
}

标签: powershellazure-functions

解决方案


谢谢哈兹瑞尔。_ 发布您的答案以帮助其他社区成员。

以下是删除 ContinueExit语句后的代码。

using namespace System.Net
param($Request, $TriggerMetadata)

$global:erroractionpreference = 1

$counter = 0
$error.Clear()

do {
    Write-Host "ACR to ACR sync triggered"
    az login --service-principal --username $env:APP_ID --password $env:PASSWORD --tenant $env:TENANT_ID
    Write-Host $Request.Body.action
    $repo = $Request.Body.target.repository | Out-String
    $repo= $repo -replace "\n",""
    $aztag  = $Request.Body.target.tag | Out-String
    $aztag= $aztag -replace "\n",""
    $imageString = "${repo}:${aztag}"
    Write-Host $imageString
    try {
        az acr import --name $env:acr_name --source "$env:promoted_acr_name.azurecr.io/${imageString}" --image "${imageString}" --username $env:PromotedAPPID --password $env:PromotedPassword --force
    }
    catch {
        $ErrorMessage = $_.Exception.Message
        Write-Output "Sync failed with error: $ErrorMessage"
        Write-Host "Retrying ACR to ACR sync"
        $counter += 1
        Write-Host "Attempt number: $counter"
        Start-Sleep -Seconds 120
      
    }
    
} while ($counter -lt 4)

if($counter -gt 3){
    Write-Host "Sync Failed"
    $StatusCode = [HttpStatusCode]::BadRequest
}
else {
    Write-Host "imported image from ACR to ACR"
    $StatusCode = [HttpStatusCode]::OK
}

推荐阅读