Compare commits

..

3 Commits

Author SHA1 Message Date
张建平
c24e3685e3 修复项目配置,优化GitLab配置逻辑,效率提升! 2025-03-03 16:38:28 +08:00
张建平
102d366df7 管理员配置手册优化 2025-03-03 16:34:35 +08:00
张建平
8ad4e4f188 Git配置更新,添加审阅者,支持多种git类型。 2025-03-03 16:03:52 +08:00
7 changed files with 75 additions and 61 deletions

View File

@ -22,7 +22,7 @@ class AIConfigAdmin(AjaxAdmin):
class GitConfigAdmin(AjaxAdmin):
"""Admin配置"""
list_display = ["git_name", "git_type", "git_url", "access_token"]
list_display = ["git_name", "git_type", "git_url", "access_token", "reviewer"]
readonly_fields = ["create_by", "delete_at", "detail"]
list_per_page = 10
top_html = '<el-alert title="可配置多个Git服务上!" type="success"></el-alert>'

View File

@ -0,0 +1,20 @@
# Generated by Django 5.1.6 on 2025-03-03 15:00
import simplepro.components.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("pr", "0003_projectconfig_project_url"),
]
operations = [
migrations.AddField(
model_name="gitconfig",
name="reviewer",
field=simplepro.components.fields.CharField(
blank=True, max_length=16, null=True, verbose_name="项目管理员"
),
),
]

View File

@ -52,13 +52,16 @@ class GitConfig(BaseModel):
access_token = fields.CharField(
null=True, blank=True, max_length=128, verbose_name="访问密钥"
)
reviewer = fields.CharField(
null=True, blank=True, max_length=16, verbose_name="项目管理员"
)
class Meta:
verbose_name = "Git服务配置"
verbose_name_plural = "Git服务配置"
def __str__(self):
return self.git_name
return f"{self.git_name}-{self.reviewer}"
class ProjectConfig(BaseModel):

View File

