Как мы делали уведомление о коммитах

Предыстория…

Не знаю как у других, но мне с другом очень нравится видеть всю активность друг друга, логи и статистику своих проектов. Обычно для этого используем телеграм чат с топиками.

Но вот незадача, часть репозиториев на гитхабе приватны, а видеть прогресс в любое время хочется… Почему то, что репозитории приватны — проблема? Потому что в телеграме давно есть бот, который уведомляет о различных ивентах в репозиториях:

80ad1f1941a4743b9afc0defafd510d4.png

Но он отказывается работать с приватными репозиториями, т.к. токен создаваемый им не запрашивает на это разрешение.

Тогда было придумано 2 варианта решения проблемы (спойлер, оба в итоге провальны):

  1. Создать через Github Actions уведомление

  2. Создать скрипт, который будет проверять последний коммит раз в время

Первый вариант сразу был отброшен, а второй побежал реализовать мой друг.

Он реализовал это очень быстро используя REST API Github, но упёрся в ограничение по запросам в час:

~ 83 запроса в минуту, или чуть больше одного запроса в секунду.

~ 83 запроса в минуту, или чуть больше одного запроса в секунду.

Для одного репозитория хватило бы легко, но у нас 3 репозитория, которые активно изменяются. Тогда я нашёл человека, у которого был свой бот для уведомлений, и узнал что всё донельзя просто, и надо было… надо было просто прочитать документацию.

Кто-то читает документации?

вот этот добрый человек, подсказавший мне о вебхуках

вот этот добрый человек, подсказавший мне о вебхуках

https://docs.github.com/en/webhooks

И следующим моим шагом было создание наброска кода, который повесит на репозиторий вебхук и поднимет API, ожидающий запрос от гитхаба:

https://gist.github.com/vsecoder/8b8a6e5eed301b81ff1cb79df71e00f1

Код всего 82 строчки, и состоит из аунтефикации, создания вебхука, и запуска API.

from github import Auth, Github

auth = Auth.Token(GH_TOKEN)
g = Github(auth=auth)
repo = g.get_repo("vsecoder/fun") # приватный репозиторий
repo.create_hook("web", config, EVENTS, active=True)

Код был взят из примера документации к модулю PyGithub, отлично решал нашу задачу, но меня уже было не остановить, захотелось большего, а точнее open source бота, что бы он мог конкурировать с ботом, речь о котором шла выше.

Создать самого бота было не тяжело, но возникло 2 проблемы:

  1. Сложно тестировать, я повторил ошибку с тем, что не прочитал документацию, в которой был указан сайт https://smee.io/ для удобного тестирования веб перехватчиков

  2. Пришлось для каждого ивента писать своё сообщение (заняло наибольший промежуток времени)

По итогу вышел достаточно рабочий бот:

667748debf4b8c9ee141d6495782a287.png51aca194bca7e2ec4334476d8cc17aa2.png7c0ea991c6f093ba7de2df725f7e2e56.png

https://github.com/vsecoder/github-notifi-bot

Но бот однозначно нуждается в огромном количестве доработок, от создания сообщений с другими ивентами (forks, pull requests и др.), оптимизации кода и банальной проверки на подлинность запроса от гитхаба.

Буду очень рад предложениям по улучшению, знаю что код мягко говоря плохой, но писался на чистом энузиазме.

© Habrahabr.ru