О чем статья
Рассказываем о нашем GitHub-боте для автоматического мониторинга репозиториев. Рассмотрим архитектуру решения, объясним, как его настроить, и разберем несколько кейсов.
Любой разработчик знает, как важно вовремя узнавать об изменениях в репозиториях. Чтобы облегчить жизнь сообществу, мы решили автоматизировать этот процесс и создали GitHub-бота в Telegram. Инструмент экономит время и предоставляет всю важную информацию прямо в мессенджере.
Чем полезен наш бот
- Удобство и оперативность
Благодаря механизму отправки уведомлений в реальном времени участники сразу получают актуальную информацию о событиях в репозиториях, будь то новый pull request (PR), изменения в кодовой базе или важный комментарий. Это значительно упрощает процессы мониторинга, внесения правок и устранения багов, разработчики могут быстро реагировать на изменения и следить за жизненным циклом проекта.
- Простота настройки
Мы постарались сделать бот максимально гибким и адаптивным, чтобы любой разработчик мог без проблем настроить его под свои потребности. В процессе настройки можно выбрать, какие именно события из репозитория будут отслеживаться: от создания issue до закрытия PR. Как результат, наш бот подходит и для небольших команд, и для крупных open-source-проектов. Кроме того, он легко интегрируется с существующими workflow и не требует значительно менять уже настроенные процессы.
- Вовлечение сообщества
Одно из основных преимуществ нашего бота — возможность интеграции в групповые чаты. Благодаря этому разработчики и участники проекта не только видят уведомления об изменениях, но и могут сразу их обсудить. Это способствует коллективному решению задач и обмену мнениями. Таким образом, наш бот служит не только инструментом информирования, но и платформой для совместной работы.
Архитектура решения
Мы начали с выбора инструментов: для получения событий решили использовать GitHub Webhooks, для их обработки — Yandex Cloud Function, а для отправки уведомлений в чат сообщества — Telegram-бота. Эта архитектура обеспечила нам необходимую гибкость и простоту интеграции.

Пройдемся по этапам разработки и компонентам, на которых базируется наше решение.
Мы настроили в наших репозиториях GitHub вебхуки, которые отправляют события в Yandex Cloud. Это позволило получать информацию о ключевых событиях: создании issue, появлении комментариев, отправке PR и др.
Вебхук (webhook) — это способ, с помощью которого одна система может уведомлять другую о событиях, происходящих внутри нее. Вебхуки обеспечивают автоматизацию и интеграцию с внешними сервисами без необходимости постоянного вызова API.

Далее мы создали серверную функцию, которая принимает и обрабатывает данные из вебхуков, формирует сообщения и отправляет их в Telegram. Этот компонент обеспечивает гибкость и масштабируемость нашего решения.
Сервис Yandex Cloud Function позволяет запускать код в ответ на разные события без необходимости управления серверами и инфраструктурой. Отметим, что бесплатный план покрывает все наши потребности даже при большой нагрузке на репозитории.
В качестве альтернативных решений можно использовать и другие облачные платформы с аналогичным функционалом. Например, AWS Lambda от Amazon имеет схожий набор функций и предоставляет бесплатный план для малых нагрузок. Сервис автоматически масштабируется и поддерживает интеграцию с вебхуками и внешними API, что делает его хорошим вариантом для обработки событий из GitHub.

Для создания и настройки бота мы использовали BotFather, а для получения и отправки уведомлений интегрировали его с Yandex Cloud Function. Этот финальная точка в цепочке, обеспечивающая отправку информации в чат.

Запуск и первые результаты
После добавления в нашу группу бот успешно отправил первое сообщение с issue (см. рис. 5).

На данный момент бот работает для репозитория VSCode XP и уведомляет о следующих событиях:
- создание issue;
- комментарии к issue;
- создание discussion;
- комментарии к discussion;
- создание и слияние PR;
- комментарии к PR.
Также отмечу, что наш бот стал незаменимым помощником во время двухнедельного спринта Open Security Week 2, посвященного выявлению атак на macOS. Благодаря оперативной отправке уведомлений участники были в курсе всех изменений, быстро реагировали на новые PR и комментарии к задачам. Всего за время спринта бот отправил 140 сообщений (см. рис. 6.1, 6.2).


Как настроить бота
Настройка в Yandex Cloud
- В консоли управления переходим в каталог, в котором хотим создать функцию, указываем название, описание и метки (см. рис. 7).

- В редакторе выбираем среду выполнения. В нашем случае — Python (см. рис. 8).

- Воспользуемся одним из форматов загрузки кода. Для примера возьмем ZIP-архив, а в переменные окружения можем записать токен бота и секрет для вебхука (см. рис. 9).

Указываем точку входа — путь к функции, которая будет вызываться в качестве обработчика (см. рис. 10).

- Получаем ссылку для вызова функции и можем просмотреть основную информацию о ней (см. рис. 11).

- Теперь переходим на GitHub, добавляем новый вебхук и прописываем ссылку для вызова функции (см. рис. 12).

- Вебхук настроен. Теперь попробуем написать тестовый issue и комментарий к нему (см. рис. 13).

В Telegram сразу начинают приходить уведомления с дефолтным шаблоном (см. рис. 14).

Локальная настройка
Локальная настройка бота позволяет протестировать и адаптировать проект под свои нужды. Она обеспечивает гибкость и удобство отладки, дает возможность менять шаблоны уведомлений, экспериментировать с функциональностью и мгновенно видеть результаты. Это полезно, если вы хотите протестировать проект перед внедрением в рабочую среду или облачную инфраструктуру.
- Для начала создаем тестовый репозиторий в GitHub, бота в Telegram и группу с топиком для отправки сообщений.

- Далее клонируем репозиторий и указываем в переменных окружения токен бота, название репозитория после GITHUB_SECRET_ и секрет для вебхука (см. рис. 16).

- У нас уже есть дефолтный набор с шаблонами под некоторые события. Теперь давайте создадим свой custom_set и сделаем уникальные шаблоны для issues (см. рис. 17) и issue_comment (см. рис. 18).


- Теперь добавим созданную группу, топик и название нашего набора шаблонов в main_local.py (см. рис. 19).

- Запускаем файл и видим следующее (см. рис. 20).

- Теперь необходимо через localtunnel сделать доступным наш адрес (см. рис. 21).

- Далее настраиваем вебхук в тестовом репозитории, указав полученный URL с путем /webhook и созданный в окружении секрет (см. рис. 22).

- Создаем issue и пишем к нему комментарий (см. рис. 23).

Как видим, наш issue и комментарий к нему сразу летят в чат (см. рис. 24).

Вы легко можете поэкспериментировать и развернуть проект локально или в облаке: подробные инструкции расписаны в репозитории.
Перспективы
В обозримом будущем мы планируем внедрить следующие улучшения:
- Интерактивные команды. Позволят запрашивать определенную информацию напрямую у бота (например, подписки на конкретные события из репозитория).
- Правки от сообщества. Корректировка вывода сообщений с событиями, визуальные изменения, добавление ссылок, тегов к сообщениям и т. д.
- Интеграция с другими сервисами. Мы рассматриваем возможность интеграции бота с другими инструментами и платформами, где будет развиваться наше сообщество.
- Фильтрация уведомлений. Внедрение системы приоритизации событий, которая позволит получать только самые важные уведомления — о срочных багах, успешных релизах или критически важных комментариях.
Присоединяйтесь к Security Experts Community!