gitlab: support the labeled event

Change-Id: I7c97182e13cd9208e686e5d851cc409b30dd588b
This commit is contained in:
Fabien Boucher 2020-07-17 16:07:21 +00:00
parent cfb78afd8f
commit fb6ff1335e
7 changed files with 78 additions and 13 deletions

View File

@ -132,6 +132,10 @@ the following options.
Merge request unapproved. Merge request unapproved.
.. value:: labeled
Merge request labeled.
.. attr:: comment .. attr:: comment
This is only used for ``gl_merge_request`` and ``comment`` actions. It This is only used for ``gl_merge_request`` and ``comment`` actions. It
@ -141,6 +145,12 @@ the following options.
match when comments containing 'retrigger' somewhere in the match when comments containing 'retrigger' somewhere in the
comment text are added to a merge request. comment text are added to a merge request.
.. attr:: labels
This is only used for ``gl_merge_request`` and ``labeled`` actions. It
accepts a string or a list of strings that are searched into the list
of labels set to the merge request.
.. attr:: ref .. attr:: ref
This is only used for ``gl_push`` events. This field is treated as This is only used for ``gl_push`` events. This field is treated as

View File

@ -1810,7 +1810,7 @@ class FakeGitlabMergeRequest(object):
def _updateTimeStamp(self): def _updateTimeStamp(self):
self.updated_at = datetime.datetime.now() self.updated_at = datetime.datetime.now()
def getMergeRequestEvent(self, action): def getMergeRequestEvent(self, action, include_labels=False):
name = 'gl_merge_request' name = 'gl_merge_request'
data = { data = {
'object_kind': 'merge_request', 'object_kind': 'merge_request',
@ -1829,6 +1829,14 @@ class FakeGitlabMergeRequest(object):
'action': action 'action': action
}, },
} }
if include_labels:
data['labels'] = [{'title': label} for label in self.labels]
data['changes'] = {
'labels': {
'previous': [],
'current': data['labels']
}
}
return (name, data) return (name, data)
def getMergeRequestOpenedEvent(self): def getMergeRequestOpenedEvent(self):
@ -1846,6 +1854,10 @@ class FakeGitlabMergeRequest(object):
self.approved = False self.approved = False
return self.getMergeRequestEvent(action='unapproved') return self.getMergeRequestEvent(action='unapproved')
def getMergeRequestLabeledEvent(self, labels):
self.labels = labels
return self.getMergeRequestEvent(action='update', include_labels=True)
def getMergeRequestCommentedEvent(self, note): def getMergeRequestCommentedEvent(self, note):
self.addNote(note) self.addNote(note)
note_date = self.notes[-1]['created_at'].strftime( note_date = self.notes[-1]['created_at'].strftime(

View File

@ -32,6 +32,17 @@
- approved - approved
- unapproved - unapproved
- pipeline:
name: check-labeled
manager: independent
trigger:
gitlab:
- event: gl_merge_request
action:
- labeled
labels:
- gateit
- pipeline: - pipeline:
name: post name: post
post-review: true post-review: true
@ -75,6 +86,10 @@
name: project-test-approval name: project-test-approval
run: playbooks/project-test-approval.yaml run: playbooks/project-test-approval.yaml
- job:
name: project-test-labeled
run: playbooks/project-test-labeled.yaml
- project: - project:
name: org/project name: org/project
check: check:
@ -84,6 +99,9 @@
check-approval: check-approval:
jobs: jobs:
- project-test-approval - project-test-approval
check-labeled:
jobs:
- project-test-labeled
post: post:
jobs: jobs:
- project-post-job - project-post-job

View File

@ -161,6 +161,21 @@ class TestGitlabDriver(ZuulTestCase):
zuulvars = job.parameters['zuul'] zuulvars = job.parameters['zuul']
self.assertEqual('check-approval', zuulvars['pipeline']) self.assertEqual('check-approval', zuulvars['pipeline'])
@simple_layout('layouts/basic-gitlab.yaml', driver='gitlab')
def test_merge_request_labeled(self):
A = self.fake_gitlab.openFakeMergeRequest('org/project', 'master', 'A')
self.fake_gitlab.emitEvent(A.getMergeRequestLabeledEvent(
labels=('label1', 'label2')))
self.waitUntilSettled()
self.assertEqual(0, len(self.history))
self.fake_gitlab.emitEvent(A.getMergeRequestLabeledEvent(
labels=('gateit', )))
self.waitUntilSettled()
self.assertEqual(1, len(self.history))
@simple_layout('layouts/basic-gitlab.yaml', driver='gitlab') @simple_layout('layouts/basic-gitlab.yaml', driver='gitlab')
def test_merge_request_updated_builds_aborted(self): def test_merge_request_updated_builds_aborted(self):

View File

@ -130,8 +130,18 @@ class GitlabEventConnector(threading.Thread):
event.change_number) event.change_number)
if attrs['action'] == 'open': if attrs['action'] == 'open':
event.action = 'opened' event.action = 'opened'
elif attrs['action'] == 'update': elif attrs['action'] == 'update' and "labels" not in body:
event.action = 'changed' event.action = 'changed'
elif attrs['action'] == 'update' and "labels" in body:
event.action = 'labeled'
previous_labels = [
label["title"] for
label in body["changes"]["labels"]["previous"]]
current_labels = [
label["title"] for
label in body["changes"]["labels"]["current"]]
new_labels = set(current_labels) - set(previous_labels)
event.labels = new_labels
elif attrs['action'] in ('approved', 'unapproved'): elif attrs['action'] in ('approved', 'unapproved'):
event.action = attrs['action'] event.action = attrs['action']
else: else:

