mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +00:00
gh-134262: Add retries to generate_sbom.py (#134263)
Co-authored-by: Semyon Moroz <donbarbos@proton.me>
This commit is contained in:
parent
b8998fe2d8
commit
0c5a8b0b55
1 changed files with 18 additions and 1 deletions
|
@ -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"] = [{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue