gitlab: support the labeled event
Change-Id: I7c97182e13cd9208e686e5d851cc409b30dd588b
This commit is contained in:
parent
cfb78afd8f
commit
fb6ff1335e
|
@ -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
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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):
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue