2323import shutil
2424
2525from 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
2734OWNER = 'firebase'
2835REPO = 'firebase-cpp-sdk'
3138FIREBASE_URL = '%s/repos/%s/%s' % (BASE_URL , OWNER , REPO )
3239logging .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+
3455def 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
100121def 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
118139def 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
126147def 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 )
0 commit comments