Skip to content

Commit 74d4235

Browse files
authored
GitHub REST API: add timeout and retry
1 parent 730f73e commit 74d4235

File tree

2 files changed

+37
-16
lines changed

2 files changed

+37
-16
lines changed

scripts/gha/github.py

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
import shutil
2424

2525
from absl import logging
26+
from requests.adapters import HTTPAdapter
27+
from requests.packages.urllib3.util.retry import Retry
28+
29+
RETRIES = 3
30+
BACKOFF = 5
31+
RETRY_STATUS = (403, 500, 502, 504)
32+
TIMEOUT = 5
2633

2734
OWNER = 'firebase'
2835
REPO = 'firebase-cpp-sdk'
@@ -31,12 +38,26 @@
3138
FIREBASE_URL = '%s/repos/%s/%s' % (BASE_URL, OWNER, REPO)
3239
logging.set_verbosity(logging.INFO)
3340

41+
def requests_retry_session(retries=RETRIES,
42+
backoff_factor=BACKOFF,
43+
status_forcelist=RETRY_STATUS):
44+
session = requests.Session()
45+
retry = Retry(total=retries,
46+
read=retries,
47+
connect=retries,
48+
backoff_factor=backoff_factor,
49+
status_forcelist=status_forcelist)
50+
adapter = HTTPAdapter(max_retries=retry)
51+
session.mount('http://', adapter)
52+
session.mount('https://', adapter)
53+
return session
54+
3455
def create_issue(token, title, label):
3556
"""Create an issue: https://docs.github.com/en/rest/reference/issues#create-an-issue"""
3657
url = f'{FIREBASE_URL}/issues'
3758
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
3859
data = {'title': title, 'labels': [label]}
39-
with requests.post(url, headers=headers, data=json.dumps(data)) as response:
60+
with requests.post(url, headers=headers, data=json.dumps(data), timeout=TIMEOUT) as response:
4061
logging.info("create_issue: %s response: %s", url, response)
4162
return response.json()
4263

@@ -45,7 +66,7 @@ def update_issue(token, issue_number, data):
4566
"""Update an issue: https://docs.github.com/en/rest/reference/issues#update-an-issue"""
4667
url = f'{FIREBASE_URL}/issues/{issue_number}'
4768
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
48-
with requests.patch(url, headers=headers, data=json.dumps(data)) as response:
69+
with requests_retry_session().patch(url, headers=headers, data=json.dumps(data), timeout=TIMEOUT) as response:
4970
logging.info("update_issue: %s response: %s", url, response)
5071

5172

@@ -65,16 +86,16 @@ def search_issues_by_label(label):
6586
"""https://docs.github.com/en/rest/reference/search#search-issues-and-pull-requests"""
6687
url = f'{BASE_URL}/search/issues?q=repo:{OWNER}/{REPO}+label:"{label}"+is:issue'
6788
headers = {'Accept': 'application/vnd.github.v3+json'}
68-
with requests.get(url, headers=headers) as response:
89+
with requests_retry_session().get(url, headers=headers, timeout=TIMEOUT) as response:
6990
logging.info("search_issues_by_label: %s response: %s", url, response)
7091
return response.json()["items"]
7192

7293

73-
def list_comments(issue_number):
94+
def list_comments(token, issue_number):
7495
"""https://docs.github.com/en/rest/reference/issues#list-issue-comments"""
7596
url = f'{FIREBASE_URL}/issues/{issue_number}/comments'
76-
headers = {'Accept': 'application/vnd.github.v3+json'}
77-
with requests.get(url, headers=headers) as response:
97+
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
98+
with requests_retry_session().get(url, headers=headers, timeout=TIMEOUT) as response:
7899
logging.info("list_comments: %s response: %s", url, response)
79100
return response.json()
80101

@@ -84,7 +105,7 @@ def add_comment(token, issue_number, comment):
84105
url = f'{FIREBASE_URL}/issues/{issue_number}/comments'
85106
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
86107
data = {'body': comment}
87-
with requests.post(url, headers=headers, data=json.dumps(data)) as response:
108+
with requests.post(url, headers=headers, data=json.dumps(data), timeout=TIMEOUT) as response:
88109
logging.info("add_comment: %s response: %s", url, response)
89110