@ -1,12 +1,7 @@
import json
from urllib.parse import urlparse
from pr import models
from django.views import View
from django.http import JsonResponse
from utils.pr_agent import cli
from utils.pr_agent.config_loader import get_settings
from utils.git_config import GitLabProvider
from utils import constant
@ -68,16 +63,16 @@ class WebHookView(View):
# 获取对应处理类
provider = self.select_git_provider(GIT_TYPE)
project_id = provider.get_project_id(request_json=json_data)
project_id = provider.get_project_id(request_json=json_data, git_type=GIT_TYPE)
if not project_id:
return JsonResponse(status=400, data={"error": "Missing project ID"})
# 获取项目配置
project_config = provider.get_project_config(project_id=project_id)
project_config = provider.get_project_config(project_id=project_id, git_type=GIT_TYPE)
# Token 校验
provider.check_secret(
request_headers=headers, project_secret=project_config.get("project_secret")
request_headers=headers, project_secret=project_config.get("project_secret"), git_type=GIT_TYPE
)
provider.get_merge_request(

View File

@ -11,7 +11,7 @@ from utils import constant
class GitProvider(ABC):
@abstractmethod
def get_project_config(self, project_id):
def get_project_config(self, project_id, git_type):
pass
@abstractmethod
@ -34,9 +34,10 @@ class GitProvider(ABC):
class GitLabProvider(GitProvider):
@staticmethod
def check_secret(request_headers, project_secret):
def check_secret(request_headers, project_secret, git_type):
"""
检查密钥
:param git_type:
:param request_headers:
:param project_secret:
:return:
@ -46,24 +47,27 @@ class GitLabProvider(GitProvider):
return JsonResponse(status=403, data={"error": "Invalid token"})
@staticmethod
def get_project_id(request_json):
def get_project_id(request_json, git_type):
"""
获取项目ID
:param git_type:
:param request_json:
:return:
"""
return request_json.get("project", {}).get("id")
def get_project_config(self, project_id):
def get_project_config(self, project_id, git_type):
"""
实现GitLab项目配置获取逻辑
:param git_type:
:param project_id:
:return:
"""
git_config = models.GitConfig.objects.filter(git_type=0).first()
# TODO: 项目配置需要根据id以及git服务器配置
project_config = models.ProjectConfig.objects.filter(
git_config=git_config, project_id=project_id
project_id=project_id
).first()
git_config = project_config.git_config # Gitlab
if not project_config:
return JsonResponse(status=400, data={"error": "Project not found"})
if not project_config.is_enable:

View File

@ -1,59 +1,51 @@
## 管理员操作手册
### 一、Git服务器的Webhook配置(Gitlab为例)
本文档描述了配置 GitLab Webhook 的标准流程,重点操作如下:
1. 在Git服务器例如 GitHub、GitLab 等)中配置 Webhook确保当代码提交或分支更新时能够及时向 PR 管理系统发送通知。
---
> 个人访问令牌配置(配置Git服务需要用到)
![个人令牌配置](../static/md_image/gitlab_access.png)
### 1. 在 GitLab 中创建用户令牌
- 登录 GitLab 后,进入`用户设置`。
- 新建个人访问令牌User Token
- 保存该令牌,后续在 PR 系统中配置 Git 服务时需要使用。
![用户令牌](../static/md_image/gitlab_access.png)
> 项目访问令牌配置(配置项目服务需要用到)
![项目令牌](../static/md_image/令牌1.png)
![项目令牌](../static/md_image/Webhook配置.png)
---
2. 配置时,请确认 URL 指向 PR 管理系统,并设置合适的触发条件,如 push 事件和合并请求事件。
### 2. 在 PR 系统中创建 Git 服务配置
- 登录 PR 管理系统后台,进入`Git服务器配置`模块。
- 填写 GitLab 服务器的地址及`步骤1`中创建的用户令牌等必要信息。
![Git服务配置](../static/md_image/Git服务配置.png)
> Webhook 配置
![Webhook 配置](../static/md_image/w1.png)
![Webhook 配置](../static/md_image/w2.png)
---
### 二、PR管理系统中Git服务器的配置
### 3. 在 GitLab 中创建项目访问令牌
- 进入对应项目生成项目访问令牌Project Token
- 将此令牌保存好,后续将用于项目配置及 Webhook 秘钥设置。
![项目令牌](../static/md_image/项目Secret.png)
> 【示例:当前配置以 GitLab 为例,后续可能支持 Gitea 等其他 Git 服务】
---
1. 登录 PR 管理系统后台进入“Git服务器配置”模块。
> Git服务器配置(Git地址跟秘钥地址参考个人令牌)
![Git服务器配置](../static/md_image/Git服务配置.png)
2. 填写 Git 服务器的地址、访问令牌以及其他必要参数。
3. 测试连接,确保 PR 管理系统能够正常访问并与 Git 服务器进行数据交互。
> 在Git服务器配置中测试测试无误Pr系统会看到日志
### 三、PR管理系统中AI服务器的配置
1. 在 PR 管理系统中找到“AI服务器配置”入口。
> AI服务器配置(填写AI代理地址跟秘钥)
![AI服务器配置](../static/md_image/AI配置.png)
2. 配置 AI 服务器的地址、API 密钥和认证信息,确保系统可以调用 AI 服务进行代码评审或自动合并等操作。
3. 完成配置后,执行测试以确认 AI 服务器已正确响应请求。
### 四、PR管理系统中项目配置
1. 在 PR 管理系统中添加和配置项目,填写项目名称、代码仓库地址、分支信息等基本信息。
> 要通过PR管理系统管理项目需要在PR管理系统中添加项目填写项目名称、代码仓库地址、分支信息等基本信息。
### 4. 在 PR 系统中创建项目配置
- 在 PR 管理系统中进入`项目配置`模块。
- 添加新项目选择Git服务器、填写项目名称、仓库地址并输入步骤3中创建的项目访问令牌。
- 配置完成后,测试项目连接是否正常。
![项目配置](../static/md_image/项目配置.png)
2. 确认项目配置与实际仓库设置一致,确保后续的代码同步和合并操作不会出错。
3. 定期更新项目配置,以反映任何仓库地址或分支结构的变动。
---
### 五、PR管理系统中指令配置
1. 配置自动化操作指令,例如代码审查、自动合并、单元测试的触发指令等。
> 目前默认仅支持PR操作
### 5. 在 GitLab 中配置 Webhook
- 打开 GitLab 项目的 Webhook 配置页面。
- 设置 Webhook URL 指向 PR 管理系统的webhook地址暂时配置为http://{{host}}/api/v1/pr/webhook/
- 将 Webhook 的Secret令牌设置为步骤3中创建的项目访问令牌。
- 由于目前只处理合并请求,所以触发来源选择`合并请求事件`即可。
- 关闭SSL验证。
![Webhook配置](../static/md_image/w1.png)
![Webhook配置](../static/md_image/w2.png)
2. 每条指令应明确触发条件和执行步骤,以保障自动化流程的高效执行。
3. 对常用指令编写详细的操作说明,并进行充分测试以确保其可靠性。
---
### 六、注意事项
1. 配置过程中,请仔细阅读各系统的相关文档,避免因配置错误造成系统故障
2. 完成每项配置后建议逐个功能进行测试确保各项服务Webhook、Git服务器、AI服务器及指令均能正常工作
3. 定期检查配置状态,及时更新和修复配置问题,保障系统持续稳定运行
### 注意事项
- 每一步配置完成后都务必测试,确保各配置项工作正常
- 请妥善保管令牌信息,避免泄露引发安全风险
- 配置过程中遇到问题,请参考相应系统的详细文档进行排查

View File

@ -18,7 +18,7 @@ from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
CONFIG_NAME = BASE_DIR / "config.ini"
CONFIG_NAME = BASE_DIR / "config.local.ini"
# 加载配置文件: 开发可加载config.local.ini
_config = configparser.ConfigParser()