Compare commits
3 Commits
a2689bde56
...
c24e3685e3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c24e3685e3 | ||
|
|
102d366df7 | ||
|
|
8ad4e4f188 |
@ -22,7 +22,7 @@ class AIConfigAdmin(AjaxAdmin):
|
|||||||
class GitConfigAdmin(AjaxAdmin):
|
class GitConfigAdmin(AjaxAdmin):
|
||||||
"""Admin配置"""
|
"""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"]
|
readonly_fields = ["create_by", "delete_at", "detail"]
|
||||||
list_per_page = 10
|
list_per_page = 10
|
||||||
top_html = '<el-alert title="可配置多个Git服务上!" type="success"></el-alert>'
|
top_html = '<el-alert title="可配置多个Git服务上!" type="success"></el-alert>'
|
||||||
|
|||||||
20
apps/pr/migrations/0004_gitconfig_reviewer.py
Normal file
20
apps/pr/migrations/0004_gitconfig_reviewer.py
Normal 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="项目管理员"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -52,13 +52,16 @@ class GitConfig(BaseModel):
|
|||||||
access_token = fields.CharField(
|
access_token = fields.CharField(
|
||||||
null=True, blank=True, max_length=128, verbose_name="访问密钥"
|
null=True, blank=True, max_length=128, verbose_name="访问密钥"
|
||||||
)
|
)
|
||||||
|
reviewer = fields.CharField(
|
||||||
|
null=True, blank=True, max_length=16, verbose_name="项目管理员"
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Git服务配置"
|
verbose_name = "Git服务配置"
|
||||||
verbose_name_plural = "Git服务配置"
|
verbose_name_plural = "Git服务配置"
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.git_name
|
return f"{self.git_name}-{self.reviewer}"
|
||||||
|
|
||||||
|
|
||||||
class ProjectConfig(BaseModel):
|
class ProjectConfig(BaseModel):
|
||||||
|
|||||||
@ -1,12 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
from urllib.parse import urlparse
|
|
||||||
|
|
||||||
from pr import models
|
|
||||||
from django.views import View
|
from django.views import View
|
||||||
from django.http import JsonResponse
|
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.git_config import GitLabProvider
|
||||||
from utils import constant
|
from utils import constant
|
||||||
|
|
||||||
@ -68,16 +63,16 @@ class WebHookView(View):
|
|||||||
|
|
||||||
# 获取对应处理类
|
# 获取对应处理类
|
||||||
provider = self.select_git_provider(GIT_TYPE)
|
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:
|
if not project_id:
|
||||||
return JsonResponse(status=400, data={"error": "Missing 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 校验
|
# Token 校验
|
||||||
provider.check_secret(
|
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(
|
provider.get_merge_request(
|
||||||
|
|||||||
@ -11,7 +11,7 @@ from utils import constant
|
|||||||
|
|
||||||
class GitProvider(ABC):
|
class GitProvider(ABC):
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def get_project_config(self, project_id):
|
def get_project_config(self, project_id, git_type):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
@ -34,9 +34,10 @@ class GitProvider(ABC):
|
|||||||
|
|
||||||
class GitLabProvider(GitProvider):
|
class GitLabProvider(GitProvider):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def check_secret(request_headers, project_secret):
|
def check_secret(request_headers, project_secret, git_type):
|
||||||
"""
|
"""
|
||||||
检查密钥
|
检查密钥
|
||||||
|
:param git_type:
|
||||||
:param request_headers:
|
:param request_headers:
|
||||||
:param project_secret:
|
:param project_secret:
|
||||||
:return:
|
:return:
|
||||||
@ -46,24 +47,27 @@ class GitLabProvider(GitProvider):
|
|||||||
return JsonResponse(status=403, data={"error": "Invalid token"})
|
return JsonResponse(status=403, data={"error": "Invalid token"})
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_project_id(request_json):
|
def get_project_id(request_json, git_type):
|
||||||
"""
|
"""
|
||||||
获取项目ID
|
获取项目ID
|
||||||
|
:param git_type:
|
||||||
:param request_json:
|
:param request_json:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
return request_json.get("project", {}).get("id")
|
return request_json.get("project", {}).get("id")
|
||||||
|
|
||||||
def get_project_config(self, project_id):
|
def get_project_config(self, project_id, git_type):
|
||||||
"""
|
"""
|
||||||
实现GitLab项目配置获取逻辑
|
实现GitLab项目配置获取逻辑
|
||||||
|
:param git_type:
|
||||||
:param project_id:
|
:param project_id:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
git_config = models.GitConfig.objects.filter(git_type=0).first()
|
# TODO: 项目配置需要根据id以及git服务器配置
|
||||||
project_config = models.ProjectConfig.objects.filter(
|
project_config = models.ProjectConfig.objects.filter(
|
||||||
git_config=git_config, project_id=project_id
|
project_id=project_id
|
||||||
).first()
|
).first()
|
||||||
|
git_config = project_config.git_config # Gitlab
|
||||||
if not project_config:
|
if not project_config:
|
||||||
return JsonResponse(status=400, data={"error": "Project not found"})
|
return JsonResponse(status=400, data={"error": "Project not found"})
|
||||||
if not project_config.is_enable:
|
if not project_config.is_enable:
|
||||||
|
|||||||
88
doc/管理员手册.MD
88
doc/管理员手册.MD
@ -1,59 +1,51 @@
|
|||||||
## 管理员操作手册
|
## 管理员操作手册
|
||||||
|
|
||||||
### 一、Git服务器的Webhook配置(Gitlab为例)
|
本文档描述了配置 GitLab Webhook 的标准流程,重点操作如下:
|
||||||
|
|
||||||
1. 在Git服务器(例如 GitHub、GitLab 等)中配置 Webhook,确保当代码提交或分支更新时,能够及时向 PR 管理系统发送通知。
|
---
|
||||||
|
|
||||||
> 个人访问令牌配置(配置Git服务需要用到)
|
### 1. 在 GitLab 中创建用户令牌
|
||||||

|
- 登录 GitLab 后,进入`用户设置`。
|
||||||
|
- 新建个人访问令牌(User Token)。
|
||||||
|
- 保存该令牌,后续在 PR 系统中配置 Git 服务时需要使用。
|
||||||
|

|
||||||
|
|
||||||
> 项目访问令牌配置(配置项目服务需要用到)
|
---
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
2. 配置时,请确认 URL 指向 PR 管理系统,并设置合适的触发条件,如 push 事件和合并请求事件。
|
### 2. 在 PR 系统中创建 Git 服务配置
|
||||||
|
- 登录 PR 管理系统后台,进入`Git服务器配置`模块。
|
||||||
|
- 填写 GitLab 服务器的地址及`步骤1`中创建的用户令牌等必要信息。
|
||||||
|

|
||||||
|
|
||||||
> Webhook 配置
|
---
|
||||||
|
|
||||||
|
### 3. 在 GitLab 中创建项目访问令牌
|
||||||
|
- 进入对应项目,生成项目访问令牌(Project Token)。
|
||||||
|
- 将此令牌保存好,后续将用于项目配置及 Webhook 秘钥设置。
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. 在 PR 系统中创建项目配置
|
||||||
|
- 在 PR 管理系统中进入`项目配置`模块。
|
||||||
|
- 添加新项目,选择Git服务器、填写项目名称、仓库地址,并输入步骤3中创建的项目访问令牌。
|
||||||
|
- 配置完成后,测试项目连接是否正常。
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. 在 GitLab 中配置 Webhook
|
||||||
|
- 打开 GitLab 项目的 Webhook 配置页面。
|
||||||
|
- 设置 Webhook URL 指向 PR 管理系统的webhook地址,暂时配置为:http://{{host}}/api/v1/pr/webhook/
|
||||||
|
- 将 Webhook 的Secret令牌设置为步骤3中创建的项目访问令牌。
|
||||||
|
- 由于目前只处理合并请求,所以触发来源选择`合并请求事件`即可。
|
||||||
|
- 关闭SSL验证。
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
### 二、PR管理系统中Git服务器的配置
|
---
|
||||||
|
|
||||||
> 【示例:当前配置以 GitLab 为例,后续可能支持 Gitea 等其他 Git 服务】
|
### 注意事项
|
||||||
|
- 每一步配置完成后都务必测试,确保各配置项工作正常。
|
||||||
|
- 请妥善保管令牌信息,避免泄露引发安全风险。
|
||||||
1. 登录 PR 管理系统后台,进入“Git服务器配置”模块。
|
- 配置过程中遇到问题,请参考相应系统的详细文档进行排查。
|
||||||
> Git服务器配置(Git地址跟秘钥地址参考个人令牌)
|
|
||||||

|
|
||||||
|
|
||||||
2. 填写 Git 服务器的地址、访问令牌以及其他必要参数。
|
|
||||||
3. 测试连接,确保 PR 管理系统能够正常访问并与 Git 服务器进行数据交互。
|
|
||||||
> 在Git服务器配置中测试,测试无误Pr系统会看到日志
|
|
||||||
|
|
||||||
### 三、PR管理系统中AI服务器的配置
|
|
||||||
1. 在 PR 管理系统中找到“AI服务器配置”入口。
|
|
||||||
> AI服务器配置(填写AI代理地址跟秘钥)
|
|
||||||

|
|
||||||
|
|
||||||
2. 配置 AI 服务器的地址、API 密钥和认证信息,确保系统可以调用 AI 服务进行代码评审或自动合并等操作。
|
|
||||||
3. 完成配置后,执行测试以确认 AI 服务器已正确响应请求。
|
|
||||||
|
|
||||||
### 四、PR管理系统中项目配置
|
|
||||||
1. 在 PR 管理系统中添加和配置项目,填写项目名称、代码仓库地址、分支信息等基本信息。
|
|
||||||
> 要通过PR管理系统管理项目,需要在PR管理系统中添加项目,填写项目名称、代码仓库地址、分支信息等基本信息。
|
|
||||||

|
|
||||||
|
|
||||||
2. 确认项目配置与实际仓库设置一致,确保后续的代码同步和合并操作不会出错。
|
|
||||||
3. 定期更新项目配置,以反映任何仓库地址或分支结构的变动。
|
|
||||||
|
|
||||||
### 五、PR管理系统中指令配置
|
|
||||||
1. 配置自动化操作指令,例如代码审查、自动合并、单元测试的触发指令等。
|
|
||||||
> 目前默认仅支持PR操作
|
|
||||||
|
|
||||||
2. 每条指令应明确触发条件和执行步骤,以保障自动化流程的高效执行。
|
|
||||||
3. 对常用指令编写详细的操作说明,并进行充分测试以确保其可靠性。
|
|
||||||
|
|
||||||
### 六、注意事项
|
|
||||||
1. 配置过程中,请仔细阅读各系统的相关文档,避免因配置错误造成系统故障。
|
|
||||||
2. 完成每项配置后,建议逐个功能进行测试,确保各项服务(Webhook、Git服务器、AI服务器及指令)均能正常工作。
|
|
||||||
3. 定期检查配置状态,及时更新和修复配置问题,保障系统持续稳定运行。
|
|
||||||
|
|||||||
@ -18,7 +18,7 @@ from pathlib import Path
|
|||||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
CONFIG_NAME = BASE_DIR / "config.ini"
|
CONFIG_NAME = BASE_DIR / "config.local.ini"
|
||||||
|
|
||||||
# 加载配置文件: 开发可加载config.local.ini
|
# 加载配置文件: 开发可加载config.local.ini
|
||||||
_config = configparser.ConfigParser()
|
_config = configparser.ConfigParser()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user