From cf1a0f24f0a17681a89b5b14007a446012e5b65b Mon Sep 17 00:00:00 2001 From: Oliver Christen Date: Tue, 9 Mar 2021 22:55:36 +0100 Subject: [PATCH 1/2] fix(gitlab): retry failed merges due to server still processing merge request internally --- .../git_api/gitlab_git_repo_api_adapter.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/gitopscli/git_api/gitlab_git_repo_api_adapter.py b/gitopscli/git_api/gitlab_git_repo_api_adapter.py index 83867be7..940b5f67 100644 --- a/gitopscli/git_api/gitlab_git_repo_api_adapter.py +++ b/gitopscli/git_api/gitlab_git_repo_api_adapter.py @@ -1,4 +1,6 @@ from typing import Optional +import logging +import time import requests import gitlab @@ -6,6 +8,8 @@ from .git_repo_api import GitRepoApi +MAX_MERGE_RETRIES = 5 + class GitlabGitRepoApiAdapter(GitRepoApi): def __init__( @@ -57,7 +61,20 @@ def create_pull_request( def merge_pull_request(self, pr_id: int) -> None: merge_request = self.__project.mergerequests.get(pr_id) - merge_request.merge() + + max_retries = MAX_MERGE_RETRIES + while max_retries > 0: + try: + logging.info("(%s/%s) Trying to merge ...", (MAX_MERGE_RETRIES - max_retries) + 1, MAX_MERGE_RETRIES) + merge_request.merge() + return + except gitlab.exceptions.GitlabMRClosedError: + # "Branch cannot be merged" error can occur if the server + # is still processing the merge request internally""" + max_retries -= 1 + time.sleep(2.5) + + raise GitOpsException("Error merging pull request: 'Branch cannot be merged'") def add_pull_request_comment(self, pr_id: int, text: str, parent_id: Optional[int] = None) -> None: merge_request = self.__project.mergerequests.get(pr_id) From fc0d875878e200323c214f4f0867476ada4780b2 Mon Sep 17 00:00:00 2001 From: Oliver Christen Date: Wed, 10 Mar 2021 18:14:26 +0100 Subject: [PATCH 2/2] fix(gitlab): log failed merge attempts as warning and refer to original exception if definitely failed --- gitopscli/git_api/gitlab_git_repo_api_adapter.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/gitopscli/git_api/gitlab_git_repo_api_adapter.py b/gitopscli/git_api/gitlab_git_repo_api_adapter.py index 940b5f67..5d660449 100644 --- a/gitopscli/git_api/gitlab_git_repo_api_adapter.py +++ b/gitopscli/git_api/gitlab_git_repo_api_adapter.py @@ -65,17 +65,19 @@ def merge_pull_request(self, pr_id: int) -> None: max_retries = MAX_MERGE_RETRIES while max_retries > 0: try: - logging.info("(%s/%s) Trying to merge ...", (MAX_MERGE_RETRIES - max_retries) + 1, MAX_MERGE_RETRIES) merge_request.merge() return - except gitlab.exceptions.GitlabMRClosedError: + except gitlab.exceptions.GitlabMRClosedError as ex: # "Branch cannot be merged" error can occur if the server - # is still processing the merge request internally""" + # is still processing the merge request internally max_retries -= 1 + logging.warning( + "Retry merging pull request. Attempts: (%s/%s)", MAX_MERGE_RETRIES - max_retries, MAX_MERGE_RETRIES + ) + if max_retries == 0: + raise GitOpsException("Error merging pull request: 'Branch cannot be merged'") from ex time.sleep(2.5) - raise GitOpsException("Error merging pull request: 'Branch cannot be merged'") - def add_pull_request_comment(self, pr_id: int, text: str, parent_id: Optional[int] = None) -> None: merge_request = self.__project.mergerequests.get(pr_id) merge_request.notes.create({"body": text})