Compare commits
No commits in common. "c24e3685e34ae1ab6912c0ee8a7ee67f63701986" and "a2689bde5615701cd408af24d6279a71019dec58" have entirely different histories.
c24e3685e3
...
a2689bde56
@ -22,7 +22,7 @@ class AIConfigAdmin(AjaxAdmin):
|
||||
class GitConfigAdmin(AjaxAdmin):
|
||||
"""Admin配置"""
|
||||
|
||||
list_display = ["git_name", "git_type", "git_url", "access_token", "reviewer"]
|
||||
list_display = ["git_name", "git_type", "git_url", "access_token"]
|
||||
readonly_fields = ["create_by", "delete_at", "detail"]
|
||||
list_per_page = 10
|
||||
top_html = '<el-alert title="可配置多个Git服务上!" type="success"></el-alert>'
|
||||
|
||||
@ -1,20 +0,0 @@
|
||||
# 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,16 +52,13 @@ 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 f"{self.git_name}-{self.reviewer}"
|
||||
return self.git_name
|
||||
|
||||
|
||||
class ProjectConfig(BaseModel):
|
||||
|
||||
@ -1,7 +1,12 @@
|
||||
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
|
||||
|
||||
@ -63,16 +68,16 @@ class WebHookView(View):
|
||||
|
||||
# 获取对应处理类
|
||||
provider = self.select_git_provider(GIT_TYPE)
|
||||
project_id = provider.get_project_id(request_json=json_data, git_type=GIT_TYPE)
|
||||
project_id = provider.get_project_id(request_json=json_data)
|
||||
if not project_id:
|
||||
return JsonResponse(status=400, data={"error": "Missing project ID"})
|
||||
|
||||
# 获取项目配置
|
||||
project_config = provider.get_project_config(project_id=project_id, git_type=GIT_TYPE)
|
||||
project_config = provider.get_project_config(project_id=project_id)
|
||||
|
||||
# Token 校验
|
||||
provider.check_secret(
|
||||
request_headers=headers, project_secret=project_config.get("project_secret"), git_type=GIT_TYPE
|
||||
request_headers=headers, project_secret=project_config.get("project_secret")
|
||||
)
|
||||
|
||||
provider.get_merge_request(
|
||||
|
||||
@ -11,7 +11,7 @@ from utils import constant
|
||||
|
||||
class GitProvider(ABC):
|
||||
@abstractmethod
|
||||
def get_project_config(self, project_id, git_type):
|
||||
def get_project_config(self, project_id):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
@ -34,10 +34,9 @@ class GitProvider(ABC):
|
||||
|
||||
class GitLabProvider(GitProvider):
|
||||
@staticmethod
|
||||
def check_secret(request_headers, project_secret, git_type):
|
||||
def check_secret(request_headers, project_secret):
|
||||
"""
|
||||
检查密钥
|
||||
:param git_type:
|
||||
:param request_headers:
|
||||
:param project_secret:
|
||||
:return:
|
||||
@ -47,27 +46,24 @@ class GitLabProvider(GitProvider):
|
||||
return JsonResponse(status=403, data={"error": "Invalid token"})
|
||||
|
||||
@staticmethod
|
||||
def get_project_id(request_json, git_type):
|
||||
def get_project_id(request_json):
|
||||
"""
|
||||
获取项目ID
|
||||
:param git_type:
|
||||
:param request_json:
|
||||
:return:
|
||||
"""
|
||||
return request_json.get("project", {}).get("id")
|
||||
|
||||
def get_project_config(self, project_id, git_type):
|
||||
def get_project_config(self, project_id):
|
||||
"""
|
||||
实现GitLab项目配置获取逻辑
|
||||
:param git_type:
|
||||
:param project_id:
|
||||
:return:
|
||||
"""
|
||||
# TODO: 项目配置需要根据id以及git服务器配置
|
||||
git_config = models.GitConfig.objects.filter(git_type=0).first()
|
||||
project_config = models.ProjectConfig.objects.filter(
|
||||
project_id=project_id
|
||||
git_config=git_config, 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:
|
||||
|
||||
80
doc/管理员手册.MD
80
doc/管理员手册.MD
@ -1,51 +1,59 @@
|
||||
## 管理员操作手册
|
||||
|
||||
本文档描述了配置 GitLab Webhook 的标准流程,重点操作如下:
|
||||
### 一、Git服务器的Webhook配置(Gitlab为例)
|
||||
|
||||
---
|
||||
1. 在Git服务器(例如 GitHub、GitLab 等)中配置 Webhook,确保当代码提交或分支更新时,能够及时向 PR 管理系统发送通知。
|
||||
|
||||
### 1. 在 GitLab 中创建用户令牌
|
||||
- 登录 GitLab 后,进入`用户设置`。
|
||||
- 新建个人访问令牌(User Token)。
|
||||
- 保存该令牌,后续在 PR 系统中配置 Git 服务时需要使用。
|
||||

|
||||
> 个人访问令牌配置(配置Git服务需要用到)
|
||||

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

|
||||

|
||||
|
||||
### 2. 在 PR 系统中创建 Git 服务配置
|
||||
- 登录 PR 管理系统后台,进入`Git服务器配置`模块。
|
||||
- 填写 GitLab 服务器的地址及`步骤1`中创建的用户令牌等必要信息。
|
||||

|
||||
2. 配置时,请确认 URL 指向 PR 管理系统,并设置合适的触发条件,如 push 事件和合并请求事件。
|
||||
|
||||
---
|
||||
> Webhook 配置
|
||||

|
||||

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

|
||||
### 二、PR管理系统中Git服务器的配置
|
||||
|
||||
---
|
||||
> 【示例:当前配置以 GitLab 为例,后续可能支持 Gitea 等其他 Git 服务】
|
||||
|
||||
### 4. 在 PR 系统中创建项目配置
|
||||
- 在 PR 管理系统中进入`项目配置`模块。
|
||||
- 添加新项目,选择Git服务器、填写项目名称、仓库地址,并输入步骤3中创建的项目访问令牌。
|
||||
- 配置完成后,测试项目连接是否正常。
|
||||
|
||||
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. 定期更新项目配置,以反映任何仓库地址或分支结构的变动。
|
||||
|
||||
### 5. 在 GitLab 中配置 Webhook
|
||||
- 打开 GitLab 项目的 Webhook 配置页面。
|
||||
- 设置 Webhook URL 指向 PR 管理系统的webhook地址,暂时配置为:http://{{host}}/api/v1/pr/webhook/
|
||||
- 将 Webhook 的Secret令牌设置为步骤3中创建的项目访问令牌。
|
||||
- 由于目前只处理合并请求,所以触发来源选择`合并请求事件`即可。
|
||||
- 关闭SSL验证。
|
||||

|
||||

|
||||
### 五、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'.
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
|
||||
CONFIG_NAME = BASE_DIR / "config.local.ini"
|
||||
CONFIG_NAME = BASE_DIR / "config.ini"
|
||||
|
||||
# 加载配置文件: 开发可加载config.local.ini
|
||||
_config = configparser.ConfigParser()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user