Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
734df15
feat(queue): 增加Push事件Commit Message检查功能
Oct 24, 2025
9bbfe81
feat(push): 增强企业微信Push消息支持text格式及@commit者功能
Oct 24, 2025
d5415b5
compose
Oct 25, 2025
ec5603c
compose
Oct 25, 2025
19f7600
compose
Oct 25, 2025
7e468fa
--task=1317595 --user=陈振岭 AIReview支持多项目配置 https://www.tapd.cn/6691485…
Oct 27, 2025
d607fbd
--task=1317595 --user=陈振岭 AIReview支持多项目配置 https://www.tapd.cn/6691485…
Oct 27, 2025
43b9c19
--task=1317886 --user=陈振岭 AIReview添加白名单控制 https://www.tapd.cn/6691485…
Oct 28, 2025
c81b503
access token
Oct 30, 2025
c3aa0be
fix(im): 优化企业微信消息长度计算和分割逻辑
Oct 31, 2025
26d2497
refactor(config): 实现项目专属配置上下文隔离,优化LLM客户端和审查组件配置管理
Oct 31, 2025
4e4fb1f
refactor(config): 实现项目配置优先级提升及隔离设计
Oct 31, 2025
469bca1
feat(notification): 支持基于项目配置的通知webhook定制
Oct 31, 2025
0cc584b
fix(llm): 优化配置获取和连接检查逻辑
Oct 31, 2025
424df90
refactor(api): 重构日报生成逻辑并优化定时任务调度
Oct 31, 2025
9530425
--task=1319488 --user=陈振岭 AIReview支持mysql数据库 https://www.tapd.cn/6691…
Nov 4, 2025
6dff27d
Merge branch 'sunmh207:main' into main
enjoyzl Nov 5, 2025
6773c03
add log
Nov 10, 2025
de5bbd7
Merge branch 'main' of https://github.com/enjoyzl/AI-Codereview-Gitlab
Nov 10, 2025
4793dd7
Merge branch 'sunmh207:main' into main
enjoyzl Nov 10, 2025
9170133
log
Nov 10, 2025
323b147
api
Nov 10, 2025
25f3f59
修复重复@
Nov 11, 2025
133b998
修改调用bug
Nov 11, 2025
bbce5d4
report
Nov 11, 2025
2dca565
Merge
Nov 11, 2025
4d76742
mr excluded
Nov 11, 2025
cdbcfed
CLAUDE
Nov 12, 2025
2518c7f
add k2
Nov 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ log/*
data/*
!data/.gitkeep

conf/.env
**/.env
.pyc
__pycache__/
.cursorignore
.cursor
/conf/*/*
!/conf/group/*
server.log
14 changes: 14 additions & 0 deletions .qoder/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"permissions": {
"ask": [
"Read(!./**)",
"Edit(!./**)"
],
"allow": [
"Read(./**)",
"Edit(./**)"
]
},
"memoryImport": {},
"monitoring": {}
}
128 changes: 128 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# CLAUDE.md

本文件为 Claude Code (claude.ai/code) 在此代码库中工作时提供指导。

## 开发命令

### Docker 开发
```bash
# 启动所有服务
docker-compose up -d

# 停止服务
docker-compose stop

# 查看服务状态
docker-compose ps

# 重启服务
docker-compose restart

# 清理容器
docker-compose rm
```

### 本地开发
```bash
# 启动 Flask API 服务器(端口 5001)
python api.py

# 启动 Streamlit 仪表板(端口 5002)
streamlit run ui.py --server.port=5002 --server.address=0.0.0.0
```

### 测试
```bash
# 运行所有测试
python -m unittest discover -s test -p "test_*.py" -v

# 运行特定模块测试
python -m unittest test.biz.queue.test_whitelist -v
```

### 代码库审查工具
```bash
# 交互式完整代码库审查
python -m biz.cmd.review
```

## 架构概览

### 核心组件
- **Flask API 服务器** (`api.py`):处理 GitLab/GitHub webhook 和审查请求
- **Streamlit 仪表板** (`ui.py`):审查统计和日志的可视化界面
- **多容器部署**:Supervisor 管理的进程,使用 Redis Queue 进行异步处理

### 业务逻辑结构 (`biz/`)
- **`cmd/`**:不同审查功能的命令处理器
- `review.py`:主要审查命令编排器
- `func/`:专门的审查功能(分支、复杂度、目录、MySQL 审查)
- **`gitlab/`** 和 **`github/`**:平台特定的 webhook 处理器和 API 集成
- **`llm/`**:多 LLM 客户端实现,支持 DeepSeek、智谱AI、OpenAI、通义千问和 Ollama
- **`queue/`**:使用 Redis Queue worker 的异步作业处理
- **`service/`**:核心业务服务和审查编排
- **`utils/`**:日志、配置、即时消息通知和报告的实用工具
- **`entity/`**:数据模型和实体

### 配置系统
多级配置,优先级:**项目 > 命名空间 > 全局**
- 全局配置:`conf/.env`
- 命名空间级:`conf/{namespace}/.env`
- 项目级:`conf/{namespace}/{project_name}/.env`

### 数据库选项
- **SQLite**(默认):`data/data.db` - 适合小团队
- **MySQL**:通过环境配置,适合大型部署

## 关键开发模式

### 事件驱动的 Webhook 处理
1. GitLab/GitHub 发送 webhook 事件到 Flask API (`/review/webhook`)
2. 事件通过 Redis Queue 排队进行异步处理
3. Worker 进程处理不同事件类型(合并请求、推送)
4. LLM 集成生成代码审查内容
5. 结果发布回 GitLab/GitHub 并通过即时消息通知发送

### 多 LLM 集成
- 支持 5 个 LLM 提供商的统一接口
- 可按项目/命名空间配置
- Token 管理和响应解析
- 不同的审查风格:专业、讽刺、温和、幽默

### 即时消息通知系统
- **钉钉**:Markdown 消息
- **企业微信**:文本消息支持@提及(推送事件)或 markdown
- **飞书**:应用消息
- **自定义 webhook**:用于扩展性

### 审查控制机制
- **白名单系统**:命名空间和项目级过滤
- **提交消息过滤**:基于正则表达式的触发控制
- **受保护分支过滤**:可选的审查限制
- **文件类型过滤**:可配置的支持扩展名

## 环境配置

复制 `conf/.env.dist` 到 `conf/.env` 并配置:
- LLM 提供商设置(选择一个:deepseek, openai, zhipuai, qwen, ollama)
- GitLab/GitHub 访问令牌
- 即时消息 webhook URL(可选)
- 数据库设置(SQLite/MySQL)
- 审查行为选项(风格、限制、过滤器)

## 端口配置
- **Flask API**:5001
- **Streamlit 仪表板**:5002
- **Ollama**:11434(如果外部使用)

## 测试结构
测试文件镜像 `biz/` 目录结构:
- `test/biz/gitlab/test_webhook_handler.py`:Webhook 处理测试
- `test/biz/queue/test_whitelist_isolation.py`:配置过滤测试
- 基于 pytest 的全面测试,包含 64+ 个测试文件

## 生产部署
- 多阶段 Docker 构建,使用 supervisor 进程管理
- 分离的应用和 worker 容器目标
- 持久数据、日志和配置的卷挂载
- 健康检查和自动重启策略
182 changes: 176 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,25 @@
## 功能

- 🚀 多模型支持
- 兼容 DeepSeek、ZhipuAI、OpenAI、通义千问 和 Ollama,想用哪个就用哪个。
- 兼容 DeepSeek、ZhipuAI、OpenAI、通义千问、OllamaKimi,想用哪个就用哪个。
- 📢 消息即时推送
- 审查结果一键直达 钉钉、企业微信 或 飞书,代码问题无处可藏!
- 🆕 **企微增强**:支持 text 消息格式,可 @commit 者,并展示 AI Review 评分和详情链接!
- 📅 自动化日报生成
- 基于 GitLab & GitHub Commit 记录,自动整理每日开发进展,谁在摸鱼、谁在卷,一目了然 😼。
- 📊 可视化 Dashboard
- 集中展示所有 Code Review 记录,项目统计、开发者统计,数据说话,甩锅无门!
- 🎭 Review Style 任你选
- 专业型 🤵:严谨细致,正式专业。
- 讽刺型 😈:毒舌吐槽,专治不服("这代码是用脚写的吗?")
- 绅士型 🌸:温柔建议,如沐春风("或许这里可以再优化一下呢~")
- 幽默型 🤪:搞笑点评,快乐改码("这段 if-else 比我的相亲经历还曲折!")
- 讽刺型 😈:毒舌吐槽,专治不服(“这代码是用脚写的吗?”)
- 绅士型 🌸:温柔建议,如沐春风(“或许这里可以再优化一下呢~”)
- 幽默型 🤪:搞笑点评,快乐改码(“这段 if-else 比我的相亲经历还曲折!”)
- 🎯 **多级配置系统**
- 支持项目级别、命名空间级别、全局配置,优先级:项目 > 命名空间 > 全局
- 可为不同项目配置独立的 LLM、Review 风格、Prompt 模板等
- 🎯 **白名单控制**
- 支持按命名空间或项目配置 Review 白名单,精准控制哪些项目允许进行代码审查
- 支持 commit message 规则过滤,仅匹配特定 message 时才触发 Review

**效果图:**

Expand Down Expand Up @@ -56,7 +63,7 @@ cp conf/.env.dist conf/.env
- 编辑 conf/.env 文件,配置以下关键参数:

```bash
#大模型供应商配置,支持 zhipuai , openai , deepseek ollama
#大模型供应商配置,支持 zhipuai , openai , deepseek , ollama 和 kimi
LLM_PROVIDER=deepseek

#DeepSeek
Expand All @@ -69,6 +76,14 @@ SUPPORTED_EXTENSIONS=.java,.py,.php,.yml,.vue,.go,.c,.cpp,.h,.js,.css,.md,.sql
DINGTALK_ENABLED=0
DINGTALK_WEBHOOK_URL={YOUR_WDINGTALK_WEBHOOK_URL}

#企业微信消息推送
WECOM_ENABLED=0
WECOM_WEBHOOK_URL={YOUR_WECOM_WEBHOOK_URL}
# Push事件是否使用text消息类型(支持@人):1=启用,0=使用markdown(默认)
PUSH_WECOM_USE_TEXT_MSG=0
# 日报专用webhook(可选)
# WECOM_WEBHOOK_URL_DAILY_REPORT={YOUR_DAILY_REPORT_WEBHOOK_URL}

#Gitlab配置
GITLAB_ACCESS_TOKEN={YOUR_GITLAB_ACCESS_TOKEN}
```
Expand All @@ -77,6 +92,10 @@ GITLAB_ACCESS_TOKEN={YOUR_GITLAB_ACCESS_TOKEN}

```bash
docker-compose up -d
docker-compose stop
docker-compose rm
docker-compose ps
docker-compose restart
```

**3. 验证部署**
Expand Down Expand Up @@ -162,6 +181,143 @@ streamlit run ui.py --server.port=5002 --server.address=0.0.0.0

企业微信和飞书推送配置类似,具体参见 [常见问题](doc/faq.md)

## 高级配置

### 多级配置系统

支持为不同项目或命名空间配置独立的审查规则:

```bash
# 全局配置:conf/.env
LLM_PROVIDER=deepseek
REVIEW_STYLE=professional

# 命名空间级别:conf/{namespace}/.env
# 项目级别:conf/{namespace}/{project_name}/.env
# 优先级:项目级别 > 命名空间级别 > 全局配置
```

### Review 白名单

控制哪些项目允许进行代码审查:

```bash
# 开启白名单功能
REVIEW_WHITELIST_ENABLED=1

# 配置白名单(支持命名空间或完整项目路径)
# 示例1:按命名空间
REVIEW_WHITELIST=asset,frontend

# 示例2:按项目路径
REVIEW_WHITELIST=asset/asset-batch-center,frontend/web-app

# 示例3:混合配置
REVIEW_WHITELIST=asset,frontend/web-app,backend/api-gateway
```

### Commit Message 过滤

仅当 commit message 匹配指定规则时才触发 Review:

```bash
# 开启 commit message 检查
PUSH_COMMIT_MESSAGE_CHECK_ENABLED=1

# 配置匹配规则(支持正则表达式)
PUSH_COMMIT_MESSAGE_CHECK_PATTERN=review
# 或者:PUSH_COMMIT_MESSAGE_CHECK_PATTERN=\[review\]
# 或者:PUSH_COMMIT_MESSAGE_CHECK_PATTERN=(review|codereview)
```

### 企业微信 @人功能

Push 事件支持 text 消息格式,可 @commit 者:

```bash
# 启用 text 消息类型(支持@人)
PUSH_WECOM_USE_TEXT_MSG=1
```

### 日报专用推送配置

支持为日报功能配置独立的 webhook,与 push/merge 事件通知分开:

```bash
# 企业微信日报专用 webhook(可选)
WECOM_WEBHOOK_URL_DAILY_REPORT=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=daily-report-key

# 钉钉日报专用 webhook(可选)
DINGTALK_WEBHOOK_URL_DAILY_REPORT=https://oapi.dingtalk.com/robot/send?access_token=daily-report-token

# 飞书日报专用 webhook(可选)
FEISHU_WEBHOOK_URL_DAILY_REPORT=https://open.feishu.cn/open-apis/bot/v2/hook/daily-report-hook
```

**说明**:
- 日报专用配置仅使用全局默认配置(`conf/.env`),不查找项目或命名空间级别配置
- 如果未配置专用 webhook,则使用默认的 `{PLATFORM}_WEBHOOK_URL`
- 可以将日报推送到管理群,而 push/merge 事件推送到开发群

### 其他高级配置

```bash
# 仅对保护分支的合并请求进行 Review
MERGE_REVIEW_ONLY_PROTECTED_BRANCHES_ENABLED=1

# Review 风格:professional | sarcastic | gentle | humorous
REVIEW_STYLE=professional

# 每次 Review 的最大 Token 限制
REVIEW_MAX_TOKENS=10000
```

### 数据库配置

系统支持 SQLite 和 MySQL 两种数据库存储方式,默认使用 SQLite。

#### 使用 SQLite(默认)

```bash
# 数据库类型(默认:sqlite)
DB_TYPE=sqlite

# SQLite 数据库文件路径(默认:data/data.db)
DB_FILE=data/data.db
```

#### 使用 MySQL

```bash
# 数据库类型
DB_TYPE=mysql

# MySQL 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=ai_codereview
```

**MySQL 初始化**:

1. 创建数据库:
```sql
CREATE DATABASE ai_codereview CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```

2. 导入表结构(可选,系统会自动创建):
```bash
mysql -u root -p ai_codereview < doc/mysql_schema.sql
```

**说明**:
- SQLite:适合小型团队或个人使用,无需额外配置数据库服务
- MySQL:适合中大型团队,支持更高的并发性能和数据规模
- 切换数据库类型前,建议备份现有数据
- 详细使用说明请参见 [数据库使用指南](doc/database.md)

## 其它

**1.如何对整个代码库进行Review?**
Expand All @@ -174,7 +330,21 @@ python -m biz.cmd.review

运行后,请按照命令行中的提示进行操作即可。

**2.其它问题**
**2.如何运行测试?**

项目的所有测试代码统一存放在 `test/` 目录下,组织结构与 `biz/` 目录对应。

```bash
# 运行所有测试
python -m unittest discover -s test -p "test_*.py" -v

# 运行特定模块的测试
python -m unittest test.biz.queue.test_whitelist -v
```

详细的测试说明请参见 [test/README.md](test/README.md)

**3.其它问题**

参见 [常见问题](doc/faq.md)

Expand Down
Loading