quickstarts/microsoft.devcenter/devbox-ready-to-code-image/tools/artifacts/_common/windows-retry-utils.psm1 (46 lines of code) (raw):
function LogError($e, $message) {
Write-Host "$message"
Write-Host -Object $e
Write-Host -Object $e.ScriptStackTrace
}
function RunWithRetries(
[ScriptBlock] $runBlock,
[ScriptBlock] $onFailureBlock = {},
[int] $retryAttempts = 5,
[int] $waitBeforeRetrySeconds = 30,
[bool] $ignoreFailure = $false,
[switch] $exponentialBackoff
) {
[int] $retriesLeft = $retryAttempts
while ($retriesLeft -ge 0) {
try {
& $runBlock
break
}
catch {
if ($retriesLeft -le 0) {
if ($onFailureBlock) {
& $onFailureBlock
}
if ($ignoreFailure) {
LogError $_ "[WARN] Ignoring the failure"
break
}
else {
throw
}
}
else {
if ($exponentialBackoff) {
$totalDelay = [Math]::Pow(2, $retryAttempts - $retriesLeft) * $waitBeforeRetrySeconds
}
else {
$totalDelay = $waitBeforeRetrySeconds
}
Write-Host "[WARN] Attempt failed: $_. Retrying in $totalDelay seconds. Retries left: $retriesLeft"
$retriesLeft--
Start-Sleep -Seconds $totalDelay
}
}
}
}