From 5e459dfc789427a00a40b3ecfb8f690bb1ce9af8 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Thu, 1 Oct 2026 13:17:46 -0500 Subject: [PATCH] chore: add retry logic to installer scripts --- scripts/install.ps1 | 39 +++++++++++++++++++++++++++++++++++++-- scripts/install.sh | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 65 insertions(+), 10 deletions(-) diff --git a/scripts/install.ps1 b/scripts/install.ps1 index 0a58260..4038052 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -58,14 +58,49 @@ $ChecksumUrl = "$DownloadUrl.sha256" $TempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([System.Guid]::NewGuid().ToString()) New-Item -ItemType Directory -Force -Path $TempDir | Out-Null +function Download-File { + param( + [string]$Uri, + [string]$OutFile, + [int]$MaxRetries = 3 + ) + + $Attempt = 0 + $DelaySeconds = 2 + + while ($Attempt -lt $MaxRetries) { + $Attempt++ + + try { + Invoke-WebRequest -Uri $Uri -OutFile $OutFile -Headers @{ "User-Agent" = "onx-installer" } + + return + } catch { + $ErrorMessage = $_.Exception.Message + + if ($Attempt -lt $MaxRetries) { + Write-Warning "Download attempt $Attempt failed ($ErrorMessage). Retrying in ${DelaySeconds}s..." + + Start-Sleep -Seconds $DelaySeconds + + $DelaySeconds = $DelaySeconds * 2 + } else { + Write-Error "Failed to download $Uri after $MaxRetries attempts: $ErrorMessage" + + exit 1 + } + } + } +} + try { $ArchiveFile = Join-Path $TempDir $ArchiveName $ChecksumFile = Join-Path $TempDir "$ArchiveName.sha256" Write-Host "Downloading $BinaryName $Version for $Target..." - Invoke-WebRequest -Uri $DownloadUrl -OutFile $ArchiveFile - Invoke-WebRequest -Uri $ChecksumUrl -OutFile $ChecksumFile + Download-File -Uri $DownloadUrl -OutFile $ArchiveFile + Download-File -Uri $ChecksumUrl -OutFile $ChecksumFile Write-Host "Verifying SHA256 checksum..." diff --git a/scripts/install.sh b/scripts/install.sh index c2228af..9b6c057 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -71,15 +71,35 @@ TARGET="${ARCH}-${OS}" download() { local url="$1" local output="$2" + local max_retries=3 + local attempt=0 + local delay=2 - if command -v curl >/dev/null 2>&1; then - curl -fsSL "$url" -o "$output" - elif command -v wget >/dev/null 2>&1; then - wget -qO "$output" "$url" - else - echo "Error: Neither curl nor wget was found. Please install one of them." >&2 - exit 1 - fi + while [ "$attempt" -lt "$max_retries" ]; do + attempt=$((attempt + 1)) + + if command -v curl >/dev/null 2>&1; then + if curl -fsSL --retry 3 --retry-delay 2 -A "onx-installer" "$url" -o "$output"; then + return 0 + fi + elif command -v wget >/dev/null 2>&1; then + if wget -q --tries=3 --waitretry=2 --user-agent="onx-installer" -O "$output" "$url"; then + return 0 + fi + else + echo "Error: Neither curl nor wget was found. Please install one of them." >&2 + exit 1 + fi + + if [ "$attempt" -lt "$max_retries" ]; then + echo "Download attempt ${attempt} failed. Retrying in ${delay}s..." >&2 + sleep "$delay" + delay=$((delay * 2)) + fi + done + + echo "Error: Failed to download ${url} after ${max_retries} attempts." >&2 + exit 1 } if [ -z "${REQUESTED_VERSION}" ]; then