Merge "Remove an unneeded api call when creating check_runs"

This commit is contained in:
Zuul 2021-03-01 17:55:07 +00:00 committed by Gerrit Code Review
commit d890a93172
2 changed files with 59 additions and 9 deletions

View File

@ -17,6 +17,7 @@ import urllib
from collections import defaultdict
import datetime
import github3.exceptions
import re
import time
@ -87,11 +88,12 @@ class FakeApp:
class FakeCheckRun(object):
def __init__(self, name, details_url, output, status, conclusion,
def __init__(self, id, name, details_url, output, status, conclusion,
completed_at, external_id, actions, app):
if actions is None:
actions = []
self.id = id
self.name = name
self.details_url = details_url
self.output = output
@ -110,6 +112,7 @@ class FakeCheckRun(object):
def as_dict(self):
return {
'id': self.id,
"name": self.name,
"status": self.status,
"output": self.output,
@ -166,9 +169,10 @@ class FakeCommit(object):
# the last status provided for a commit.
self._statuses.insert(0, status)
def set_check_run(self, name, details_url, output, status, conclusion,
def set_check_run(self, id, name, details_url, output, status, conclusion,
completed_at, external_id, actions, app):
check_run = FakeCheckRun(
id,
name,
details_url,
output,
@ -182,6 +186,7 @@ class FakeCommit(object):
# Always insert a check_run to the front of the list to represent the
# last check_run provided for a commit.
self._check_runs.insert(0, check_run)
return check_run
def get_url(self, path, params=None):
if path == 'statuses':
@ -219,6 +224,7 @@ class FakeRepository(object):
self._commits = {}
self.data = data
self.name = name
self.check_run_counter = 0
# Simple dictionary to store permission values per feature (e.g.
# checks, Repository contents, Pull requests, Commit statuses, ...).
@ -303,7 +309,9 @@ class FakeRepository(object):
if commit is None:
commit = FakeCommit(head_sha)
self._commits[head_sha] = commit
self.check_run_counter += 1
commit.set_check_run(
str(self.check_run_counter),
name,
details_url,
output,
@ -568,9 +576,11 @@ class FakeResponse(object):
def raise_for_status(self):
if 400 <= self.status_code < 600:
raise HTTPError(
'{} {}'.format(self.status_code, self.status_message),
response=self)
if isinstance(self.data, str):
text = '{} {}'.format(self.status_code, self.data)
else:
text = '{} {}'.format(self.status_code, self.status_message)
raise HTTPError(text, response=self)
class FakeGithubSession(object):
@ -637,6 +647,39 @@ class FakeGithubSession(object):
}
return FakeResponse(data, 201)
# Handle check run creation
match = re.match(r'.*/repos/(.*)/check-runs$', url)
if match:
org, reponame = match.groups()[0].split('/', 1)
repo = self.client._data.repos.get((org, reponame))
if repo._permissions.get("checks") is False:
# To create a proper github3 exception, we need to mock a
# response object
return FakeResponse(
"Resource not accessible by integration", 403)
head_sha = json.get('head_sha')
commit = repo._commits.get(head_sha, None)
if commit is None:
commit = FakeCommit(head_sha)
repo._commits[head_sha] = commit
repo.check_run_counter += 1
check_run = commit.set_check_run(
str(repo.check_run_counter),
json['name'],
json['details_url'],
json['output'],
json.get('status'),
json.get('conclusion'),
json.get('completed_at'),
json['external_id'],
json['actions'],
json.get('app', 'zuul'),
)
return FakeResponse(check_run.as_dict(), 201)
return FakeResponse(None, 404)
def put(self, url, data=None, headers=None, params=None, json=None):

View File

@ -1952,8 +1952,8 @@ class GithubConnection(CachedBranchConnection):
zuul_event_id=None):
log = get_annotated_logger(self.log, zuul_event_id)
github = self.getGithubClient(project, zuul_event_id=zuul_event_id)
self._append_accept_header(github, PREVIEW_CHECKS_ACCEPT)
owner, proj = project.split("/")
repository = github.repository(owner, proj)
# Always provide an empty list of actions by default
actions = []
@ -2004,6 +2004,8 @@ class GithubConnection(CachedBranchConnection):
# change (e.g. the check_run creation failed), there should already
# be a check_run available. If not we will create one.
check_runs = []
repository = github.repository(owner, proj)
try:
check_runs = [
c for c in repository.commit(sha).check_runs()
@ -2091,7 +2093,7 @@ class GithubConnection(CachedBranchConnection):
# Report the start of a check run
try:
check_run = repository.create_check_run(
data = dict(
name=context,
head_sha=sha,
status=status,
@ -2100,8 +2102,13 @@ class GithubConnection(CachedBranchConnection):
external_id=external_id,
actions=actions,
)
except github3.exceptions.GitHubException as exc:
# TODO (felix): Should we retry the check run creation?
url = github.session.build_url('repos', project,
'check-runs')
resp = github.session.post(url, json=data)
resp.raise_for_status()
except requests.exceptions.HTTPError as exc:
log.error(
"Failed to create check run %s for %s#%s on sha %s: %s",
context, project, pr_number, sha, str(exc),