Merge "Gitlab - Implement the note event and the comment trigger action"

This commit is contained in:
Zuul 2020-02-19 07:29:00 +00:00 committed by Gerrit Code Review
commit 1914417dd4
6 changed files with 94 additions and 12 deletions

View File

@ -1673,8 +1673,7 @@ class FakeGitlabMergeRequest(object):
self.notes.append(
{
"body": body,
"created_at": datetime.datetime.now().strftime(
'%Y-%m-%dT%H:%M:%S.%fZ'),
"created_at": datetime.datetime.now(),
}
)
@ -1711,7 +1710,7 @@ class FakeGitlabMergeRequest(object):
def _updateTimeStamp(self):
self.updated_at = datetime.datetime.now()
def getMergeRequestEvent(self):
def getMergeRequestOpenedEvent(self):
name = 'gl_merge_request'
data = {
'object_kind': 'merge_request',
@ -1733,6 +1732,32 @@ class FakeGitlabMergeRequest(object):
}
return (name, data)
def getMergeRequestCommentedEvent(self, note):
self.addNote(note)
note_date = self.notes[-1]['created_at'].strftime(
'%Y-%m-%d %H:%M:%S UTC')
name = 'gl_merge_request'
data = {
'object_kind': 'note',
'project': {
'path_with_namespace': self.project
},
'merge_request': {
'title': self.title,
'iid': self.number,
'target_branch': self.branch,
'last_commit': {
'id': self.patch_number,
},
},
'object_attributes': {
'created_at': note_date,
'updated_at': note_date,
'note': self.notes[-1]['body'],
},
}
return (name, data)
class GithubChangeReference(git.Reference):
_common_path_default = "refs/pull"

View File

@ -3,6 +3,9 @@
manager: independent
trigger:
gitlab:
- event: gl_merge_request
action: comment
comment: (?i)^\s*recheck\s*$
- event: gl_merge_request
action:
- opened

View File