View File

@ -59,8 +59,8 @@ class GitlabTriggerEvent(TriggerEvent):
self.trigger_name = 'gitlab' self.trigger_name = 'gitlab'
self.title = None self.title = None
self.action = None self.action = None
self.labels = []
self.change_number = None self.change_number = None
self.tags = []
def _repr(self): def _repr(self):
r = [super(GitlabTriggerEvent, self)._repr()] r = [super(GitlabTriggerEvent, self)._repr()]
@ -69,8 +69,8 @@ class GitlabTriggerEvent(TriggerEvent):
r.append("project:%s" % self.canonical_project_name) r.append("project:%s" % self.canonical_project_name)
if self.change_number: if self.change_number:
r.append("mr:%s" % self.change_number) r.append("mr:%s" % self.change_number)
if self.tags: if self.labels:
r.append("tags:%s" % ', '.join(self.tags)) r.append("labels:%s" % ', '.join(self.labels))
return ' '.join(r) return ' '.join(r)
def isPatchsetCreated(self): def isPatchsetCreated(self):
@ -82,7 +82,7 @@ class GitlabTriggerEvent(TriggerEvent):
class GitlabEventFilter(EventFilter): class GitlabEventFilter(EventFilter):
def __init__( def __init__(
self, trigger, types=[], actions=[], self, trigger, types=[], actions=[],
comments=[], refs=[], tags=[], ignore_deletes=True): comments=[], refs=[], labels=[], ignore_deletes=True):
super(GitlabEventFilter, self).__init__(self) super(GitlabEventFilter, self).__init__(self)
self._types = types self._types = types
self.types = [re.compile(x) for x in types] self.types = [re.compile(x) for x in types]
@ -91,7 +91,7 @@ class GitlabEventFilter(EventFilter):
self.comments = [re.compile(x) for x in comments] self.comments = [re.compile(x) for x in comments]
self._refs = refs self._refs = refs
self.refs = [re.compile(x) for x in refs] self.refs = [re.compile(x) for x in refs]
self.tags = tags self.labels = labels
self.ignore_deletes = ignore_deletes self.ignore_deletes = ignore_deletes
def __repr__(self): def __repr__(self):
@ -107,8 +107,8 @@ class GitlabEventFilter(EventFilter):
ret += ' refs: %s' % ', '.join(self._refs) ret += ' refs: %s' % ', '.join(self._refs)
if self.ignore_deletes: if self.ignore_deletes:
ret += ' ignore_deletes: %s' % self.ignore_deletes ret += ' ignore_deletes: %s' % self.ignore_deletes
if self.tags: if self.labels:
ret += ' tags: %s' % ', '.join(self.tags) ret += ' labels: %s' % ', '.join(self.labels)
ret += '>' ret += '>'
return ret return ret
@ -148,8 +148,8 @@ class GitlabEventFilter(EventFilter):
if self.comments and not matches_comment_re: if self.comments and not matches_comment_re:
return False return False
if self.tags: if self.labels:
if not set(event.tags).intersection(set(self.tags)): if not set(event.labels).intersection(set(self.labels)):
return False return False
return True return True

View File

@ -32,7 +32,7 @@ class GitlabTrigger(BaseTrigger):
actions=to_list(trigger.get('action')), actions=to_list(trigger.get('action')),
comments=to_list(trigger.get('comment')), comments=to_list(trigger.get('comment')),
refs=to_list(trigger.get('ref')), refs=to_list(trigger.get('ref')),
tags=to_list(trigger.get('tag')), labels=to_list(trigger.get('labels')),
) )
efilters.append(f) efilters.append(f)
return efilters return efilters
@ -52,6 +52,6 @@ def getSchema():
'action': scalar_or_list(str), 'action': scalar_or_list(str),
'comment': scalar_or_list(str), 'comment': scalar_or_list(str),
'ref': scalar_or_list(str), 'ref': scalar_or_list(str),
'tag': scalar_or_list(str) 'labels': scalar_or_list(str)
} }
return gitlab_trigger return gitlab_trigger