Предыстория и суть проекта
На работе разработчики сталкиваются с такой штукой, как хостинг VCS. Очень важно своевременно получать уведомления о том, что вы ответственный за ревью Merge Request, или что в вашем MR конфликт. Также важно оперативно замечать комментарии от ревьюверов.
В таких системах как GitLab, BitBucket, GitHub уведомления реализуются чаще всего через email. Что на мой взгляд не удобно, и только создает помойку в рабочей почте, из-за чего можно пропустить важные письма.
В итоге появилась идея написать приложение, которое будет отправлять уведомления о важных событиях из GitLab в телеграм. Что я и сделал, а теперь хочу поделиться своим франкенштейном с вами, возможно для кого-то он тоже окажется полезным. Подобных проектов мной на просторах интернета найдено не было, так что если я пилю велосипед, сообщите мне :)
Возможности
Коротко опишу имеющиеся на данный момент возможности. Они актуальны как для облачной версии GitLab, так и для self-host инстанса.
Уведомление о новых MegeRequest
Когда кто-то создает MR и назначает вас ответственным, то вам приходит уведомление. Из этого уведомления можно узнать название, короткое описание, теги, из какой ветки в какую открыт MR, и кто его автор.
Уведомление о конфликте в вашем MergeRequests
Если в вашем MR возник конфликт, то вы будете своевременно оповещены. В этом уведомлении указывается название MR, проект и ветка.
Уведомление об обновлении MergeRequests
Когда кто-то делает коммиты в MR, в котором вы ответственный, вам сразу же приходит уведомление. Вы также сразу можете увидеть сколько задач еще не решено, и сколько конкретно ваших задач не было решено.
Уведомление об изменении статуса вашего MR
Когда статус вашего MR меняется, вы получаете уведомление.
Уведомление о новых задачах в ваших MR
В GitLab можно создавать не просто комментарии, а обсуждения (Discussions). Если кто-то создаст такое обсуждение в вашем MR, то вы сразу об этом узнаете.
Уведомление при упоминаниях в комментариях
Допустим, кто-то упомянул вас в MR, нужен ваш совет. Автор этого MR не вы, ответственным назначали тоже не вас. Даже в этом случае вам придет уведомление, так вы не пропустите сообщения с вашим упоминанием.
Уведомления при ответах в дискуссии, в которой вы писали
Важно оставаться в теме обсуждения, поэтому при появлении новых комментариев в обсуждении, в котором вы участвовали, вы получите уведомление.
Оно будет содержать начальное сообщение обсуждения, ваше последнее сообщение в нем, а также два последних комментария. Таким образом вы будете понимать о чем идет речь.
Отвечайте в обсуждении прямо из Telegram
И киллер-фича. Допустим вас упомянули в обсуждении, знаете что ответить? Не тратьте время, отвечайте прямо из телеграм. Для этого просто ответьте на сообщение и напишите ваш комментарий. Да да, спер идею из бота вастрика.
Подробности разработки
Писал на Java, так как ее знаю, и цель была написать быстро рабочий прототип, чтобы начать пользоваться им. Недавно обновил все зависимости до актуальных, так как проект был долгое время в архиве, и перевел его на Java 17. Для удобства завернул все в Docker.
Бот простой, как доска. Раз в минуту долбится в API GitLab, выгружает в БД информацию о проектах, и прочем. Выгрузка нужна, чтобы знать какие сущности новые, а какие нет. Также она нужна, чтобы не ходить в GitLab каждый раз, когда вы хотите получить все MR, за которые вы ответственны прямо из бота.
Так как все хостинги VCS оперируют с одинаковыми сущностями, но все же каждый имеет какой то свой формат, было принято решение преобразовывать сущности GitLaba в свою доменную модель. Таким образом, на основе этого проекта можно легко добавить поддержку другого хостинга, достаточно написать конвертер его объектов в доменные сущности приложения.
Можно при желании также сделать уведомлятор в другие месенджеры. Это тоже вынесено в абстракции, нужно только реализовать отправление текстовой строки в конкретный месенджер.
С какими самыми неожиданными трудностями пришлось столкнуться?
Этот бот логическое продолжение моего предыдущего бота для BitBucket. И вот там были сложности, с GitLab все было отлично.
А вот API битбакета, это самый ужасный API, с которыми мне доводилось работать. У них не было пойнта, по которому можно было бы получить все комментарии. Или хотя бы комментарии для конкретного MR.
Все комментарии имели сквозной id, при этом были завязаны на свой MR, то есть URL был вида:
/api/mr/12/comment/45
Чтобы узнать о появлении новго комментария, приходилось брать последний известный идентификатор комментария и проходить по существующим MR, подставляя следующий предпологаемый id комментария.
Например, во так:
/api/mr/12/comment/46
/api/mr/13/comment/46
/api/mr/14/comment/46
Если по одному из урлов приходил ответ, значит комментарий найден, если ответа не было, значит либо комментариев новых нет, либо кто-то удалил комментарий, поэтому поиск работал, пока ответ не поступал для 50 идентификаторов.
Еще странно было реализовано обновление конфликтов. То есть если случился конфликт, то он не появлялся в JSON ответе сущности, нужно было зайти в PR из браузера, и только тогда API начинал возвращать флаг конфликта.
В GitLab таких проблем нет, у них в целом отличный API.
Какие планы на будущее?
Еще до того, как Apple выкатила свои "сводки уведомлений" и режимы фокусировки, у меня была идея сделать подобный функционал для бота. Чтобы можно было получать уведомления не моментально, а раз в час допустим, и вам приходила бы короткая сводка. Вот это в планах.
Также гитлаб разрешил на бесплатном тарифе добавлять ревьюверов, так что в плане реализовать поддержку уведомлений и для этой категории.
Также планирую добавить поддержку уведомлений по Issue, мы на проектах пользуемся Jira, но мне не сложно :)
Выводы
Надеюсь этот бот будет таким же помощником для вас, каким он является для меня. Если будут идеи по функционалу, или найдете ошибки, заводите issue/discussion в GitHub
Я не очень понял, для каждого разработчика нужно свой инстанс бота делать или можно к одному боту всех разработчиков подключить?
Может ли бот писать в общий канал?
Я себе представляю юзерфлоу таким образом:
Но я не увидел в описании как связать свою телегу с аккаунтом в гитлабе, от чего делаю вывод что для каждого разработчика нужен отдельный инстанс.
Есть ли в планах сделать возможность использовать бота в команде?
Так а бот, бот-то где? :D
Но есть же @gitlab_bot которого не надо запускать даже)