codebuild/cd/pip-install-with-retry.py (27 lines of code) (raw):
import time
import sys
import subprocess
DOCS = """Given cmdline args, executes: python3 -m pip install [args...]
Keeps retrying until the new version becomes available in pypi (or we time out)"""
if len(sys.argv) < 2:
sys.exit(DOCS)
RETRY_INTERVAL_SECS = 10
GIVE_UP_AFTER_SECS = 60 * 15
pip_install_args = [sys.executable, '-m', 'pip', 'install'] + sys.argv[1:]
start_time = time.time()
while True:
print(subprocess.list2cmdline(pip_install_args))
result = subprocess.run(pip_install_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout = result.stdout.decode().strip()
if stdout:
print(stdout)
if result.returncode == 0:
# success
sys.exit(0)
if "could not find a version" in stdout.lower():
elapsed_secs = time.time() - start_time
if elapsed_secs < GIVE_UP_AFTER_SECS:
# try again
print("Retrying in", RETRY_INTERVAL_SECS, "secs...")
time.sleep(RETRY_INTERVAL_SECS)
continue
else:
print("Giving up on retries after", int(elapsed_secs), "total secs.")
# fail
sys.exit(result.returncode)