Skip to content

Commit 5dc22a1

Browse files
authored
Merge 5ac9349 into 65f3068
2 parents 65f3068 + 5ac9349 commit 5dc22a1

File tree

3 files changed

+62
-67
lines changed

3 files changed

+62
-67
lines changed

.github/workflows/cpp-packaging.yml

-1
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,6 @@ jobs:
784784
- name: Use GitHub API to start workflow
785785
shell: bash
786786
run: |
787-
pip install -r scripts/gha/requirements.txt
788787
if [[ -z ${USE_EXPANDED_MATRIX} ]]; then
789788
USE_EXPANDED_MATRIX=0
790789
fi

scripts/gha/github.py

+19-50
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import requests
2222
import json
2323
import shutil
24-
import re
2524

2625
from absl import logging
2726
from requests.adapters import HTTPAdapter
@@ -36,24 +35,9 @@
3635
REPO = 'firebase-cpp-sdk'
3736

3837
BASE_URL = 'https://api.github.com'
39-
GITHUB_API_URL = '%s/repos/%s/%s' % (BASE_URL, OWNER, REPO)
38+
FIREBASE_URL = '%s/repos/%s/%s' % (BASE_URL, OWNER, REPO)
4039
logging.set_verbosity(logging.INFO)
4140

42-
43-
def set_repo_url(repo):
44-
match = re.match(r'https://github\.com/([^/]+)/([^/.]+)', repo)
45-
if not match:
46-
logging.info('Error, only pattern https://github.com/\{repo_owner\}/\{repo_name\} are allowed.')
47-
return False
48-
49-
(repo_owner, repo_name) = match.groups()
50-
global OWNER, REPO, GITHUB_API_URL
51-
OWNER = repo_owner
52-
REPO = repo_name
53-
GITHUB_API_URL = '%s/repos/%s/%s' % (BASE_URL, OWNER, REPO)
54-
return True
55-
56-
5741
def requests_retry_session(retries=RETRIES,
5842
backoff_factor=BACKOFF,
5943
status_forcelist=RETRY_STATUS):
@@ -70,7 +54,7 @@ def requests_retry_session(retries=RETRIES,
7054

7155
def create_issue(token, title, label, body):
7256
"""Create an issue: https://docs.github.com/en/rest/reference/issues#create-an-issue"""
73-
url = f'{GITHUB_API_URL}/issues'
57+
url = f'{FIREBASE_URL}/issues'
7458
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
7559
data = {'title': title, 'labels': [label], 'body': body}
7660
with requests.post(url, headers=headers, data=json.dumps(data), timeout=TIMEOUT) as response:
@@ -80,7 +64,7 @@ def create_issue(token, title, label, body):
8064

8165
def get_issue_body(token, issue_number):
8266
"""https://docs.github.com/en/rest/reference/issues#get-an-issue-comment"""
83-
url = f'{GITHUB_API_URL}/issues/{issue_number}'
67+
url = f'{FIREBASE_URL}/issues/{issue_number}'
8468
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
8569
with requests_retry_session().get(url, headers=headers, timeout=TIMEOUT) as response:
8670
logging.info("get_issue_body: %s response: %s", url, response)
@@ -89,7 +73,7 @@ def get_issue_body(token, issue_number):
8973

9074
def update_issue(token, issue_number, data):
9175
"""Update an issue: https://docs.github.com/en/rest/reference/issues#update-an-issue"""
92-
url = f'{GITHUB_API_URL}/issues/{issue_number}'
76+
url = f'{FIREBASE_URL}/issues/{issue_number}'
9377
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
9478
with requests_retry_session().patch(url, headers=headers, data=json.dumps(data), timeout=TIMEOUT) as response:
9579
logging.info("update_issue: %s response: %s", url, response)
@@ -118,7 +102,7 @@ def search_issues_by_label(label):
118102

119103
def list_comments(token, issue_number):
120104
"""https://docs.github.com/en/rest/reference/issues#list-issue-comments"""
121-
url = f'{GITHUB_API_URL}/issues/{issue_number}/comments'
105+
url = f'{FIREBASE_URL}/issues/{issue_number}/comments'
122106
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
123107
with requests_retry_session().get(url, headers=headers, timeout=TIMEOUT) as response:
124108
logging.info("list_comments: %s response: %s", url, response)
@@ -127,7 +111,7 @@ def list_comments(token, issue_number):
127111

128112
def add_comment(token, issue_number, comment):
129113
"""https://docs.github.com/en/rest/reference/issues#create-an-issue-comment"""
130-
url = f'{GITHUB_API_URL}/issues/{issue_number}/comments'
114+
url = f'{FIREBASE_URL}/issues/{issue_number}/comments'
131115
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
132116
data = {'body': comment}
133117
with requests.post(url, headers=headers, data=json.dumps(data), timeout=TIMEOUT) as response:
@@ -136,7 +120,7 @@ def add_comment(token, issue_number, comment):
136120

137121
def update_comment(token, comment_id, comment):
138122
"""https://docs.github.com/en/rest/reference/issues#update-an-issue-comment"""
139-
url = f'{GITHUB_API_URL}/issues/comments/{comment_id}'
123+
url = f'{FIREBASE_URL}/issues/comments/{comment_id}'
140124
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
141125
data = {'body': comment}
142126
with requests_retry_session().patch(url, headers=headers, data=json.dumps(data), timeout=TIMEOUT) as response:
@@ -145,15 +129,15 @@ def update_comment(token, comment_id, comment):
145129

146130
def delete_comment(token, comment_id):
147131
"""https://docs.github.com/en/rest/reference/issues#delete-an-issue-comment"""
148-
url = f'{GITHUB_API_URL}/issues/comments/{comment_id}'
132+
url = f'{FIREBASE_URL}/issues/comments/{comment_id}'
149133
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
150134
with requests.delete(url, headers=headers, timeout=TIMEOUT) as response:
151135
logging.info("delete_comment: %s response: %s", url, response)
152136

153137

154138
def add_label(token, issue_number, label):
155139
"""https://docs.github.com/en/rest/reference/issues#add-labels-to-an-issue"""
156-
url = f'{GITHUB_API_URL}/issues/{issue_number}/labels'
140+
url = f'{FIREBASE_URL}/issues/{issue_number}/labels'
157141
headers={}
158142
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
159143
data = [label]
@@ -163,15 +147,15 @@ def add_label(token, issue_number, label):
163147

164148
def delete_label(token, issue_number, label):
165149
"""https://docs.github.com/en/rest/reference/issues#delete-a-label"""
166-
url = f'{GITHUB_API_URL}/issues/{issue_number}/labels/{label}'
150+
url = f'{FIREBASE_URL}/issues/{issue_number}/labels/{label}'
167151
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
168152
with requests.delete(url, headers=headers, timeout=TIMEOUT) as response:
169153
logging.info("delete_label: %s response: %s", url, response)
170154

171155

172156
def list_artifacts(token, run_id):
173157
"""https://docs.github.com/en/rest/reference/actions#list-workflow-run-artifacts"""
174-
url = f'{GITHUB_API_URL}/actions/runs/{run_id}/artifacts'
158+
url = f'{FIREBASE_URL}/actions/runs/{run_id}/artifacts'
175159
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
176160
with requests_retry_session().get(url, headers=headers, timeout=TIMEOUT) as response:
177161
logging.info("list_artifacts: %s response: %s", url, response)
@@ -180,7 +164,7 @@ def list_artifacts(token, run_id):
180164

181165
def download_artifact(token, artifact_id, output_path):
182166
"""https://docs.github.com/en/rest/reference/actions#download-an-artifact"""
183-
url = f'{GITHUB_API_URL}/actions/artifacts/{artifact_id}/zip'
167+
url = f'{FIREBASE_URL}/actions/artifacts/{artifact_id}/zip'
184168
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
185169
with requests.get(url, headers=headers, stream=True, timeout=TIMEOUT) as response:
186170
logging.info("download_artifact: %s response: %s", url, response)
@@ -190,18 +174,17 @@ def download_artifact(token, artifact_id, output_path):
190174

191175
def dismiss_review(token, pull_number, review_id, message):
192176
"""https://docs.github.com/en/rest/reference/pulls#dismiss-a-review-for-a-pull-request"""
193-
url = f'{GITHUB_API_URL}/pulls/{pull_number}/reviews/{review_id}/dismissals'
177+
url = f'{FIREBASE_URL}/pulls/{pull_number}/reviews/{review_id}/dismissals'
194178
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
195179
data = {'message': message}
196180
with requests_retry_session().put(url, headers=headers, data=json.dumps(data),
197181
stream=True, timeout=TIMEOUT) as response:
198182
logging.info("dismiss_review: %s response: %s", url, response)
199183
return response.json()
200184

201-
202185
def get_reviews(token, pull_number):
203186
"""https://docs.github.com/en/rest/reference/pulls#list-reviews-for-a-pull-request"""
204-
url = f'{GITHUB_API_URL}/pulls/{pull_number}/reviews'
187+
url = f'{FIREBASE_URL}/pulls/{pull_number}/reviews'
205188
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
206189
page = 1
207190
per_page = 100
@@ -220,32 +203,19 @@ def get_reviews(token, pull_number):
220203
return results
221204

222205

223-
def create_workflow_dispatch(token, workflow_id, ref, inputs):
206+
def workflow_dispatch(token, workflow_id, ref, inputs):
224207
"""https://docs.github.com/en/rest/reference/actions#create-a-workflow-dispatch-event"""
225-
url = f'{GITHUB_API_URL}/actions/workflows/{workflow_id}/dispatches'
208+
url = f'{FIREBASE_URL}/actions/workflows/{workflow_id}/dispatches'
226209
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
227210
data = {'ref': ref, 'inputs': inputs}
228211
with requests.post(url, headers=headers, data=json.dumps(data),
229212
stream=True, timeout=TIMEOUT) as response:
230-
logging.info("create_workflow_dispatch: %s response: %s", url, response)
231-
# Response Status: 204 No Content
232-
return True if response.status_code == 204 else False
233-
234-
235-
def list_workflows(token, workflow_id, branch):
236-
"""https://docs.github.com/en/rest/reference/actions#list-workflow-runs-for-a-repository"""
237-
url = f'{GITHUB_API_URL}/actions/workflows/{workflow_id}/runs'
238-
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
239-
data = {'event': 'workflow_dispatch', 'branch': branch}
240-
with requests.get(url, headers=headers, data=json.dumps(data),
241-
stream=True, timeout=TIMEOUT) as response:
242-
logging.info("list_workflows: %s response: %s", url, response)
243-
return response.json()
213+
logging.info("workflow_dispatch: %s response: %s", url, response)
244214

245215

246216
def create_pull_request(token, head, base, title, body, maintainer_can_modify):
247217
"""https://docs.github.com/en/rest/reference/pulls#create-a-pull-request"""
248-
url = f'{GITHUB_API_URL}/pulls'
218+
url = f'{FIREBASE_URL}/pulls'
249219
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
250220
data = {'head': head, 'base': base, 'title': title, 'body': body,
251221
'maintainer_can_modify': maintainer_can_modify}
@@ -254,10 +224,9 @@ def create_pull_request(token, head, base, title, body, maintainer_can_modify):
254224
logging.info("create_pull_request: %s response: %s", head, response)
255225
return True if response.status_code == 201 else False
256226

257-
258227
def list_pull_requests(token, state, head, base):
259228
"""https://docs.github.com/en/rest/reference/pulls#list-pull-requests"""
260-
url = f'{GITHUB_API_URL}/pulls'
229+
url = f'{FIREBASE_URL}/pulls'
261230
headers = {'Accept': 'application/vnd.github.v3+json', 'Authorization': f'token {token}'}
262231
page = 1
263232
per_page = 100

scripts/gha/trigger_workflow.py

+43-16
Original file line numberDiff line numberDiff line change
@@ -29,43 +29,70 @@
2929
"""
3030

3131
import argparse
32+
import json
33+
import os
34+
import re
3235
import subprocess
3336
import time
3437
import urllib.parse
35-
import github
3638

3739
def main():
3840
args = parse_cmdline_args()
41+
if args.repo is None:
42+
args.repo=subprocess.check_output(['git', 'config', '--get', 'remote.origin.url']).decode('utf-8').rstrip('\n').lower()
43+
print('autodetected repo: %s' % args.repo)
3944
if args.branch is None:
40-
args.branch=subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).decode('utf-8').rstrip('\n')
41-
print('autodetected branch: %s' % args.branch)
42-
if args.repo: # else use default firebase/firebase-cpp-sdk repo
43-
if not github.set_repo_url(args.repo):
45+
args.branch=subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).decode('utf-8').rstrip('\n')
46+
print('autodetected branch: %s' % args.branch)
47+
if not args.repo.startswith('https://github.com/'):
48+
print('Error, only https://github.com/ repositories are allowed.')
4449
exit(2)
45-
else:
46-
print('set repo url to: %s' % github.GITHUB_API_URL)
50+
(repo_owner, repo_name) = re.match(r'https://github\.com/([^/]+)/([^/.]+)', args.repo).groups()
4751

52+
# POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches
53+
request_url = 'https://api.github.com/repos/%s/%s/actions/workflows/%s/dispatches' % (repo_owner, repo_name, args.workflow)
4854
json_params = {}
4955
for param in args.param:
50-
json_params[param[0]] = param[1]
56+
json_params[param[0]] = param[1]
57+
json_text = '{"ref":%s,"inputs":%s}' % (json.dumps(args.branch), json.dumps(json_params))
5158
if args.verbose or args.dryrun:
52-
print(f'request_url: {github.GITHUB_API_URL}/actions/workflows/{args.workflow}/dispatches')
53-
print(f'request_body: ref: {args.branch}, inputs: {json_params}')
59+
print('request_url: %s' % request_url)
60+
print('request_body: %s' % json_text)
5461
if args.dryrun:
5562
return(0)
5663

5764
print('Sending request to GitHub API...')
58-
if not github.create_workflow_dispatch(args.token, args.workflow, args.branch, json_params):
59-
print('%sFailed to trigger workflow %s' % (
60-
'::error ::' if args.in_github_action else '', args.workflow))
65+
run_output = subprocess.check_output([args.curl,
66+
'-s', '-o', '-', '-w', '\nHTTP status %{http_code}\n',
67+
'-X', 'POST',
68+
'-H', 'Accept: application/vnd.github.v3+json',
69+
'-H', 'Authorization: token %s' % args.token,
70+
request_url, '-d', json_text]
71+
+ ([] if not args.verbose else ['-v'])).decode('utf-8').rstrip('\n')
72+
if args.verbose:
73+
print(run_output)
74+
if not re.search('HTTP status 2[0-9][0-9]$', run_output):
75+
if not args.verbose:
76+
print(run_output)
77+
# Super quick and dirty way to get the message text since the appended status code means that
78+
# the contents are not valid JSON.
79+
error_message = re.search(r'"message": "([^"]+)"', run_output).group(1)
80+
print('%sFailed to trigger workflow %s: %s' % (
81+
'::error ::' if args.in_github_action else '', args.workflow, error_message))
6182
return(-1)
6283

6384
print('Success!')
6485
time.sleep(args.sleep) # Give a few seconds for the job to become queued.
6586
# Unfortunately, the GitHub REST API doesn't return the new workflow's run ID.
6687
# Query the list of workflows to find the one we just added.
67-
workflows = github.list_workflows(args.token, args.workflow, args.branch)
88+
request_url = 'https://api.github.com/repos/%s/%s/actions/workflows/%s/runs?event=workflow_dispatch&branch=%s' % (repo_owner, repo_name, args.workflow, args.branch)
89+
run_output = subprocess.check_output([args.curl,
90+
'-s', '-X', 'GET',
91+
'-H', 'Accept: application/vnd.github.v3+json',
92+
'-H', 'Authorization: token %s' % args.token,
93+
request_url]).decode('utf-8').rstrip('\n')
6894
run_id = 0
95+
workflows = json.loads(run_output)
6996
if "workflow_runs" in workflows:
7097
branch_sha = subprocess.check_output(['git', 'rev-parse', args.branch]).decode('utf-8').rstrip('\n')
7198
for workflow in workflows['workflow_runs']:
@@ -81,8 +108,8 @@ def main():
81108
workflow_url = 'https://github.com/firebase/firebase-cpp-sdk/actions/runs/%s' % (run_id)
82109
else:
83110
# Couldn't get a run ID, use a generic URL.
84-
workflow_url = '/%s/actions/workflows/%s?query=%s+%s' % (
85-
github.GITHUB_API_URL, args.workflow,
111+
workflow_url = 'https://github.com/%s/%s/actions/workflows/%s?query=%s+%s' % (
112+
repo_owner, repo_name, args.workflow,
86113
urllib.parse.quote('event:workflow_dispatch', safe=''),
87114
urllib.parse.quote('branch:'+args.branch, safe=''))
88115
print('%sStarted workflow %s: %s' % ('::warning ::' if args.in_github_action else '',

0 commit comments

Comments
 (0)