105 lines
5.3 KiB
Markdown
105 lines
5.3 KiB
Markdown
# 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
|
||
```
|