From bb66951cf710803aa0dab7982c913c963b6d2c88 Mon Sep 17 00:00:00 2001 From: Fabien Boucher Date: Mon, 13 Jul 2020 14:40:32 +0000 Subject: [PATCH] gitlab: implement the open pipeline requirement Change-Id: I26a70fa81ed0fa3ed6eb60646beeb0a064350f48 --- .../pipelines/gitlab-reference-pipelines.yaml | 3 ++ doc/source/reference/drivers/gitlab.rst | 20 ++++++++++- tests/base.py | 4 +++ .../fixtures/layouts/requirements-gitlab.yaml | 33 +++++++++++++++++++ tests/unit/test_gitlab_driver.py | 19 +++++++++++ zuul/driver/gitlab/gitlabmodel.py | 17 +++++++++- zuul/driver/gitlab/gitlabsource.py | 9 +++-- 7 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 tests/fixtures/layouts/requirements-gitlab.yaml diff --git a/doc/source/examples/pipelines/gitlab-reference-pipelines.yaml b/doc/source/examples/pipelines/gitlab-reference-pipelines.yaml index 74ac9a20f1..000e5ea538 100644 --- a/doc/source/examples/pipelines/gitlab-reference-pipelines.yaml +++ b/doc/source/examples/pipelines/gitlab-reference-pipelines.yaml @@ -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 diff --git a/doc/source/reference/drivers/gitlab.rst b/doc/source/reference/drivers/gitlab.rst index c5fb0f5540..5c708de84a 100644 --- a/doc/source/reference/drivers/gitlab.rst +++ b/doc/source/reference/drivers/gitlab.rst @@ -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. + + 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 diff --git a/tests/base.py b/tests/base.py index c4c107668e..a18b43b026 100644 --- a/tests/base.py +++ b/tests/base.py @@ -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()] diff --git a/tests/fixtures/layouts/requirements-gitlab.yaml b/tests/fixtures/layouts/requirements-gitlab.yaml new file mode 100644 index 0000000000..4bcd2a252a --- /dev/null +++ b/tests/fixtures/layouts/requirements-gitlab.yaml @@ -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 \ No newline at end of file diff --git a/tests/unit/test_gitlab_driver.py b/tests/unit/test_gitlab_driver.py index bb0b9b9044..18d3d23ebf 100644 --- a/tests/unit/test_gitlab_driver.py +++ b/tests/unit/test_gitlab_driver.py @@ -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)) diff --git a/zuul/driver/gitlab/gitlabmodel.py b/zuul/driver/gitlab/gitlabmodel.py index b55a5ec872..3e6a54dc60 100644 --- a/zuul/driver/gitlab/gitlabmodel.py +++ b/zuul/driver/gitlab/gitlabmodel.py @@ -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 = '