- Introduced new models for `Organization` and `ReviewTask` to manage organizations and review tasks. - Implemented API endpoints for CRUD operations on organizations and tasks, including scanning organizations for repositories and PRs. - Developed a background worker for sequential processing of review tasks with priority handling and automatic retries. - Created frontend components for managing organizations and monitoring task queues, including real-time updates and filtering options. - Added comprehensive documentation for organization features and quick start guides. - Fixed UI issues and improved navigation for better user experience.
9.1 KiB
9.1 KiB
🏢 Организации и Очередь Задач
📋 Новая функциональность
1. Поддержка организаций 🏢
Теперь можно добавлять целые организации (не только отдельные репозитории):
- Одна кнопка - сканирование всех репозиториев
- Автоматический поиск всех PR
- Создание задач на review
2. Очередь задач 📝
Review выполняются последовательно (по одному):
- Задачи ставятся в очередь
- Worker обрабатывает по одной
- Приоритеты: HIGH > NORMAL > LOW
- Автоматический retry при ошибках
🎯 Как использовать
Добавить организацию:
POST /api/organizations
{
"name": "inno-js",
"platform": "gitea",
"base_url": "https://git.bro-js.ru",
"api_token": "your_token" // опционально
}
Сканировать организацию:
POST /api/organizations/1/scan
Что произойдет:
- ✅ Найдет все репозитории в организации
- ✅ Добавит отсутствующие репозитории в БД
- ✅ Найдет все открытые PR
- ✅ Создаст задачи на review
- ✅ Worker автоматически начнет обработку
📊 Структура БД
Таблица organizations:
CREATE TABLE organizations (
id INTEGER PRIMARY KEY,
name VARCHAR NOT NULL,
platform VARCHAR NOT NULL, -- gitea/github/bitbucket
base_url VARCHAR NOT NULL,
api_token VARCHAR, -- encrypted, optional
webhook_secret VARCHAR NOT NULL,
config JSON,
is_active BOOLEAN DEFAULT TRUE,
last_scan_at DATETIME,
created_at DATETIME,
updated_at DATETIME
);
Таблица review_tasks:
CREATE TABLE review_tasks (
id INTEGER PRIMARY KEY,
pull_request_id INTEGER NOT NULL,
status VARCHAR NOT NULL, -- pending/in_progress/completed/failed
priority VARCHAR NOT NULL, -- low/normal/high
created_at DATETIME,
started_at DATETIME,
completed_at DATETIME,
error_message VARCHAR,
retry_count INTEGER DEFAULT 0,
max_retries INTEGER DEFAULT 3,
FOREIGN KEY (pull_request_id) REFERENCES pull_requests(id)
);
🔄 Task Worker
Как работает:
while True:
# 1. Проверить есть ли in_progress задача
if has_in_progress_task():
wait()
continue
# 2. Взять следующую pending задачу
task = get_next_pending_task()
if not task:
wait()
continue
# 3. Отметить как in_progress
task.status = "in_progress"
# 4. Выполнить review
try:
execute_review(task)
task.status = "completed"
except:
task.retry_count += 1
if task.retry_count >= task.max_retries:
task.status = "failed"
else:
task.status = "pending" # retry
# 5. Подождать 10 секунд
await asyncio.sleep(10)
Гарантии:
✅ Один review одновременно - проверяется наличие in_progress задач
✅ Приоритеты - высокий приоритет обрабатывается первым
✅ Retry - автоматически повторяет при ошибках (до 3 раз)
✅ FIFO - старые задачи обрабатываются первыми (при равном приоритете)
📡 API Endpoints
Organizations:
GET /api/organizations # Список организаций
POST /api/organizations # Создать организацию
GET /api/organizations/{id} # Получить организацию
PUT /api/organizations/{id} # Обновить организацию
DELETE /api/organizations/{id} # Удалить организацию
POST /api/organizations/{id}/scan # Сканировать организацию
Tasks:
GET /api/tasks # Список задач
GET /api/tasks?status=pending # Фильтр по статусу
GET /api/tasks/worker/status # Статус worker'а
POST /api/tasks/{id}/retry # Повторить задачу
DELETE /api/tasks/{id} # Удалить задачу
🎨 Пример сканирования
Request:
POST /api/organizations/1/scan
Response:
{
"organization_id": 1,
"repositories_found": 15,
"repositories_added": 3,
"pull_requests_found": 8,
"tasks_created": 8,
"errors": []
}
Логи:
🔍 Сканирование организации inno-js на https://git.bro-js.ru
Найдено репозиториев: 15
✅ Добавлен репозиторий: inno-js/project-a
✅ Добавлен репозиторий: inno-js/project-b
✅ Добавлен репозиторий: inno-js/project-c
📝 Создана задача для PR #5: Add feature X
📝 Создана задача для PR #12: Fix bug Y
📝 Создана задача для PR #3: Update docs
...
🚀 Worker Logs
🚀 Task Worker запущен
================================================================================
📋 Начало обработки задачи #1
PR ID: 5
Приоритет: normal
================================================================================
🤖 Запуск AI review для PR #5
✅ Review завершен для PR #5
✅ Задача #1 успешно завершена
================================================================================
📋 Начало обработки задачи #2
PR ID: 12
Приоритет: normal
================================================================================
🤖 Запуск AI review для PR #12
✅ Review завершен для PR #12
✅ Задача #2 успешно завершена
⏳ Задача #3 уже выполняется
...
🎯 Приоритеты задач
Установка приоритета:
# В коде при создании задачи
task = ReviewTask(
pull_request_id=pr.id,
priority="high" # "low" / "normal" / "high"
)
Порядок обработки:
- HIGH - критичные PR (hotfix, security)
- NORMAL - обычные PR (по умолчанию)
- LOW - некритичные PR (docs, refactoring)
При равном приоритете - FIFO (First In, First Out)
🔧 Конфигурация Worker
В коде:
# backend/app/workers/task_worker.py
class ReviewTaskWorker:
def __init__(self):
self.poll_interval = 10 # секунд между проверками
Изменить интервал:
worker.poll_interval = 5 # проверять каждые 5 секунд
📊 Мониторинг
Статус worker'а:
GET /api/tasks/worker/status
{
"running": true,
"current_task_id": 15,
"poll_interval": 10
}
Статистика задач:
GET /api/tasks
{
"items": [...],
"total": 50,
"pending": 10,
"in_progress": 1,
"completed": 35,
"failed": 4
}
🛠️ Troubleshooting
Worker не обрабатывает задачи:
# Проверить статус
curl http://localhost:8000/api/tasks/worker/status
# Проверить есть ли pending задачи
curl http://localhost:8000/api/tasks?status=pending
# Проверить логи backend
journalctl -u ai-review -f
Задача застряла в in_progress:
# Вручную сбросить статус в БД
sqlite3 backend/review.db
UPDATE review_tasks SET status='pending', started_at=NULL WHERE id=123;
Retry failed задачи:
POST /api/tasks/123/retry
✅ Преимущества
- Последовательная обработка - не перегружаем Ollama
- Приоритеты - важные PR быстрее
- Автоматический retry - устойчивость к ошибкам
- Масштабируемость - легко добавлять организации
- Мониторинг - видно состояние очереди
🎉 Готово!
Теперь можно:
- ✅ Добавлять организации целиком
- ✅ Сканировать все репозитории
- ✅ Автоматически ставить PR в очередь
- ✅ Обрабатывать последовательно
- ✅ Мониторить прогресс
Попробуйте! 🚀