From 617d2ef1c60686c26b7468b6c855540395bc5feb Mon Sep 17 00:00:00 2001 From: Artem Goncharov Date: Thu, 26 Aug 2021 16:52:40 +0200 Subject: [PATCH] Fix failed merge detection in gitlab gitlab is funny in that it can return status_code=200 with an error in the body. This can happen when MR accept request fails (i.e. when project requires squashing, but we have not done this). Ensure status of the MR is "merged" otherwise return "merge_error" attribute as a failure description. Change-Id: I343fb08cdf58fdf6d2068e274a89a34a55adde5a --- .../notes/detect-gitlab-merge-error-69816ea60127b363.yaml | 4 ++++ tests/base.py | 2 +- zuul/driver/gitlab/gitlabconnection.py | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/detect-gitlab-merge-error-69816ea60127b363.yaml diff --git a/releasenotes/notes/detect-gitlab-merge-error-69816ea60127b363.yaml b/releasenotes/notes/detect-gitlab-merge-error-69816ea60127b363.yaml new file mode 100644 index 0000000000..a61b4129a4 --- /dev/null +++ b/releasenotes/notes/detect-gitlab-merge-error-69816ea60127b363.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Fix detection of the failed merge in gitlab driver. diff --git a/tests/base.py b/tests/base.py index a8ba5ea6b3..d0c5fb16ce 100644 --- a/tests/base.py +++ b/tests/base.py @@ -2156,7 +2156,7 @@ class FakeGitlabAPIClient(gitlabconnection.GitlabAPIClient): mr = self._get_mr(match) mr.mergeMergeRequest() - return {}, 200, "", "PUT" + return {'state': 'merged'}, 200, "", "PUT" def addProject(self, project): self.addProjectByName(project.name) diff --git a/zuul/driver/gitlab/gitlabconnection.py b/zuul/driver/gitlab/gitlabconnection.py index 2270278333..11edd1094c 100644 --- a/zuul/driver/gitlab/gitlabconnection.py +++ b/zuul/driver/gitlab/gitlabconnection.py @@ -404,6 +404,10 @@ class GitlabAPIClient(): resp = self.put(self.baseurl + path, zuul_event_id=zuul_event_id) try: self._manage_error(*resp, zuul_event_id=zuul_event_id) + if resp[0]['state'] != 'merged': + raise MergeFailure( + "Merge request merge failed: %s" % resp.get('merge_error') + ) except GitlabAPIClientException as e: raise MergeFailure('Merge request merge failed: %s' % e) return resp[0]