2026-03-05 18:40:42 +03:00
2026-03-01 19:39:08 +03:00
2026-03-01 19:39:08 +03:00
2026-03-05 18:40:42 +03:00
2026-03-05 16:43:54 +03:00
2026-02-19 11:37:53 +04:00
E2E
2026-02-28 20:07:50 +03:00

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-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 (сколько ревьюеров назначать автоматически)
  • 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_request
  • issue_comment
  • pull_request_review

Локальная разработка через Tuna

Если бот запущен локально, Gitea/Telegram не смогут достучаться до localhost без туннеля.

  1. Запустите бота:
python -m uvicorn main:app --host 0.0.0.0 --port 8080 --reload --env-file .env
  1. Поднимите туннель в Tuna(https://my.tuna.am/) на локальный порт 8080 и получите публичный URL, например:
https://example.ru.tuna.am
  1. Проверьте доступность сервиса:
https://example.ru.tuna.am/health
  1. Настройте 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
  1. Настройте webhook в Telegram:
https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/setWebhook?url=https://example.ru.tuna.am/telegram/webhook&secret_token=<TELEGRAM_WEBHOOK_SECRET>
  1. Проверьте, что webhook установлен:
https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/getWebhookInfo
Description
No description provided
Readme 292 KiB
Languages
Python 99.5%
Dockerfile 0.5%