From 7fae9a59260b05aea2db27619029e3d748d2d501 Mon Sep 17 00:00:00 2001 From: Fabien Boucher Date: Mon, 13 Jul 2020 14:53:24 +0000 Subject: [PATCH] gitlab: implement the merged pipeline requirement Change-Id: Icdaee4e9f60bd9ec9c38cec0456dcb0ed1851560 --- doc/source/reference/drivers/gitlab.rst | 5 +++++ tests/base.py | 10 ++++++++++ .../fixtures/layouts/requirements-gitlab.yaml | 1 + tests/unit/test_gitlab_driver.py | 18 ++++++++++++++++++ zuul/driver/gitlab/gitlabmodel.py | 9 ++++++++- zuul/driver/gitlab/gitlabsource.py | 2 ++ 6 files changed, 44 insertions(+), 1 deletion(-) diff --git a/doc/source/reference/drivers/gitlab.rst b/doc/source/reference/drivers/gitlab.rst index 5c708de84a..cc64a52bf8 100644 --- a/doc/source/reference/drivers/gitlab.rst +++ b/doc/source/reference/drivers/gitlab.rst @@ -187,6 +187,11 @@ in the *opened* state (not merged yet). A boolean value (``true`` or ``false``) that indicates whether 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 --------------------------------- diff --git a/tests/base.py b/tests/base.py index a18b43b026..23cba65bd5 100644 --- a/tests/base.py +++ b/tests/base.py @@ -1746,6 +1746,16 @@ class FakeGitlabMergeRequest(object): self.state = 'closed' 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): repo = self._getRepo() ref = repo.references[self.getMRReference()] diff --git a/tests/fixtures/layouts/requirements-gitlab.yaml b/tests/fixtures/layouts/requirements-gitlab.yaml index 4bcd2a252a..8401e115a0 100644 --- a/tests/fixtures/layouts/requirements-gitlab.yaml +++ b/tests/fixtures/layouts/requirements-gitlab.yaml @@ -4,6 +4,7 @@ require: gitlab: open: true + merged: false trigger: gitlab: - event: gl_merge_request diff --git a/tests/unit/test_gitlab_driver.py b/tests/unit/test_gitlab_driver.py index 18d3d23ebf..9407f396e6 100644 --- a/tests/unit/test_gitlab_driver.py +++ b/tests/unit/test_gitlab_driver.py @@ -475,3 +475,21 @@ class TestGitlabDriver(ZuulTestCase): A.getMergeRequestCommentedEvent('recheck')) self.waitUntilSettled() 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)) diff --git a/zuul/driver/gitlab/gitlabmodel.py b/zuul/driver/gitlab/gitlabmodel.py index 3e6a54dc60..8fa58ba48a 100644 --- a/zuul/driver/gitlab/gitlabmodel.py +++ b/zuul/driver/gitlab/gitlabmodel.py @@ -155,14 +155,17 @@ class GitlabEventFilter(EventFilter): # The RefFilter should be understood as RequireFilter (it maps to # pipeline requires definition) class GitlabRefFilter(RefFilter): - def __init__(self, connection_name, open=None): + def __init__(self, connection_name, open=None, merged=None): RefFilter.__init__(self, connection_name) self.open = open + self.merged = merged def __repr__(self): ret = '