@ -51,7 +51,7 @@ class TestGitlabWebhook(ZuulTestCase):
def test_webhook(self):
A = self.fake_gitlab.openFakeMergeRequest(
'org/project', 'master', 'A')
self.fake_gitlab.emitEvent(A.getMergeRequestEvent(),
self.fake_gitlab.emitEvent(A.getMergeRequestOpenedEvent(),
use_zuulweb=False,
project='org/project')
self.waitUntilSettled()
@ -63,7 +63,7 @@ class TestGitlabWebhook(ZuulTestCase):
def test_webhook_via_zuulweb(self):
A = self.fake_gitlab.openFakeMergeRequest(
'org/project', 'master', 'A')
self.fake_gitlab.emitEvent(A.getMergeRequestEvent(),
self.fake_gitlab.emitEvent(A.getMergeRequestOpenedEvent(),
use_zuulweb=True,
project='org/project')
self.waitUntilSettled()
@ -76,13 +76,13 @@ class TestGitlabDriver(ZuulTestCase):
config_file = 'zuul-gitlab-driver.conf'
@simple_layout('layouts/basic-gitlab.yaml', driver='gitlab')
def test_pull_request_opened(self):
def test_merge_request_opened(self):
description = "This is the\nMR description."
A = self.fake_gitlab.openFakeMergeRequest(
'org/project', 'master', 'A', description=description)
self.fake_gitlab.emitEvent(
A.getMergeRequestEvent(), project='org/project')
A.getMergeRequestOpenedEvent(), project='org/project')
self.waitUntilSettled()
self.assertEqual('SUCCESS',
@ -109,3 +109,21 @@ class TestGitlabDriver(ZuulTestCase):
self.assertThat(
A.notes[1]['body'],
MatchesRegex(r'.*project-test2.*SUCCESS.*', re.DOTALL))
@simple_layout('layouts/basic-gitlab.yaml', driver='gitlab')
def test_merge_request_commented(self):
A = self.fake_gitlab.openFakeMergeRequest('org/project', 'master', 'A')
self.fake_gitlab.emitEvent(A.getMergeRequestOpenedEvent())
self.waitUntilSettled()
self.assertEqual(2, len(self.history))
self.fake_gitlab.emitEvent(
A.getMergeRequestCommentedEvent('I like that change'))
self.waitUntilSettled()
self.assertEqual(2, len(self.history))
self.fake_gitlab.emitEvent(
A.getMergeRequestCommentedEvent('recheck'))
self.waitUntilSettled()
self.assertEqual(4, len(self.history))

View File

@ -96,27 +96,34 @@ class GitlabEventConnector(threading.Thread):
self._stopped = False
self.event_handler_mapping = {
'merge_request': self._event_merge_request,
'note': self._event_note,
}
def stop(self):
self._stopped = True
self.connection.addEvent(None)
def _event_merge_request(self, body):
def _event_base(self, body):
event = GitlabTriggerEvent()
attrs = body['object_attributes']
event.title = attrs['title']
event.updated_at = int(datetime.strptime(
attrs['updated_at'], '%Y-%m-%d %H:%M:%S %Z').strftime('%s'))
event.created_at = int(datetime.strptime(
attrs['created_at'], '%Y-%m-%d %H:%M:%S %Z').strftime('%s'))
event.project_name = body['project']['path_with_namespace']
event.ref = "refs/merge-requests/%s/head" % event.change_number
return event
# https://docs.gitlab.com/ee/user/project/integrations/webhooks.html#merge-request-events
def _event_merge_request(self, body):
event = self._event_base(body)
attrs = body['object_attributes']
event.title = attrs['title']
event.change_number = attrs['iid']
event.branch = attrs['target_branch']
event.patch_number = attrs['last_commit']['id']
event.change_url = self.connection.getPullUrl(event.project_name,
event.change_number)
event.ref = "refs/merge-requests/%s/head" % event.change_number
event.patch_number = attrs['last_commit']['id']
if event.created_at == event.updated_at:
event.action = 'opened'
else:
@ -124,6 +131,21 @@ class GitlabEventConnector(threading.Thread):
event.type = 'gl_merge_request'
return event
# https://docs.gitlab.com/ee/user/project/integrations/webhooks.html#comment-on-merge-request
def _event_note(self, body):
event = self._event_base(body)
event.comment = body['object_attributes']['note']
mr = body['merge_request']
event.title = mr['title']
event.change_number = mr['iid']
event.branch = mr['target_branch']
event.patch_number = mr['last_commit']['id']
event.change_url = self.connection.getPullUrl(event.project_name,
event.change_number)
event.action = 'comment'
event.type = 'gl_merge_request'
return event
def _handleEvent(self):
ts, json_body, event_type = self.connection.getEvent()
if self._stopped:

View File

@ -71,11 +71,13 @@ class GitlabTriggerEvent(TriggerEvent):
class GitlabEventFilter(EventFilter):
def __init__(self, trigger, types=[], actions=[]):
def __init__(self, trigger, types=[], actions=[], comments=[]):
super(GitlabEventFilter, self).__init__(self)
self._types = types
self.types = [re.compile(x) for x in types]
self.actions = actions
self._comments = comments
self.comments = [re.compile(x) for x in comments]
def __repr__(self):
ret = '<GitlabEventFilter'
@ -84,6 +86,8 @@ class GitlabEventFilter(EventFilter):
ret += ' types: %s' % ', '.join(self._types)
if self.actions:
ret += ' actions: %s' % ', '.join(self.actions)
if self._comments:
ret += ' comments: %s' % ', '.join(self._comments)
ret += '>'
return ret
@ -103,6 +107,14 @@ class GitlabEventFilter(EventFilter):
if self.actions and not matches_action:
return False
matches_comment_re = False
for comment_re in self.comments:
if (event.comment is not None and
comment_re.search(event.comment)):
matches_comment_re = True
if self.comments and not matches_comment_re:
return False
return True

View File

@ -30,6 +30,7 @@ class GitlabTrigger(BaseTrigger):
trigger=self,
types=to_list(trigger['event']),
actions=to_list(trigger.get('action')),
comments=to_list(trigger.get('comment')),
)
efilters.append(f)
return efilters
@ -43,5 +44,6 @@ def getSchema():
v.Required('event'):
scalar_or_list(v.Any('gl_merge_request')),
'action': scalar_or_list(str),
'comment': scalar_or_list(str),
}
return gitlab_trigger