Search
Write a publication
Pull to refresh

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

Level of difficultyEasy
Reading time2 min
Views4.5K

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

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

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

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

Тогда было придумано 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. Пришлось для каждого ивента писать своё сообщение (заняло наибольший промежуток времени)

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

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

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

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

Only registered users can participate in poll. Log in, please.
Был ли интересен пост?
35.14% Да13
64.86% Нет24
37 users voted. 5 users abstained.
Tags:
Hubs:
Total votes 8: ↑3 and ↓50
Comments6

Articles