gitlab: implement the open pipeline requirement

Change-Id: I26a70fa81ed0fa3ed6eb60646beeb0a064350f48
This commit is contained in:
Fabien Boucher 2020-07-13 14:40:32 +00:00
parent 9c623851c4
commit bb66951cf7
7 changed files with 101 additions and 4 deletions

View File

@ -4,6 +4,9 @@
Newly uploaded patchsets enter this pipeline to receive an
initial +/-1 Verified vote.
manager: independent
require:
gitlab.com:
open: true
trigger:
gitlab.com:
- event: gl_merge_request

View File

@ -167,7 +167,25 @@ As described in :attr:`pipeline.require` pipelines may specify that items meet
certain conditions in order to be enqueued into the pipeline. These conditions
vary according to the source of the project in question.
This driver does not support requirements.
.. code-block:: yaml
pipeline:
require:
gitlab:
open: true
This indicates that changes originating from the GitLab connection must be
in the *opened* state (not merged yet).
.. attr:: pipeline.require.<gitlab source>
The dictionary passed to the GitLab pipeline `require` attribute
supports the following attributes:
.. attr:: open
A boolean value (``true`` or ``false``) that indicates whether
the Merge Request must be open in order to be enqueued.
Reference pipelines configuration

View File

@ -1742,6 +1742,10 @@ class FakeGitlabMergeRequest(object):
self._addCommitInMR(files=files)
self._updateTimeStamp()
def closeMergeRequest(self):
self.state = 'closed'
self._updateTimeStamp()
def _addCommitInMR(self, files=[], reset=False):
repo = self._getRepo()
ref = repo.references[self.getMRReference()]

View File

@ -0,0 +1,33 @@
- pipeline:
name: state-check
manager: independent
require:
gitlab:
open: true
trigger:
gitlab:
- event: gl_merge_request
action: comment
comment: (?i)^\s*recheck\s*$
- event: gl_merge_request
action:
- opened
- changed
success:
gitlab:
comment: true
- job:
name: base
parent: null
run: playbooks/base.yaml
- job:
name: project1-test
run: playbooks/project-test.yaml
- project:
name: org/project1
state-check:
jobs:
- project1-test

View File

@ -456,3 +456,22 @@ class TestGitlabDriver(ZuulTestCase):
# There should be no more changes in the queue
tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
self.assertEqual(len(tenant.layout.pipelines['check'].queues), 0)
@simple_layout('layouts/requirements-gitlab.yaml', driver='gitlab')
def test_state_require(self):
A = self.fake_gitlab.openFakeMergeRequest(
'org/project1', 'master', 'A')
self.fake_gitlab.emitEvent(A.getMergeRequestOpenedEvent())
self.waitUntilSettled()
self.assertEqual(1, len(self.history))
# Close the MR
A.closeMergeRequest()
# A recheck will not trigger the job
self.fake_gitlab.emitEvent(
A.getMergeRequestCommentedEvent('recheck'))
self.waitUntilSettled()
self.assertEqual(1, len(self.history))

View File

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

View File

@ -109,7 +109,10 @@ class GitlabSource(BaseSource):
raise NotImplementedError()
def getRequireFilters(self, config):
f = GitlabRefFilter()
f = GitlabRefFilter(
connection_name=self.connection.connection_name,
open=config.get('open'),
)
return [f]
def getRejectFilters(self, config):
@ -121,7 +124,9 @@ class GitlabSource(BaseSource):
# Require model
def getRequireSchema():
require = {}
require = {
'open': bool,
}
return require