diff --git a/gitopscli/git_api/gitlab_git_repo_api_adapter.py b/gitopscli/git_api/gitlab_git_repo_api_adapter.py index 83867be7..5d660449 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,22 @@ 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: + merge_request.merge() + return + except gitlab.exceptions.GitlabMRClosedError as ex: + # "Branch cannot be merged" error can occur if the server + # 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) 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)