gh-134262: Add retries to generate_sbom.py (#134263)

Co-authored-by: Semyon Moroz <donbarbos@proton.me>
This commit is contained in:
Emma Smith 2025-05-21 09:14:36 -04:00 committed by GitHub
parent b8998fe2d8
commit 0c5a8b0b55
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -7,7 +7,9 @@ import os
import re import re
import subprocess import subprocess
import sys import sys
import time
import typing import typing
import urllib.error
import urllib.request import urllib.request
from pathlib import Path, PurePosixPath, PureWindowsPath from pathlib import Path, PurePosixPath, PureWindowsPath
@ -161,6 +163,21 @@ def get_externals() -> list[str]:
return externals return externals
def download_with_retries(download_location: str,
max_retries: int = 5,
base_delay: float = 2.0) -> typing.Any:
"""Download a file with exponential backoff retry."""
for attempt in range(max_retries):
try:
resp = urllib.request.urlopen(download_location)
except urllib.error.URLError as ex:
if attempt == max_retries:
raise ex
time.sleep(base_delay**attempt)
else:
return resp
def check_sbom_packages(sbom_data: dict[str, typing.Any]) -> None: def check_sbom_packages(sbom_data: dict[str, typing.Any]) -> None:
"""Make a bunch of assertions about the SBOM package data to ensure it's consistent.""" """Make a bunch of assertions about the SBOM package data to ensure it's consistent."""
@ -175,7 +192,7 @@ def check_sbom_packages(sbom_data: dict[str, typing.Any]) -> None:
# and that the download URL is valid. # and that the download URL is valid.
if "checksums" not in package or "CI" in os.environ: if "checksums" not in package or "CI" in os.environ:
download_location = package["downloadLocation"] download_location = package["downloadLocation"]
resp = urllib.request.urlopen(download_location) resp = download_with_retries(download_location)
error_if(resp.status != 200, f"Couldn't access URL: {download_location}'") error_if(resp.status != 200, f"Couldn't access URL: {download_location}'")
package["checksums"] = [{ package["checksums"] = [{