From 44875808794aa94de98d9fc7e297a8329c24430f Mon Sep 17 00:00:00 2001 From: Meni Yakove Date: Wed, 2 Apr 2025 11:28:48 +0300 Subject: [PATCH 1/5] feat: Enable set PRs with auto merge for branches In the config file under the desire repository set: ``` set-auto-merge-prs: - my-branch ``` To set auto merge for ech PR under this branch --- example.config.yaml | 3 +++ webhook_server_container/config/schema.yaml | 23 ++++++++++++++------- webhook_server_container/libs/github_api.py | 9 ++++++-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/example.config.yaml b/example.config.yaml index 1e7d55bb..7f234ab5 100644 --- a/example.config.yaml +++ b/example.config.yaml @@ -109,3 +109,6 @@ repositories: required_approving_review_count: 1 required_linear_history: True required_conversation_resolution: True + + set-auto-merge-prs: + - main diff --git a/webhook_server_container/config/schema.yaml b/webhook_server_container/config/schema.yaml index 80373275..78b38731 100644 --- a/webhook_server_container/config/schema.yaml +++ b/webhook_server_container/config/schema.yaml @@ -171,12 +171,19 @@ properties: type: boolean required_conversation_resolution: type: boolean - can-be-merged-required-labels: - type: array - items: - type: string - jira-tracking: - type: boolean - default: true - conventional-title: string + set-auto-merge-prs: + description: Set auto merge for pull requests for specific branches + type: array + items: + type: string + + can-be-merged-required-labels: + type: array + items: + type: string + jira-tracking: + type: boolean + default: true + + conventional-title: string diff --git a/webhook_server_container/libs/github_api.py b/webhook_server_container/libs/github_api.py index 33725aed..e46f5702 100644 --- a/webhook_server_container/libs/github_api.py +++ b/webhook_server_container/libs/github_api.py @@ -385,6 +385,7 @@ def _repo_data_from_config(self) -> None: value="can-be-merged-required-labels", return_on_none=[] ) self.conventional_title: str = self.config.get_value(value="conventional-title") + self.set_auto_merge_prs: list[str] = self.config.get_value(value="set-auto-merge-prs", return_on_none=[]) def _get_pull_request(self, number: int | None = None) -> PullRequest: if number: @@ -2017,12 +2018,16 @@ def add_pull_request_owner_as_assingee(self) -> None: self.pull_request.add_to_assignees(self.root_approvers[0]) def set_pull_request_automerge(self) -> None: - if self.parent_committer in self.auto_verified_and_merged_users: + auto_merge = ( + self.pull_request_branch in self.set_auto_merge_prs + or self.parent_committer in self.auto_verified_and_merged_users + ) + if auto_merge: try: if not self.pull_request.raw_data.get("auto_merge"): self.logger.info( f"{self.log_prefix} will be merged automatically. owner: {self.parent_committer} " - f"is part of auto merge enabled users" + f"is part of auto merge enabled rules" ) self.pull_request.enable_automerge(merge_method="SQUASH") From 08eb9f09724d9db1d997927d396bd34684f0dfa7 Mon Sep 17 00:00:00 2001 From: Meni Yakove Date: Thu, 3 Apr 2025 17:05:55 +0300 Subject: [PATCH 2/5] Set automerge only after all initialization of a new PR is done --- webhook_server_container/libs/github_api.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webhook_server_container/libs/github_api.py b/webhook_server_container/libs/github_api.py index e46f5702..f73a49ad 100644 --- a/webhook_server_container/libs/github_api.py +++ b/webhook_server_container/libs/github_api.py @@ -845,7 +845,6 @@ def process_pull_request_webhook_data(self) -> None: pull_request_opened_futures.append(executor.submit(self.create_issue_for_new_pull_request)) pull_request_opened_futures.append(executor.submit(self.set_wip_label_based_on_title)) pull_request_opened_futures.append(executor.submit(self.process_opened_or_synchronize_pull_request)) - pull_request_opened_futures.append(executor.submit(self.set_pull_request_automerge)) if self.jira_track_pr: pull_request_opened_futures.append(executor.submit(self.create_jira_when_open_pull_reques)) @@ -854,6 +853,9 @@ def process_pull_request_webhook_data(self) -> None: if _exp := result.exception(): self.logger.error(f"{self.log_prefix} {_exp}") + # Set automerge only after all initialization of a new PR is done. + self.set_pull_request_automerge() + if hook_action == "synchronize": pull_request_synchronize_futures: list[Future] = [] with ThreadPoolExecutor() as executor: From 3fb4dc6d6c86fff42010b9a08ee118d148fe45d9 Mon Sep 17 00:00:00 2001 From: Meni Yakove Date: Sun, 6 Apr 2025 11:24:46 +0300 Subject: [PATCH 3/5] Add debug log for auto-merge --- webhook_server_container/libs/github_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/webhook_server_container/libs/github_api.py b/webhook_server_container/libs/github_api.py index f73a49ad..8536e2ed 100644 --- a/webhook_server_container/libs/github_api.py +++ b/webhook_server_container/libs/github_api.py @@ -2024,6 +2024,7 @@ def set_pull_request_automerge(self) -> None: self.pull_request_branch in self.set_auto_merge_prs or self.parent_committer in self.auto_verified_and_merged_users ) + self.logger.debug(f"{self.log_prefix} auto_merge: {auto_merge}, branch: {self.pull_request_branch}") if auto_merge: try: if not self.pull_request.raw_data.get("auto_merge"): From dd78c89fa588bac9acc93dd987446794d6ca8375 Mon Sep 17 00:00:00 2001 From: Meni Yakove Date: Sun, 6 Apr 2025 11:47:41 +0300 Subject: [PATCH 4/5] call suto_merge after init, before all tests ends --- webhook_server_container/libs/github_api.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webhook_server_container/libs/github_api.py b/webhook_server_container/libs/github_api.py index 8536e2ed..1e684e65 100644 --- a/webhook_server_container/libs/github_api.py +++ b/webhook_server_container/libs/github_api.py @@ -849,13 +849,13 @@ def process_pull_request_webhook_data(self) -> None: if self.jira_track_pr: pull_request_opened_futures.append(executor.submit(self.create_jira_when_open_pull_reques)) + # Set automerge only after all initialization of a new PR is done. + self.set_pull_request_automerge() + for result in as_completed(pull_request_opened_futures): if _exp := result.exception(): self.logger.error(f"{self.log_prefix} {_exp}") - # Set automerge only after all initialization of a new PR is done. - self.set_pull_request_automerge() - if hook_action == "synchronize": pull_request_synchronize_futures: list[Future] = [] with ThreadPoolExecutor() as executor: From b1ab6dcb64db779d9e8b5d753e85f10ead30873e Mon Sep 17 00:00:00 2001 From: Meni Yakove Date: Sun, 6 Apr 2025 12:14:10 +0300 Subject: [PATCH 5/5] call new PR init when PR in reopened --- webhook_server_container/libs/github_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webhook_server_container/libs/github_api.py b/webhook_server_container/libs/github_api.py index 1e684e65..c2082b6b 100644 --- a/webhook_server_container/libs/github_api.py +++ b/webhook_server_container/libs/github_api.py @@ -835,8 +835,7 @@ def process_pull_request_webhook_data(self) -> None: if hook_action == "edited": self.set_wip_label_based_on_title() - if hook_action == "opened": - self.logger.info(f"{self.log_prefix} Creating welcome comment") + if hook_action in ("opened", "reopened"): pull_request_opened_futures: list[Future] = [] with ThreadPoolExecutor() as executor: pull_request_opened_futures.append( @@ -2020,6 +2019,7 @@ def add_pull_request_owner_as_assingee(self) -> None: self.pull_request.add_to_assignees(self.root_approvers[0]) def set_pull_request_automerge(self) -> None: + self.logger.error(f"AUTO_MERGE: {self.pull_request_branch} in {self.set_auto_merge_prs}") auto_merge = ( self.pull_request_branch in self.set_auto_merge_prs or self.parent_committer in self.auto_verified_and_merged_users