Sleep in case the remaining api calls fall below 100
Before we start a build and before we want to upload
This commit is contained in:
parent
1be021c37c
commit
3b01ae2d7a
36
autobuild.py
36
autobuild.py
@ -26,6 +26,7 @@ import tempfile
|
||||
import shutil
|
||||
import json
|
||||
import io
|
||||
from datetime import datetime, timezone
|
||||
from enum import Enum
|
||||
from hashlib import sha256
|
||||
from typing import Generator, Union, AnyStr, List, Any, Dict, Tuple, Set, Optional
|
||||
@ -464,6 +465,7 @@ def build_package(build_type: str, pkg, msys2_root: _PathLike, builddir: _PathLi
|
||||
to_upload.extend([os.path.join(pkg_dir, e) for e in found])
|
||||
|
||||
except (subprocess.CalledProcessError, BuildError) as e:
|
||||
wait_for_api_limit_reset()
|
||||
release = repo.get_release("staging-failed")
|
||||
for entry in pkg.get_failed_names(build_type):
|
||||
failed_data = {}
|
||||
@ -475,6 +477,7 @@ def build_package(build_type: str, pkg, msys2_root: _PathLike, builddir: _PathLi
|
||||
|
||||
raise BuildError(e)
|
||||
else:
|
||||
wait_for_api_limit_reset()
|
||||
release = repo.get_release("staging-" + pkg.get_repo_type())
|
||||
for path in to_upload:
|
||||
upload_asset(release, path)
|
||||
@ -505,6 +508,12 @@ def run_build(args: Any) -> None:
|
||||
raise SystemExit("ERROR: msys2_root not functional", e)
|
||||
|
||||
while True:
|
||||
wait_for_api_limit_reset()
|
||||
|
||||
if (time.monotonic() - start_time) >= SOFT_TIMEOUT:
|
||||
print("timeout reached")
|
||||
break
|
||||
|
||||
pkgs = get_buildqueue_with_status(full_details=True)
|
||||
update_status(pkgs)
|
||||
todo = get_package_to_build(pkgs, build_types, args.reverse)
|
||||
@ -512,10 +521,6 @@ def run_build(args: Any) -> None:
|
||||
break
|
||||
pkg, build_type = todo
|
||||
|
||||
if (time.monotonic() - start_time) >= SOFT_TIMEOUT:
|
||||
print("timeout reached")
|
||||
break
|
||||
|
||||
try:
|
||||
with gha_group(f"[{ pkg['repo'] }] [{ build_type }] { pkg['name'] }..."):
|
||||
build_package(build_type, pkg, msys2_root, builddir)
|
||||
@ -1114,7 +1119,7 @@ def get_credentials(optional: bool = False) -> Dict[str, Any]:
|
||||
raise Exception("'GITHUB_TOKEN' or 'GITHUB_USER'/'GITHUB_PASS' env vars not set")
|
||||
|
||||
|
||||
def get_repo(optional_credentials: bool = False) -> Repository:
|
||||
def get_github(optional_credentials: bool = False) -> Github:
|
||||
kwargs = get_credentials(optional=optional_credentials)
|
||||
has_creds = bool(kwargs)
|
||||
# 100 is the maximum allowed
|
||||
@ -1122,10 +1127,29 @@ def get_repo(optional_credentials: bool = False) -> Repository:
|
||||
gh = Github(**kwargs)
|
||||
if not has_creds and optional_credentials:
|
||||
print(f"[Warning] Rate limit status: {gh.get_rate_limit().core}", file=sys.stderr)
|
||||
print(gh.get_rate_limit(), file=sys.stderr)
|
||||
return gh
|
||||
|
||||
|
||||
def get_repo(optional_credentials: bool = False) -> Repository:
|
||||
gh = get_github(optional_credentials=optional_credentials)
|
||||
return gh.get_repo(REPO, lazy=True)
|
||||
|
||||
|
||||
def wait_for_api_limit_reset(min_remaining: int = 100, min_sleep: float = 60) -> None:
|
||||
gh = get_github(optional_credentials=True)
|
||||
while True:
|
||||
core = gh.get_rate_limit().core
|
||||
if core.remaining > min_remaining:
|
||||
break
|
||||
reset = core.reset.replace(tzinfo=timezone.utc)
|
||||
now = datetime.now(timezone.utc)
|
||||
wait = (reset - now).total_seconds()
|
||||
if wait < min_sleep:
|
||||
wait = min_sleep
|
||||
print(f"{core.remaining} API calls left, waiting for {wait} seconds")
|
||||
time.sleep(wait)
|
||||
|
||||
|
||||
def main(argv: List[str]):
|
||||
parser = argparse.ArgumentParser(description="Build packages", allow_abbrev=False)
|
||||
parser.set_defaults(func=lambda *x: parser.print_help())
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user