Merge "Gitlab - Implement the note event and the comment trigger action"
This commit is contained in:
commit
1914417dd4
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue