86 lines
3.8 KiB
Markdown
86 lines
3.8 KiB
Markdown
# CodeReview Bot (MVP)
|
||
|
||
Реализовано в текущем MVP:
|
||
|
||
- Регистрация в Telegram: `/register <git_email> <gitea_login>`
|
||
- Период недоступности: `/away <YYYY-MM-DD> <YYYY-MM-DD>`
|
||
- Webhook Gitea по PR:
|
||
- при создании PR без ревьюера бот назначает доступного участника с минимальной нагрузкой
|
||
- ставит метку `auto-assigned` (best effort)
|
||
- отправляет уведомление назначенному ревьюеру в личные сообщения Telegram
|
||
- Ежедневное напоминание в общее время `REMINDER_TIME` (по умолчанию `09:00`)
|
||
- Техническая проверка сервиса: `GET /health`
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
python -m venv .venv
|
||
. .venv/Scripts/activate
|
||
pip install -r requirements.txt
|
||
uvicorn main:app --host 0.0.0.0 --port 8080 --reload --env-file .env
|
||
```
|
||
|
||
## Переменные окружения
|
||
|
||
- `TELEGRAM_BOT_TOKEN` - обязательно
|
||
- `TELEGRAM_WEBHOOK_SECRET` - обязательно, секрет для заголовка `X-Telegram-Bot-Api-Secret-Token`
|
||
- `GITEA_BASE_URL` - обязательно для назначения ревьюера, например `https://git.example.com`
|
||
- `GITEA_TOKEN` - обязательно для назначения/меток
|
||
- `GITEA_WEBHOOK_SECRET` - обязательно, общий секрет webhook от Gitea
|
||
- `REMINDER_TIME` - необязательно, по умолчанию `09:00`
|
||
- `AUTO_ASSIGNED_LABEL` - необязательно, по умолчанию `auto-assigned`
|
||
- `ALLOW_SELF_ASSIGN` - необязательно, по умолчанию `false` (для локального теста можно `true`)
|
||
- `TELEGRAM_ALLOWED_CHAT_IDS` - необязательно, CSV списка `chat_id`, которым можно управлять ботом
|
||
- `TELEGRAM_ALLOWED_USERNAMES` - необязательно, CSV списка Telegram username (без `@`)
|
||
- `GITEA_COUNT_REPOS` - необязательно, CSV репозиториев `org/repo` для расчета нагрузки ревьюеров
|
||
- `BOT_DB_PATH` - необязательно, по умолчанию `botreviewer.sqlite3`
|
||
|
||
## Webhook-эндпоинты
|
||
|
||
- Обновления Telegram: `POST /telegram/webhook`
|
||
- Webhook Gitea: `POST /gitea/webhook`
|
||
|
||
Для Telegram укажите URL вашего сервиса с путем `/telegram/webhook` и `secret_token`.
|
||
Для Gitea включите события `pull_request` и задайте общий секрет.
|
||
|
||
## Локальная разработка через Tuna
|
||
|
||
Если бот запущен локально, Gitea/Telegram не смогут достучаться до `localhost` без туннеля.
|
||
|
||
1. Запустите бота:
|
||
|
||
```bash
|
||
uvicorn main:app --host 0.0.0.0 --port 8080 --reload --env-file .env
|
||
```
|
||
|
||
2. Поднимите туннель в Tuna(https://my.tuna.am/) на локальный порт `8080` и получите публичный URL, например:
|
||
|
||
```text
|
||
https://example.ru.tuna.am
|
||
```
|
||
|
||
3. Проверьте доступность сервиса:
|
||
|
||
```text
|
||
https://example.ru.tuna.am/health
|
||
```
|
||
|
||
4. Настройте webhook в Gitea:
|
||
- Target URL: `https://example.ru.tuna.am/gitea/webhook`
|
||
- Method: `POST`
|
||
- Content Type: `application/json`
|
||
- Secret: тот же, что в `GITEA_WEBHOOK_SECRET`
|
||
- Events: `Pull Request` (Custom Events)
|
||
|
||
5. Настройте webhook в Telegram:
|
||
|
||
```text
|
||
https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/setWebhook?url=https://example.ru.tuna.am/telegram/webhook&secret_token=<TELEGRAM_WEBHOOK_SECRET>
|
||
```
|
||
|
||
6. Проверьте, что webhook установлен:
|
||
|
||
```text
|
||
https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getWebhookInfo
|
||
```
|