ReviewBot/README.md

105 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CodeReview Bot
Реализовано:
- Регистрация в Telegram: `/register <git_email> <gitea_login>`
- Период недоступности: `/away <YYYY-MM-DD> <YYYY-MM-DD>`
- Настройка времени напоминания: `/reminder HH:MM`
- Просмотр открытых ревью: `/myreviews`
- Webhook Gitea по PR:
- при создании PR без ревьюера бот назначает доступных участников
- количество автоназначаемых ревьюеров задается `AUTO_ASSIGN_REVIEWERS_COUNT` (по умолчанию `2`)
- при ручном назначении ревьюеров автоназначение пропускается
- ставится метка `auto-assigned` (для автоназначения)
- отправляются уведомления в Telegram ЛС
- Уведомления по событиям PR:
- новое назначение ревьюера;
- новый комментарий;
- новые коммиты в открытом PR (`synchronize`/`synchronized`);
- статус ревью (`approved` / `request changes`);
- закрытие/merge PR;
- достижение порога approve: "можно мерджить" (`APPROVALS_REQUIRED_FOR_MERGE`).
- Ежедневное напоминание по открытым ревью в настроенное время.
- Техническая проверка сервиса: `GET /health`
Время в боте (напоминания и проверка `away`) используется по МСК (UTC+3).
## Запуск
```bash
python -m venv .venv
. .venv/Scripts/activate
pip install -r requirements.txt
python -m 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`
- `AUTO_ASSIGN_REVIEWERS_COUNT` - необязательно, по умолчанию `2` (сколько ревьюеров назначать автоматически)
- `APPROVALS_REQUIRED_FOR_MERGE` - необязательно, по умолчанию `2` (порог approve для сообщения "можно мерджить")
- `NOTIFY_ON_WEEKENDS` - необязательно, по умолчанию `true`; если `false`, бот не отправляет ЛС в субботу и воскресенье (МСК)
- `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 задайте общий secret и включите события:
- `pull_request`
- `issue_comment`
- `pull_request_review`
## Локальная разработка через Tuna
Если бот запущен локально, Gitea/Telegram не смогут достучаться до `localhost` без туннеля.
1. Запустите бота:
```bash
python -m 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`, `Issue Comment`, `Pull Request Review`
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
```