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

View File

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

View File

@ -161,6 +161,21 @@ class TestGitlabDriver(ZuulTestCase):
zuulvars = job.parameters['zuul']
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')
def test_merge_request_updated_builds_aborted(self):

View File

@ -130,8 +130,18 @@ class GitlabEventConnector(threading.Thread):
event.change_number)
if attrs['action'] == 'open':
event.action = 'opened'
elif attrs['action'] == 'update':
elif attrs['action'] == 'update' and "labels" not in body:
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'):
event.action = attrs['action']
else:

View File

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

View File

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