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).
Запуск
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-TokenGITEA_BASE_URL- обязательно для назначения ревьюера, напримерhttps://git.example.comGITEA_TOKEN- обязательно для назначения/метокGITEA_WEBHOOK_SECRET- обязательно, общий секрет webhook от GiteaREMINDER_TIME- необязательно, по умолчанию09:00AUTO_ASSIGNED_LABEL- необязательно, по умолчаниюauto-assignedAUTO_ASSIGN_REVIEWERS_COUNT- необязательно, по умолчанию2(сколько ревьюеров назначать автоматически)AUTO_ASSIGN_EXCLUDED_AUTHORS- необязательно, CSV логинов Gitea; для этих авторов автоназначение и auto-label наPR openedне выполняются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_requestissue_commentpull_request_review
Локальная разработка через Tuna
Если бот запущен локально, Gitea/Telegram не смогут достучаться до localhost без туннеля.
- Запустите бота:
python -m uvicorn main:app --host 0.0.0.0 --port 8080 --reload --env-file .env
- Поднимите туннель в Tuna(https://my.tuna.am/) на локальный порт
8080и получите публичный URL, например:
https://example.ru.tuna.am
- Проверьте доступность сервиса:
https://example.ru.tuna.am/health
- Настройте 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
- Настройте webhook в Telegram:
https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/setWebhook?url=https://example.ru.tuna.am/telegram/webhook&secret_token=<TELEGRAM_WEBHOOK_SECRET>
- Проверьте, что webhook установлен:
https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getWebhookInfo
Description
Languages
Python
99.5%
Dockerfile
0.5%