mirror of https://github.com/grpc/grpc.git
Merge pull request #17505 from lidizheng/check-on-pr
Utilize the GitHub Check Featurepull/17557/head
commit
916aeffa66
10 changed files with 156 additions and 9 deletions
@ -0,0 +1,120 @@ |
||||
# Copyright 2018 The gRPC Authors |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
|
||||
from __future__ import print_function |
||||
import os |
||||
import json |
||||
import time |
||||
import datetime |
||||
|
||||
import requests |
||||
import jwt |
||||
|
||||
_GITHUB_API_PREFIX = 'https://api.github.com' |
||||
_GITHUB_REPO = 'grpc/grpc' |
||||
_GITHUB_APP_ID = 22338 |
||||
_INSTALLATION_ID = 519109 |
||||
|
||||
_ACCESS_TOKEN_CACHE = None |
||||
|
||||
|
||||
def _jwt_token(): |
||||
github_app_key = open( |
||||
os.path.join(os.environ['KOKORO_KEYSTORE_DIR'], |
||||
'73836_grpc_checks_private_key'), 'rb').read() |
||||
return jwt.encode( |
||||
{ |
||||
'iat': int(time.time()), |
||||
'exp': int(time.time() + 60 * 10), # expire in 10 minutes |
||||
'iss': _GITHUB_APP_ID, |
||||
}, |
||||
github_app_key, |
||||
algorithm='RS256') |
||||
|
||||
|
||||
def _access_token(): |
||||
global _ACCESS_TOKEN_CACHE |
||||
if _ACCESS_TOKEN_CACHE == None or _ACCESS_TOKEN_CACHE['exp'] < time.time(): |
||||
resp = requests.post( |
||||
url='https://api.github.com/app/installations/%s/access_tokens' % |
||||
_INSTALLATION_ID, |
||||
headers={ |
||||
'Authorization': 'Bearer %s' % _jwt_token().decode('ASCII'), |
||||
'Accept': 'application/vnd.github.machine-man-preview+json', |
||||
}) |
||||
_ACCESS_TOKEN_CACHE = { |
||||
'token': resp.json()['token'], |
||||
'exp': time.time() + 60 |
||||
} |
||||
return _ACCESS_TOKEN_CACHE['token'] |
||||
|
||||
|
||||
def _call(url, method='GET', json=None): |
||||
if not url.startswith('https://'): |
||||
url = _GITHUB_API_PREFIX + url |
||||
headers = { |
||||
'Authorization': 'Bearer %s' % _access_token(), |
||||
'Accept': 'application/vnd.github.antiope-preview+json', |
||||
} |
||||
return requests.request(method=method, url=url, headers=headers, json=json) |
||||
|
||||
|
||||
def _latest_commit(): |
||||
resp = _call('/repos/%s/pulls/%s/commits' % |
||||
(_GITHUB_REPO, |
||||
os.environ['KOKORO_GITHUB_PULL_REQUEST_NUMBER'])) |
||||
return resp.json()[-1] |
||||
|
||||
|
||||
def check_on_pr(name, summary, success=True): |
||||
"""Create/Update a check on current pull request. |
||||
|
||||
The check runs are aggregated by their name, so newer check will update the |
||||
older check with the same name. |
||||
|
||||
Requires environment variable 'KOKORO_GITHUB_PULL_REQUEST_NUMBER' to indicate which pull request |
||||
should be updated. |
||||
|
||||
Args: |
||||
name: The name of the check. |
||||
summary: A str in Markdown to be used as the detail information of the check. |
||||
success: A bool indicates whether the check is succeed or not. |
||||
""" |
||||
if 'KOKORO_GIT_COMMIT' not in os.environ: |
||||
print('Missing KOKORO_GIT_COMMIT env var: not checking') |
||||
return |
||||
if 'KOKORO_KEYSTORE_DIR' not in os.environ: |
||||
print('Missing KOKORO_KEYSTORE_DIR env var: not checking') |
||||
return |
||||
if 'KOKORO_GITHUB_PULL_REQUEST_NUMBER' not in os.environ: |
||||
print('Missing KOKORO_GITHUB_PULL_REQUEST_NUMBER env var: not checking') |
||||
return |
||||
completion_time = str( |
||||
datetime.datetime.utcnow().replace(microsecond=0).isoformat()) + 'Z' |
||||
resp = _call( |
||||
'/repos/%s/check-runs' % _GITHUB_REPO, |
||||
method='POST', |
||||
json={ |
||||
'name': name, |
||||
'head_sha': os.environ['KOKORO_GIT_COMMIT'], |
||||
'status': 'completed', |
||||
'completed_at': completion_time, |
||||
'conclusion': 'success' if success else 'failure', |
||||
'output': { |
||||
'title': name, |
||||
'summary': summary, |
||||
} |
||||
}) |
||||
print('Result of Creating/Updating Check on PR:', |
||||
json.dumps(resp.json(), indent=2)) |
Loading…
Reference in new issue