Light mode

Создание GitHub-бота для сообщества

О чем статья

Рассказываем о нашем GitHub-боте для автоматического мониторинга репозиториев. Рассмотрим архитектуру решения, объясним, как его настроить, и разберем несколько кейсов.

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

Чем полезен наш бот

  • Удобство и оперативность

Благодаря механизму отправки уведомлений в реальном времени участники сразу получают актуальную информацию о событиях в репозиториях, будь то новый pull request (PR), изменения в кодовой базе или важный комментарий. Это значительно упрощает процессы мониторинга, внесения правок и устранения багов, разработчики могут быстро реагировать на изменения и следить за жизненным циклом проекта.

  • Простота настройки

Мы постарались сделать бот максимально гибким и адаптивным, чтобы любой разработчик мог без проблем настроить его под свои потребности. В процессе настройки можно выбрать, какие именно события из репозитория будут отслеживаться: от создания issue до закрытия PR. Как результат, наш бот подходит и для небольших команд, и для крупных open-source-проектов. Кроме того, он легко интегрируется с существующими workflow и не требует значительно менять уже настроенные процессы.

  • Вовлечение сообщества

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

Архитектура решения

Мы начали с выбора инструментов: для получения событий решили использовать GitHub Webhooks, для их обработки — Yandex Cloud Function, а для отправки уведомлений в чат сообщества — Telegram-бота. Эта архитектура обеспечила нам необходимую гибкость и простоту интеграции.

Рисунок 1. Архитектура решения

Пройдемся по этапам разработки и компонентам, на которых базируется наше решение.

GitHub Webhooks 

Мы настроили в наших репозиториях GitHub вебхуки, которые отправляют события в Yandex Cloud. Это позволило получать информацию о ключевых событиях: создании issue, появлении комментариев, отправке PR и др.

Вебхук (webhook) — это способ, с помощью которого одна система может уведомлять другую о событиях, происходящих внутри нее. Вебхуки обеспечивают автоматизацию и интеграцию с внешними сервисами без необходимости постоянного вызова API.

Рисунок 2. Настройка GitHub Webhooks

Yandex Cloud Function

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

Сервис Yandex Cloud Function позволяет запускать код в ответ на разные события без необходимости управления серверами и инфраструктурой. Отметим, что бесплатный план покрывает все наши потребности даже при большой нагрузке на репозитории. 

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

Рисунок 3. Yandex Cloud Function

Telegram-бот

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

Рисунок 4. Настройка BotFather

Запуск и первые результаты

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

Рисунок 5. Первое сообщение от бота

На данный момент бот работает для репозитория VSCode XP и уведомляет о следующих событиях:

  • создание issue;
  • комментарии к issue;
  • создание discussion;
  • комментарии к discussion;
  • создание и слияние PR;
  • комментарии к PR.

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

Рисунок 6.1. Сообщение от бота
Рисунок 6.2. Сообщение от бота

Как настроить бота

Настройка в Yandex Cloud

  1. В консоли управления переходим в каталог, в котором хотим создать функцию, указываем название, описание и метки (см. рис. 7).
Рисунок 7. Создание функции в Yandex Cloud
  1. В редакторе выбираем среду выполнения. В нашем случае — Python (см. рис. 8).
Рисунок 8. Выбор среды выполнения
  1. Воспользуемся одним из форматов загрузки кода. Для примера возьмем ZIP-архив, а в переменные окружения можем записать токен бота и секрет для вебхука (см. рис. 9).
Рисунок 9. Установка параметров

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

Рисунок 10. Точка входа
  1. Получаем ссылку для вызова функции и можем просмотреть основную информацию о ней (см. рис. 11).
Рисунок 11. Информация о функции
  1. Теперь переходим на GitHub, добавляем новый вебхук и прописываем ссылку для вызова функции (см. рис. 12).
Рисунок 12. Настройка вебхука на GitHub
  1. Вебхук настроен. Теперь попробуем написать тестовый issue и комментарий к нему (см. рис. 13).
Рисунок 13. Тестовый issue

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

Рисунок 14. Уведомления в Telegram

Локальная настройка

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

  1. Для начала создаем тестовый репозиторий в GitHub, бота в Telegram и группу с топиком для отправки сообщений.
Рисунок 15. Создание тестового бота
  1. Далее клонируем репозиторий и указываем в переменных окружения токен бота, название репозитория после GITHUB_SECRET_ и секрет для вебхука (см. рис. 16).
Рисунок 16. Задаем переменные окружения
  1. У нас уже есть дефолтный набор с шаблонами под некоторые события. Теперь давайте создадим свой custom_set и сделаем уникальные шаблоны для issues (см. рис. 17) и issue_comment (см. рис. 18).
Рисунок 17. Шаблон для issues
Рисунок 18. Шаблон для issue_comment
  1. Теперь добавим созданную группу, топик и название нашего набора шаблонов в main_local.py (см. рис. 19).
Рисунок 19. Добавляем информацию в main_local.py
  1. Запускаем файл и видим следующее (см. рис. 20).
Рисунок 20. Запускаем Flask-приложение на локальном хосте в режиме отладки
  1. Теперь необходимо через localtunnel сделать доступным наш адрес (см. рис. 21).
Рисунок 21. Получаем URL
  1. Далее настраиваем вебхук в тестовом репозитории, указав полученный URL с путем /webhook и созданный в окружении секрет (см. рис. 22).
Рисунок 22. Настройка вебхука
  1. Создаем issue и пишем к нему комментарий (см. рис. 23).
Рисунок 23. Тестовый issue

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

Рисунок 24. Сообщения от бота в чате

Вы легко можете поэкспериментировать и развернуть проект локально или в облаке: подробные инструкции расписаны в репозитории.

Перспективы

В обозримом будущем мы планируем внедрить следующие улучшения:

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

Присоединяйтесь к Security Experts Community!

Мы дěлаем Positive Research → для ИБ-экспертов, бизнеса и всех, кто интересуется ✽ {кибербезопасностью}