Skip to content

Commit 9e7ba46

Browse files
author
quanbisen
committed
增加Merge Request目标分支为受保护分支时才Review的开关:MERGE_REVIEW_ONLY_PROTECTED_BRANCHES_ENABLED
1 parent 3d192a2 commit 9e7ba46

File tree

5 files changed

+50
-6
lines changed

5 files changed

+50
-6
lines changed

biz/github/webhook_handler.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import json
21
import os
32
import re
43
import time
54

65
import requests
7-
6+
import fnmatch
87
from biz.utils.log import logger
98

109

@@ -173,6 +172,22 @@ def add_pull_request_notes(self, review_result):
173172
logger.error(f"Failed to add comment: {response.status_code}")
174173
logger.error(response.text)
175174

175+
def target_branch_protected(self) -> bool:
176+
url = f"https://api.github.com/repos/{self.repo_full_name}/branches?protected=true"
177+
headers = {
178+
'Authorization': f'token {self.github_token}',
179+
'Accept': 'application/vnd.github.v3+json'
180+
}
181+
182+
response = requests.get(url, headers=headers)
183+
if response.status_code == 200:
184+
data = response.json()
185+
target_branch = self.webhook_data['pull_request']['base']['ref']
186+
return any(fnmatch.fnmatch(target_branch, item['name']) for item in data)
187+
else:
188+
logger.warn(f"Failed to get protected branches: {response.status_code}, {response.text}")
189+
return False
190+
176191

177192
class PushHandler:
178193
def __init__(self, webhook_data: dict, github_token: str, github_url: str):

biz/gitlab/webhook_handler.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import re
33
import time
44
from urllib.parse import urljoin
5-
5+
import fnmatch
66
import requests
77

88
from biz.utils.log import logger
@@ -15,7 +15,7 @@ def filter_changes(changes: list):
1515
# 从环境变量中获取支持的文件扩展名
1616
supported_extensions = os.getenv('SUPPORTED_EXTENSIONS', '.java,.py,.php').split(',')
1717

18-
filter_deleted_files_changes = [change for change in changes if change.get("deleted_file") == False]
18+
filter_deleted_files_changes = [change for change in changes if not change.get("deleted_file")]
1919

2020
# 过滤 `new_path` 以支持的扩展名结尾的元素, 仅保留diff和new_path字段
2121
filtered_changes = [
@@ -47,7 +47,6 @@ def slugify_url(original_url: str) -> str:
4747
return target
4848

4949

50-
5150
class MergeRequestHandler:
5251
def __init__(self, webhook_data: dict, gitlab_token: str, gitlab_url: str):
5352
self.merge_request_iid = None
@@ -146,6 +145,24 @@ def add_merge_request_notes(self, review_result):
146145
logger.error(f"Failed to add note: {response.status_code}")
147146
logger.error(response.text)
148147

148+
def target_branch_protected(self) -> bool:
149+
url = urljoin(f"{self.gitlab_url}/",
150+
f"api/v4/projects/{self.project_id}/protected_branches")
151+
headers = {
152+
'Private-Token': self.gitlab_token,
153+
'Content-Type': 'application/json'
154+
}
155+
response = requests.get(url, headers=headers, verify=False)
156+
logger.debug(f"Get protected branches response from gitlab: {response.status_code}, {response.text}")
157+
# 检查请求是否成功
158+
if response.status_code == 200:
159+
data = response.json()
160+
target_branch = self.webhook_data['object_attributes']['target_branch']
161+
return any(fnmatch.fnmatch(target_branch, item['name']) for item in data)
162+
else:
163+
logger.warn(f"Failed to get protected branches: {response.status_code}, {response.text}")
164+
return False
165+
149166

150167
class PushHandler:
151168
def __init__(self, webhook_data: dict, gitlab_token: str, gitlab_url: str):

biz/queue/worker.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,15 @@ def handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_url
6666
:param gitlab_url_slug:
6767
:return:
6868
'''
69+
merge_review_only_protected_branches = os.environ.get('MERGE_REVIEW_ONLY_PROTECTED_BRANCHES_ENABLED', '0') == '1'
6970
try:
7071
# 解析Webhook数据
7172
handler = MergeRequestHandler(webhook_data, gitlab_token, gitlab_url)
7273
logger.info('Merge Request Hook event received')
74+
# 如果开启了仅review projected branches的,判断当前目标分支是否为projected branches
75+
if merge_review_only_protected_branches and not handler.target_branch_protected():
76+
logger.info("Merge Request target branch not match protected branches, ignored.")
77+
return
7378

7479
if handler.action not in ['open', 'update']:
7580
logger.info(f"Merge Request Hook event, action={handler.action}, ignored.")
@@ -172,10 +177,15 @@ def handle_github_pull_request_event(webhook_data: dict, github_token: str, gith
172177
:param github_url_slug:
173178
:return:
174179
'''
180+
merge_review_only_protected_branches = os.environ.get('MERGE_REVIEW_ONLY_PROTECTED_BRANCHES_ENABLED', '0') == '1'
175181
try:
176182
# 解析Webhook数据
177183
handler = GithubPullRequestHandler(webhook_data, github_token, github_url)
178184
logger.info('GitHub Pull Request event received')
185+
# 如果开启了仅review projected branches的,判断当前目标分支是否为projected branches
186+
if merge_review_only_protected_branches and not handler.target_branch_protected():
187+
logger.info("Merge Request target branch not match protected branches, ignored.")
188+
return
179189

180190
if handler.action not in ['opened', 'synchronize']:
181191
logger.info(f"Pull Request Hook event, action={handler.action}, ignored.")

biz/utils/code_reviewer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class BaseReviewer(abc.ABC):
1616

1717
def __init__(self, prompt_key: str):
1818
self.client = Factory().getClient()
19-
self.prompts = self._load_prompts(prompt_key,os.getenv("REVIEW_STYLE", "professional"))
19+
self.prompts = self._load_prompts(prompt_key, os.getenv("REVIEW_STYLE", "professional"))
2020

2121
def _load_prompts(self, prompt_key: str, style="professional") -> Dict[str, Any]:
2222
"""加载提示词配置"""

conf/.env.dist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ REPORT_CRONTAB_EXPRESSION=0 18 * * 1-5
6868

6969
# 开启Push Review功能(如果不需要push事件触发Code Review,设置为0)
7070
PUSH_REVIEW_ENABLED=1
71+
# 开启Merge请求过滤,过滤仅当合并目标分支是受保护分支时才Review(开启此选项请确保仓库已配置受保护分支protected branches)
72+
MERGE_REVIEW_ONLY_PROTECTED_BRANCHES_ENABLED=0
7173

7274
# Dashboard登录用户名和密码
7375
DASHBOARD_USER=admin

0 commit comments

Comments
 (0)