diff options
author | Lidi Zheng <lidiz@google.com> | 2018-12-13 16:33:02 -0800 |
---|---|---|
committer | Lidi Zheng <lidiz@google.com> | 2018-12-13 16:40:47 -0800 |
commit | 0f0822d53f37ea9da8bf838e5b3c62b05afe2f10 (patch) | |
tree | cf31a7b5d99db1f537760beeb0fd488265e13d03 /tools | |
parent | 3c3436d2b4530580c2b95d897a3614fb1d430518 (diff) |
WIP: Utilize the GitHub Check Feature
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/profiling/bloat/bloat_diff.py | 4 | ||||
-rwxr-xr-x | tools/profiling/ios_bin/binary_size.py | 4 | ||||
-rwxr-xr-x | tools/profiling/microbenchmarks/bm_diff/bm_main.py | 4 | ||||
-rwxr-xr-x | tools/profiling/qps/qps_diff.py | 4 | ||||
-rw-r--r-- | tools/run_tests/python_utils/check_on_pr.py | 98 |
5 files changed, 106 insertions, 8 deletions
diff --git a/tools/profiling/bloat/bloat_diff.py b/tools/profiling/bloat/bloat_diff.py index 91611c2ca4..36189151e9 100755 --- a/tools/profiling/bloat/bloat_diff.py +++ b/tools/profiling/bloat/bloat_diff.py @@ -25,7 +25,7 @@ import sys sys.path.append( os.path.join( os.path.dirname(sys.argv[0]), '..', '..', 'run_tests', 'python_utils')) -import comment_on_pr +import check_on_pr argp = argparse.ArgumentParser(description='Perform diff on microbenchmarks') @@ -90,4 +90,4 @@ for lib in LIBS: text += '\n\n' print text -comment_on_pr.comment_on_pr('```\n%s\n```' % text) +check_on_pr.check_on_pr('Bloat Difference', '```\n%s\n```' % text) diff --git a/tools/profiling/ios_bin/binary_size.py b/tools/profiling/ios_bin/binary_size.py index d4d134fef3..f0c8dd01a0 100755 --- a/tools/profiling/ios_bin/binary_size.py +++ b/tools/profiling/ios_bin/binary_size.py @@ -26,7 +26,7 @@ from parse_link_map import parse_link_map sys.path.append( os.path.join( os.path.dirname(sys.argv[0]), '..', '..', 'run_tests', 'python_utils')) -import comment_on_pr +import check_on_pr # Only show diff 1KB or greater diff_threshold = 1000 @@ -147,4 +147,4 @@ for frameworks in [False, True]: print text -comment_on_pr.comment_on_pr('```\n%s\n```' % text) +check_on_pr.check_on_pr('Binary Size', '```\n%s\n```' % text) diff --git a/tools/profiling/microbenchmarks/bm_diff/bm_main.py b/tools/profiling/microbenchmarks/bm_diff/bm_main.py index 96c63ba060..e5061b24f5 100755 --- a/tools/profiling/microbenchmarks/bm_diff/bm_main.py +++ b/tools/profiling/microbenchmarks/bm_diff/bm_main.py @@ -30,7 +30,7 @@ import subprocess sys.path.append( os.path.join( os.path.dirname(sys.argv[0]), '..', '..', 'run_tests', 'python_utils')) -import comment_on_pr +import check_on_pr sys.path.append( os.path.join( @@ -152,7 +152,7 @@ def main(args): if note: text = note + '\n\n' + text print('%s' % text) - comment_on_pr.comment_on_pr('```\n%s\n```' % text) + check_on_pr.check_on_pr('Benchmark', '```\n%s\n```' % text) if __name__ == '__main__': diff --git a/tools/profiling/qps/qps_diff.py b/tools/profiling/qps/qps_diff.py index 393f862b4d..2c73b236e2 100755 --- a/tools/profiling/qps/qps_diff.py +++ b/tools/profiling/qps/qps_diff.py @@ -33,7 +33,7 @@ import bm_speedup sys.path.append( os.path.join( os.path.dirname(sys.argv[0]), '..', '..', 'run_tests', 'python_utils')) -import comment_on_pr +import check_on_pr def _args(): @@ -164,7 +164,7 @@ def main(args): else: text = '[qps] No significant performance differences' print('%s' % text) - comment_on_pr.comment_on_pr('```\n%s\n```' % text) + check_on_pr.check_on_pr('QPS', '```\n%s\n```' % text) if __name__ == '__main__': diff --git a/tools/run_tests/python_utils/check_on_pr.py b/tools/run_tests/python_utils/check_on_pr.py new file mode 100644 index 0000000000..96418bf2d3 --- /dev/null +++ b/tools/run_tests/python_utils/check_on_pr.py @@ -0,0 +1,98 @@ +# 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 = 'lidizheng/grpc' +_GITHUB_APP_ID = 22288 +_INSTALLATION_ID = 516307 +_GITHUB_APP_KEY = open(os.environ['HOME'] + '/.ssh/google-grpc-checker.2018-12-13.private-key.pem', 'r').read() + +_ACCESS_TOKEN_CACHE = None + +def _jwt_token(): + 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['ghprbPullId'])) + 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 'ghprbPullId' 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 'ghprbPullId' not in os.environ: + print('Missing ghprbPullId env var: not commenting') + return + commit = _latest_commit() + resp = _call('/repos/%s/check-runs' % _GITHUB_REPO, method='POST', json={ + 'name': name, + 'head_sha': commit['sha'], + 'status': 'completed', + 'completed_at': '%sZ' % datetime.datetime.utcnow().replace(microsecond=0).isoformat(), + '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)) |