90111

@@ -93,15 +114,15 @@ def update_comment(token, comment_id, comment):
93114
url = f'{FIREBASE_URL}/issues/comments/{comment_id}'
94115
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
95116
data = {'body': comment}
96-
with requests.patch(url, headers=headers, data=json.dumps(data)) as response:
117+
with requests_retry_session().patch(url, headers=headers, data=json.dumps(data), timeout=TIMEOUT) as response:
97118
logging.info("update_comment: %s response: %s", url, response)
98119

99120

100121
def delete_comment(token, comment_id):
101122
"""https://docs.github.com/en/rest/reference/issues#delete-an-issue-comment"""
102123
url = f'{FIREBASE_URL}/issues/comments/{comment_id}'
103124
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
104-
with requests.delete(url, headers=headers) as response:
125+
with requests.delete(url, headers=headers, timeout=TIMEOUT) as response:
105126
logging.info("delete_comment: %s response: %s", url, response)
106127

107128

@@ -111,23 +132,23 @@ def add_label(token, issue_number, label):
111132
headers={}
112133
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
113134
data = [label]
114-
with requests.post(url, headers=headers, data=json.dumps(data)) as response:
135+
with requests.post(url, headers=headers, data=json.dumps(data), timeout=TIMEOUT) as response:
115136
logging.info("add_label: %s response: %s", url, response)
116137

117138

118139
def delete_label(token, issue_number, label):
119140
"""https://docs.github.com/en/rest/reference/issues#delete-a-label"""
120141
url = f'{FIREBASE_URL}/issues/{issue_number}/labels/{label}'
121142
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
122-
with requests.delete(url, headers=headers) as response:
143+
with requests.delete(url, headers=headers, timeout=TIMEOUT) as response:
123144
logging.info("delete_label: %s response: %s", url, response)
124145

125146

126147
def list_artifacts(token, run_id):
127148
"""https://docs.github.com/en/rest/reference/actions#list-workflow-run-artifacts"""
128149
url = f'{FIREBASE_URL}/actions/runs/{run_id}/artifacts'
129150
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
130-
with requests.get(url, headers=headers) as response:
151+
with requests_retry_session().get(url, headers=headers, timeout=TIMEOUT) as response:
131152
logging.info("list_artifacts: %s response: %s", url, response)
132153
return response.json()["artifacts"]
133154

@@ -136,7 +157,7 @@ def download_artifact(token, artifact_id, output_path):
136157
"""https://docs.github.com/en/rest/reference/actions#download-an-artifact"""
137158
url = f'{FIREBASE_URL}/actions/artifacts/{artifact_id}/zip'
138159
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
139-
with requests.get(url, headers=headers, stream=True) as response:
160+
with requests.get(url, headers=headers, stream=True, timeout=TIMEOUT) as response:
140161
logging.info("download_artifact: %s response: %s", url, response)
141162
with open(output_path, 'wb') as file:
142163
shutil.copyfileobj(response.raw, file)

scripts/gha/it_workflow.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,15 +192,15 @@ def _get_issue_number(token, title, label):
192192

193193

194194
def _update_comment(token, issue_number, comment):
195-
comment_id = _get_comment_id(issue_number, _COMMENT_SUFFIX)
195+
comment_id = _get_comment_id(token, issue_number, _COMMENT_SUFFIX)
196196
if not comment_id:
197197
github.add_comment(token, issue_number, comment)
198198
else:
199199
github.update_comment(token, comment_id, comment)
200200

201201

202-
def _get_comment_id(issue_number, comment_identifier):
203-
comments = github.list_comments(issue_number)
202+
def _get_comment_id(token, issue_number, comment_identifier):
203+
comments = github.list_comments(token, issue_number)
204204
for comment in comments:
205205
if comment_identifier in comment['body']:
206206
return comment['id']

0 commit comments

Comments
 (0)