- 多维度分析: 代码质量、安全漏洞、性能优化、最佳实践
- AI 驱动: 基于阿里云通义千问,提供专业的审查意见
- 灵活配置: 支持基础、安全、性能、综合等多种审查类型
- 实时反馈: 异步处理,快速响应
- GitLab: 完整的 MR 审查流程
- GitHub: PR 自动审查
- Gitee: 国内代码托管平台支持
- Webhook: 自动触发,无缝集成
- JWT 认证: 无状态认证,支持角色权限
- 签名验证: HMAC-SHA256 Webhook 验证
- 安全头: CSP、HSTS、XSS 防护
- 输入验证: 全面的参数校验和清理
- 配置管理: AI 模型、仓库配置
- 实时监控: 系统状态、审查统计
- 用户友好: 现代化 Web 界面
- Java: 17 或更高版本
- Maven: 3.6+
- 内存: 最小 512MB,推荐 1GB+
- API 密钥: 阿里云 DashScope API Key
# 1. 克隆项目
git clone https://github.com/yourusername/AstraLint.git
cd AstraLint
# 2. 配置环境变量
cp env.example .env
# 编辑 .env 文件,设置必要参数
# 3. 启动应用
mvn spring-boot:run- 主页: http://localhost:8080
- 代码审查: http://localhost:8080/secure-review.html
- 管理控制台: http://localhost:8080/admin/ (需要登录)
- 健康检查: http://localhost:8080/actuator/health
用户名: admin
密码: admin123
⚠️ 安全提醒: 生产环境请务必修改默认密码
创建 .env 文件并设置以下环境变量:
# AI 服务配置 (必需)
DASHSCOPE_API_KEY=your_dashscope_api_key_here
# JWT 安全配置 (必需)
JWT_SECRET=your_jwt_secret_at_least_256_bits_long
# 数据库配置 (生产环境)
DATABASE_PASSWORD=your_secure_password# GitLab 集成
GITLAB_URL=http://localhost:8929
GITLAB_TOKEN=your_gitlab_token
GITLAB_WEBHOOK_SECRET=your_webhook_secret
# GitHub 集成
GITHUB_TOKEN=your_github_token
GITHUB_WEBHOOK_SECRET=your_github_secret
# Gitee 集成
GITEE_TOKEN=your_gitee_token
GITEE_WEBHOOK_SECRET=your_gitee_secret
# 管理员账户
ADMIN_USERNAME=admin
ADMIN_PASSWORD=your_admin_passwordPOST /api/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}响应:
{
"success": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"username": "admin",
"roles": ["ADMIN", "USER"]
}POST /api/code-review/quick
Content-Type: application/json
{
"projectId": "my-project",
"mergeRequestId": "123",
"diffContent": "diff --git a/src/main.js...",
"reviewType": "COMPREHENSIVE"
}POST /api/code-review/submit
Authorization: Bearer <your-jwt-token>
Content-Type: application/json
{
"projectId": "my-project",
"mergeRequestId": "123",
"diffContent": "git diff content...",
"reviewType": "SECURITY",
"language": "java"
}BASIC: 基础代码审查SECURITY: 安全漏洞检查PERFORMANCE: 性能优化建议COMPREHENSIVE: 综合全面审查
POST /api/webhook/gitlab
X-Gitlab-Event: Merge Request Hook
X-Gitlab-Token: your_webhook_secret
Content-Type: application/json
{
"object_kind": "merge_request",
"object_attributes": {
"action": "opened",
"iid": 123
},
"project": {
"id": 456
}
}POST /api/webhook/github
X-GitHub-Event: pull_request
X-Hub-Signature-256: sha256=<signature>
Content-Type: application/json
{
"action": "opened",
"pull_request": {
"number": 123
},
"repository": {
"full_name": "owner/repo"
}
}# 构建镜像
docker build -t astralint:latest .
# 运行容器
docker run -d \
--name astralint \
-p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-e DASHSCOPE_API_KEY=your_api_key \
-e JWT_SECRET=your_jwt_secret \
-e DATABASE_PASSWORD=your_db_password \
astralint:latest# 创建生产配置
export SPRING_PROFILES_ACTIVE=prod
export DATABASE_URL=jdbc:mysql://localhost:3306/astralint
export DATABASE_USERNAME=astralint_user
export DATABASE_PASSWORD=secure_passwordserver {
listen 80;
server_name yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}# /etc/systemd/system/astralint.service
[Unit]
Description=AstraLint Code Review Service
After=network.target
[Service]
Type=simple
User=astralint
WorkingDirectory=/opt/astralint
ExecStart=/usr/bin/java -jar astralint.jar
EnvironmentFile=/opt/astralint/.env
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetAstraLint 采用现代化的 CI/CD 流程,确保代码质量和部署可靠性:
- 构建测试: 自动编译、单元测试、集成测试
- 代码质量: Checkstyle 静态分析
- 安全扫描: CodeQL 语义分析
- 单元测试: Mock 测试框架,覆盖核心业务逻辑
# 查看所有可用命令
make help
# 完整构建流程
make build
# 代码质量检查
make quality
# 运行测试
make test
# Docker 构建
make docker-build
# 完整 CI 流程
make ci-full详细的 CI/CD 配置和使用指南请参阅 CI_SETUP.md
AstraLint/
├── src/main/java/org/linshuai/astralint/
│ ├── controller/ # REST 控制器
│ │ ├── AuthController.java
│ │ ├── CodeReviewController.java
│ │ ├── AdminController.java
│ │ └── WebhookController.java
│ ├── service/ # 业务服务层
│ │ ├── AiCodeReviewService.java
│ │ ├── AiModelService.java
│ │ └── *Service.java
│ ├── config/ # 配置类
│ │ ├── SecurityConfig.java
│ │ ├── AiConfig.java
│ │ └── WebConfig.java
│ ├── entity/ # 实体类
│ ├── repository/ # 数据访问层
│ ├── dto/ # 数据传输对象
│ └── util/ # 工具类
├── src/main/resources/
│ ├── application.yml # 主配置文件
│ ├── application-dev.yml # 开发环境配置
│ ├── application-prod.yml # 生产环境配置
│ └── static/ # 静态资源
├── src/test/java/ # Mock单元测试
│ ├── CodeVoyantApplicationTests.java
│ ├── service/ # 服务层测试
│ └── util/ # 工具类测试
└── SECURITY_FIXES.md # 安全修复报告
# 启动开发环境
export SPRING_PROFILES_ACTIVE=dev
mvn spring-boot:run
# 运行Mock单元测试
mvn test
# 代码质量检查
mvn checkstyle:checkAstraLint 采用现代化的 Mock 测试框架,确保代码质量和业务逻辑的正确性:
- 22 个测试用例 全部通过
- Mock 对象: 使用 Mockito 模拟外部依赖
- 无 Spring 上下文: 轻量级单元测试,启动快速
- 业务逻辑验证: 专注核心功能测试
# 主应用测试
CodeVoyantApplicationTests.java
├── AI模型服务测试
├── 代码审查服务测试
├── GitHub服务测试
├── 工具方法测试
└── Mock对象验证
# 服务层测试
service/AiCodeReviewServiceTest.java
├── 代码差异处理测试
├── 文件路径解析测试
├── 变更行数计算测试
└── 异常处理测试
# GitHub服务测试
service/GitHubServiceTest.java
├── API URL构建测试
├── 响应处理测试
├── 配置验证测试
└── Mock HTTP调用测试
# 工具类测试
util/CodeReviewUtilsTest.java
├── 文件扩展名提取测试
├── 语言类型判断测试
├── 复杂度计算测试
├── 差异格式验证测试
└── 安全问题检测测试# 运行所有测试
mvn test
# 运行特定测试类
mvn test -Dtest=CodeVoyantApplicationTests
# 运行测试并生成覆盖率报告
mvn test jacoco:report
# 查看测试结果
open target/site/jacoco/index.html-
新增审查规则
// 在 AiCodeReviewService 中添加 public String customCodeReview(String code) { // 自定义审查逻辑 }
-
新增 API 端点
// 在对应 Controller 中添加 @PostMapping("/custom") public ResponseEntity<String> customEndpoint(@Valid @RequestBody Request request) { // 端点逻辑 }
-
新增配置选项
# 在 application.yml 中添加 custom: feature: enabled: ${CUSTOM_FEATURE_ENABLED:false}
| 安全方面 | 等级 | 说明 |
|---|---|---|
| 认证授权 | A | JWT + 角色权限控制 |
| 数据保护 | A | 环境变量 + 加密传输 |
| 输入验证 | A | Bean Validation + XSS 防护 |
| 网络安全 | A | CORS 限制 + 安全头 |
| Webhook 安全 | A | HMAC-SHA256 签名验证 |
-
生产部署检查清单
- 修改默认管理员密码
- 配置强 JWT 密钥 (256 位+)
- 启用 HTTPS
- 配置 Webhook 签名验证
- 限制网络访问
-
定期安全维护
- 更新依赖版本
- 轮换 API 密钥
- 审查访问日志
- 备份重要数据
详细安全信息请查看 安全修复报告
# 基础健康检查
curl http://localhost:8080/actuator/health
# 详细健康信息 (需要认证)
curl -H "Authorization: Bearer <token>" \
http://localhost:8080/actuator/health/details# 应用指标
curl http://localhost:8080/actuator/metrics
# JVM 信息
curl http://localhost:8080/actuator/info# 生产环境日志配置
logging:
level:
org.linshuai.astralint: INFO
org.springframework.security: WARN
file:
name: /var/log/astralint/application.log
pattern:
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"# 团队代码审查工作流
1. 开发者提交 MR/PR
2. 自动触发 AI 审查
3. 生成详细审查报告
4. 团队评审和改进# 安全漏洞检测
curl -X POST http://localhost:8080/api/code-review/security \
-H "Content-Type: application/json" \
-d '{
"projectId": "secure-app",
"diffContent": "your code changes...",
"reviewType": "SECURITY"
}'# 性能分析和优化
curl -X POST http://localhost:8080/api/code-review/performance \
-H "Content-Type: application/json" \
-d '{
"projectId": "high-perf-app",
"diffContent": "performance critical code...",
"reviewType": "PERFORMANCE"
}'- Fork 本仓库
- 创建功能分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add amazing feature') - 推送分支 (
git push origin feature/amazing-feature) - 创建 Pull Request
- 遵循 Java 编码标准 (Google Java Style)
- 编写 Mock 单元测试,确保业务逻辑覆盖
- 更新相关文档
- 通过所有 CI 检查 (Checkstyle + CodeQL)
使用 GitHub Issues 报告 Bug,请包含:
- 详细的问题描述
- 复现步骤
- 环境信息 (Java 版本、操作系统)
- 相关日志和截图
- Spring Boot 3.2.0: 主应用框架
- Spring Security: 认证和授权
- Spring AI: AI 集成框架
- Spring Data JPA: 数据持久化
- H2/MySQL: 数据库支持
- JWT: 无状态认证
- Maven: 依赖管理
- HTML5: 现代标记语言
- CSS3: 响应式样式
- JavaScript ES6+: 现代前端脚本
- Font Awesome: 图标库
- Responsive Design: 移动端适配
- 阿里云 DashScope: 通义千问 AI 模型
- 灵活配置: 支持多 AI 提供商
- 模型管理: 动态切换和配置
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- Spring Boot - 强大的 Java 应用框架
- Spring AI - AI 集成框架
- 阿里云通义千问 - AI 模型服务
- 所有贡献者和使用者
- 📖 文档: 项目文档
- 🐛 问题: GitHub Issues
- 💬 讨论: GitHub Discussions
- 📧 邮件: support@astralint.com
⭐ 如果这个项目对你有帮助,请给个 Star!
Made with ❤️ by the AstraLint Team