Merge "gitlab: implement the open pipeline requirement"
This commit is contained in:
commit
0d5a3f5ff7
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()]
|
||||
|
|
|
@ -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
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -110,7 +110,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):
|
||||
|
@ -122,7 +125,9 @@ class GitlabSource(BaseSource):
|
|||
|
||||
# Require model
|
||||
def getRequireSchema():
|
||||
require = {}
|
||||
require = {
|
||||
'open': bool,
|
||||
}
|
||||
return require
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue