Проект: Уведомления от GitLab в Telegram  Публичный пост
2 февраля 2022  893
Уведомления от GitLab в Telegram
https://struchkov.dev/blog/gitlab-telegram-bot/?utm_source=vas3k&utm_medium=articl&utm_campaign=gitlab_notify

Предыстория и суть проекта

На работе разработчики сталкиваются с такой штукой, как хостинг 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

9 комментариев 👇

Я не очень понял, для каждого разработчика нужно свой инстанс бота делать или можно к одному боту всех разработчиков подключить?

Может ли бот писать в общий канал?

Я себе представляю юзерфлоу таким образом:

  1. Все разрабы подписываются на канал или заходят в чат
  2. Бот подключается в канал или чат с правами на публикацию
  3. При обнаружении нового МР бот кидает ссылку и метаинфу про МР
  4. Когда появляются комменты к МР он меншенит нужного разраба что появились комменты (меншенит или в чате или в ЛС)

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

Есть ли в планах сделать возможность использовать бота в команде?

  Развернуть 1 комментарий
Ivor Barhansky Сетевой инженер 2 февраля 2022

Так а бот, бот-то где? :D

  Развернуть 1 комментарий

@lopar, Бота нужно создать и запустить :)

Инструкция по ссылке в статье, а вот готовый докер образ, нужно только указать переменные и стартануть

https://hub.docker.com/r/upagge/gitlab-telegram-notify

  Развернуть 1 комментарий

@uPagge, я в том смысле, что возможно я слепой немного, но я по тексту глазами пробежал и ни одной ссылки ни на что не обнаружил. :)

  Развернуть 1 комментарий

@lopar, так тут в категории проекты ссылка это прямо title статьи, решил не дублировать :)

  Развернуть 1 комментарий

@uPagge, господи, сорян, заголовок такой естественный, что вообще не воспринимается как ссылка даже рядом.

Это камень в огород UI, значит.

  Развернуть 1 комментарий

Но есть же @gitlab_bot которого не надо запускать даже)

  Развернуть 1 комментарий

@Stanislawww, То есть вы готовы предоставить какому-то облачному боту в телеге свои данные? Ну ок :)

  Развернуть 1 комментарий

@uPagge, Его просто дергают webhook gitlab’a, не самая критичная информация

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб