gitlab: implement the merged pipeline requirement

Change-Id: Icdaee4e9f60bd9ec9c38cec0456dcb0ed1851560
This commit is contained in:
Fabien Boucher 2020-07-13 14:53:24 +00:00
parent bb66951cf7
commit 7fae9a5926
6 changed files with 44 additions and 1 deletions

View File

@ -187,6 +187,11 @@ in the *opened* state (not merged yet).
A boolean value (``true`` or ``false``) that indicates whether A boolean value (``true`` or ``false``) that indicates whether
the Merge Request must be open in order to be enqueued. the Merge Request must be open in order to be enqueued.
.. attr:: merged
A boolean value (``true`` or ``false``) that indicates whether
the Merge Request must be merged or not in order to be enqueued.
Reference pipelines configuration Reference pipelines configuration
--------------------------------- ---------------------------------

View File

@ -1746,6 +1746,16 @@ class FakeGitlabMergeRequest(object):
self.state = 'closed' self.state = 'closed'
self._updateTimeStamp() self._updateTimeStamp()
def mergeMergeRequest(self):
self.state = 'merged'
self._updateTimeStamp()
self.merged_at = self.updated_at
def reopenMergeRequest(self):
self.state = 'opened'
self._updateTimeStamp()
self.merged_at = None
def _addCommitInMR(self, files=[], reset=False): def _addCommitInMR(self, files=[], reset=False):
repo = self._getRepo() repo = self._getRepo()
ref = repo.references[self.getMRReference()] ref = repo.references[self.getMRReference()]

View File

@ -4,6 +4,7 @@
require: require:
gitlab: gitlab:
open: true open: true
merged: false
trigger: trigger:
gitlab: gitlab:
- event: gl_merge_request - event: gl_merge_request

View File

@ -475,3 +475,21 @@ class TestGitlabDriver(ZuulTestCase):
A.getMergeRequestCommentedEvent('recheck')) A.getMergeRequestCommentedEvent('recheck'))
self.waitUntilSettled() self.waitUntilSettled()
self.assertEqual(1, len(self.history)) self.assertEqual(1, len(self.history))
# Merge the MR
A.mergeMergeRequest()
# A recheck will not trigger the job
self.fake_gitlab.emitEvent(
A.getMergeRequestCommentedEvent('recheck'))
self.waitUntilSettled()
self.assertEqual(1, len(self.history))
# Re-open the MR
A.reopenMergeRequest()
# A recheck will trigger the job
self.fake_gitlab.emitEvent(
A.getMergeRequestCommentedEvent('recheck'))
self.waitUntilSettled()
self.assertEqual(2, len(self.history))

View File

@ -155,14 +155,17 @@ class GitlabEventFilter(EventFilter):
# The RefFilter should be understood as RequireFilter (it maps to # The RefFilter should be understood as RequireFilter (it maps to
# pipeline requires definition) # pipeline requires definition)
class GitlabRefFilter(RefFilter): class GitlabRefFilter(RefFilter):
def __init__(self, connection_name, open=None): def __init__(self, connection_name, open=None, merged=None):
RefFilter.__init__(self, connection_name) RefFilter.__init__(self, connection_name)
self.open = open self.open = open
self.merged = merged
def __repr__(self): def __repr__(self):
ret = '<GitlabRefFilter connection_name: %s ' % self.connection_name ret = '<GitlabRefFilter connection_name: %s ' % self.connection_name
if self.open is not None: if self.open is not None:
ret += ' open: %s' % self.open ret += ' open: %s' % self.open
if self.merged is not None:
ret += ' merged: %s' % self.merged
ret += '>' ret += '>'
return ret return ret
@ -171,4 +174,8 @@ class GitlabRefFilter(RefFilter):
if change.open != self.open: if change.open != self.open:
return False return False
if self.merged is not None:
if change.is_merged != self.merged:
return False
return True return True

View File

@ -112,6 +112,7 @@ class GitlabSource(BaseSource):
f = GitlabRefFilter( f = GitlabRefFilter(
connection_name=self.connection.connection_name, connection_name=self.connection.connection_name,
open=config.get('open'), open=config.get('open'),
merged=config.get('merged'),
) )
return [f] return [f]
@ -126,6 +127,7 @@ class GitlabSource(BaseSource):
def getRequireSchema(): def getRequireSchema():
require = { require = {
'open': bool, 'open': bool,
'merged': bool,
} }
return require return require