225 lines
5.9 KiB
Markdown
225 lines
5.9 KiB
Markdown
|
|
# AI Code Quality Scanner - 飞书通知版
|
|||
|
|
|
|||
|
|
一个自动化代码质量扫描系统,在代码提交时自动扫描并发送报告到飞书。
|
|||
|
|
|
|||
|
|
## 功能特性
|
|||
|
|
|
|||
|
|
- 🤖 自动监听 Gitea 代码提交事件
|
|||
|
|
- 🔍 多维度代码质量扫描(语法、风格、安全)
|
|||
|
|
- 📊 生成 Markdown 格式扫描报告
|
|||
|
|
- 📱 实时推送飞书机器人通知
|
|||
|
|
|
|||
|
|
## 系统架构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────┐ Webhook ┌──────────────────┐
|
|||
|
|
│ Gitea │ ───────────────► │ Webhook Server │
|
|||
|
|
│ 代码仓库 │ │ (Flask) │
|
|||
|
|
└─────────────┘ └────────┬─────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌──────────────────┐
|
|||
|
|
│ Code Scanner │
|
|||
|
|
│ - ESLint │
|
|||
|
|
│ - Pylint │
|
|||
|
|
│ - SonarQube │
|
|||
|
|
└────────┬─────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌──────────────────┐
|
|||
|
|
│ Report Generator│
|
|||
|
|
│ - Markdown │
|
|||
|
|
└────────┬─────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌──────────────────┐
|
|||
|
|
│ Feishu Bot │
|
|||
|
|
│ - Webhook │
|
|||
|
|
└──────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 快速开始
|
|||
|
|
|
|||
|
|
### 1. 安装依赖
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
pip install -r requirements.txt
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 配置飞书机器人
|
|||
|
|
|
|||
|
|
1. 打开飞书群聊 → 设置 → 群机器人
|
|||
|
|
2. 添加机器人 → 选择"自定义机器人"
|
|||
|
|
3. 获取 Webhook 地址
|
|||
|
|
4. 配置 `config.yaml`
|
|||
|
|
|
|||
|
|
### 3. 配置 Gitea Webhook
|
|||
|
|
|
|||
|
|
#### 方式一:Push 时扫描(原有方式)
|
|||
|
|
|
|||
|
|
1. 进入 Gitea 仓库 → 设置 → Webhooks
|
|||
|
|
2. 添加 Webhook:
|
|||
|
|
- 目标 URL: `http://你的服务器IP:5000/webhook/gitea`
|
|||
|
|
- 触发事件: Push
|
|||
|
|
- 密钥: 配置 `config.yaml` 中的 secret
|
|||
|
|
|
|||
|
|
#### 方式二:PR 创建时扫描(推荐)
|
|||
|
|
|
|||
|
|
1. 进入 Gitea 仓库 → 设置 → Webhooks
|
|||
|
|
2. 添加 Webhook:
|
|||
|
|
- 目标 URL: `http://你的服务器IP:5000/webhook/gitea`
|
|||
|
|
- 触发事件: Pull Request
|
|||
|
|
- 密钥: 配置 `config.yaml` 中的 secret
|
|||
|
|
|
|||
|
|
**支持的 PR 事件:**
|
|||
|
|
- `opened` - 创建新 PR
|
|||
|
|
- `reopened` - 重新打开 PR
|
|||
|
|
- `synchronize` - PR 中的提交有更新
|
|||
|
|
- `ready_for_review` - PR 标记为准备好审查
|
|||
|
|
|
|||
|
|
### 4. 运行服务
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
python app.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 配置说明
|
|||
|
|
|
|||
|
|
所有配置在 `config.yaml` 中:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
server:
|
|||
|
|
host: "0.0.0.0"
|
|||
|
|
port: 5000
|
|||
|
|
debug: true
|
|||
|
|
|
|||
|
|
gitea:
|
|||
|
|
base_url: "http://localhost:3000"
|
|||
|
|
# Webhook 签名密钥
|
|||
|
|
webhook_secret: "your_webhook_secret"
|
|||
|
|
|
|||
|
|
feishu:
|
|||
|
|
# 飞书机器人 Webhook 地址
|
|||
|
|
webhook_url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
|||
|
|
# 消息推送 secret(可选,用于签名)
|
|||
|
|
secret: "your_feishu_secret"
|
|||
|
|
|
|||
|
|
scanner:
|
|||
|
|
# 支持的语言
|
|||
|
|
languages:
|
|||
|
|
- python
|
|||
|
|
- javascript
|
|||
|
|
- typescript
|
|||
|
|
# 扫描阈值
|
|||
|
|
max_issues: 10
|
|||
|
|
# 是否启用详细扫描
|
|||
|
|
detailed: true
|
|||
|
|
|
|||
|
|
report:
|
|||
|
|
# 报告保存路径
|
|||
|
|
output_dir: "./reports"
|
|||
|
|
# 是否保留报告文件
|
|||
|
|
keep_files: true
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 项目结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
code-scanner/
|
|||
|
|
├── app.py # 主应用入口
|
|||
|
|
├── config.yaml # 配置文件
|
|||
|
|
├── requirements.txt # Python 依赖
|
|||
|
|
├── README.md # 项目说明
|
|||
|
|
├── scanner/
|
|||
|
|
│ ├── __init__.py
|
|||
|
|
│ ├── base.py # 扫描器基类
|
|||
|
|
│ ├── python_scanner.py # Python 代码扫描
|
|||
|
|
│ ├── js_scanner.py # JavaScript/TypeScript 扫描
|
|||
|
|
│ └── security_scanner.py # 安全扫描
|
|||
|
|
├── report/
|
|||
|
|
│ ├── __init__.py
|
|||
|
|
│ └── generator.py # Markdown 报告生成
|
|||
|
|
├── notify/
|
|||
|
|
│ ├── __init__.py
|
|||
|
|
│ └── feishu.py # 飞书通知
|
|||
|
|
├── webhook/
|
|||
|
|
│ ├── __init__.py
|
|||
|
|
│ └── handler.py # Webhook 处理
|
|||
|
|
└── reports/ # 报告输出目录
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 支持的扫描工具
|
|||
|
|
|
|||
|
|
### Python
|
|||
|
|
- **Pylint** - 代码风格和错误检查
|
|||
|
|
- **Flake8** - Python 代码检查
|
|||
|
|
- **Bandit** - 安全漏洞扫描
|
|||
|
|
|
|||
|
|
### JavaScript/TypeScript
|
|||
|
|
- **ESLint** - JavaScript/TypeScript 检查
|
|||
|
|
- **Prettier** - 代码格式化
|
|||
|
|
|
|||
|
|
## 飞书消息效果
|
|||
|
|
|
|||
|
|
扫描完成后,将收到类似以下消息:
|
|||
|
|
|
|||
|
|
### Push 扫描消息
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
📊 代码质量扫描报告
|
|||
|
|
|
|||
|
|
仓库: my-project
|
|||
|
|
分支: main
|
|||
|
|
提交: abc1234
|
|||
|
|
提交者: developer@example.com
|
|||
|
|
|
|||
|
|
✅ 扫描通过 (0 issues)
|
|||
|
|
或
|
|||
|
|
⚠️ 发现问题 (5 issues)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### PR 扫描消息
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
📊 PR 代码质量扫描报告
|
|||
|
|
|
|||
|
|
仓库: my-project
|
|||
|
|
源分支: feature-xxx → 目标分支: main
|
|||
|
|
PR链接: https://gitea.example.com/user/project/pulls/123
|
|||
|
|
提交: abc1234
|
|||
|
|
提交者: developer@example.com
|
|||
|
|
|
|||
|
|
✅ 扫描通过 (0 issues)
|
|||
|
|
或
|
|||
|
|
⚠️ 发现问题 (5 issues)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Docker 部署
|
|||
|
|
|
|||
|
|
```dockerfile
|
|||
|
|
FROM python:3.11-slim
|
|||
|
|
|
|||
|
|
WORKDIR /app
|
|||
|
|
COPY requirements.txt .
|
|||
|
|
RUN pip install -r requirements.txt
|
|||
|
|
|
|||
|
|
COPY . .
|
|||
|
|
EXPOSE 5000
|
|||
|
|
|
|||
|
|
CMD ["python", "app.py"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 环境变量
|
|||
|
|
|
|||
|
|
也可以通过环境变量配置:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
export FEISHU_WEBHOOK_URL="https://open.feishu.cn/..."
|
|||
|
|
export GITEA_WEBHOOK_SECRET="secret"
|
|||
|
|
export SCANNER_MAX_ISSUES=10
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 许可证
|
|||
|
|
|
|||
|
|
MIT License
|