Проект: Уведомления от Bitbucket в Telegram  Публичный пост
16 ноября 2020  1049
Уведомления от Bitbucket в Telegram

Суть проекта

Когда я только устроился на первую работу разработчиком Java, сразу же возникла проблема уведомлений о событиях в Bitbucket. Направление Java разработки было новым для моей компании (я был вторым программистом), поэтому среду для разработки пришлось настраивать мне. После установки и настройки Bitbucket Server приходилось шариться по Pull Request-ам в поисках новых комментариев, на которые нужно ответить, да и узнавать о новых Pull Reqest-ах было проблематично. Да, кто-то скажет, что есть email уведомления, но камон, у нас же эпоха Telegram.

disclaimer: проект был написан для личных нужд и еще разрабатывается, но вроде все стабильно, но это не точно, так что возможны баги и "неочевидное поведение", буду рад получить обратную связь в issues.

Абсолютно весь код open source, все библиотеки, которые я использую в проекте тоже open source. Весь проект вы сможете собрать самостоятельно при желании. В частности, я использую свои проекты, которые позволяют быстро создавать ботов для ВК и Telegram, когда-нибудь и об этих либах напишу статью, если будет интерес и время :) Так же все необходимые артефакты загружены в Maven Central.

Возможности

Если есть проблема, то нужно ее решать. Так появилась идея написать "очередного полезного" бота, который будет сообщать о новых Pull Request-ax (дальше PR). Но на этом эго функционал не ограничивается. В итоге локальная версия обладает следующим функционалом:

  • Уведомление о новых PR, в которых вас назначили ревьювером

  • Уведомление о конфликте в вашем PR

  • Уведомление об обновлении PR, в котором вы ревьювер (новые коммиты)

  • Уведомление об изменении статуса вашего PR (MERGE, DECLINE, DELETE)

  • Уведомление об изменениях решений ревьюверов, а так же добавлении или удалении ревьюверов


  • Уведомление о новых задачах в ваших PR

  • Уведомление о новых комментариях в ваших PR

  • Напоминания о просмотре PR. Это попытка создать умную систему уведомлений, которая будет ненавязчиво напоминать о том, что PR давно не просматривался. Например если прошло 2 часа, а вы так и не приняли решение, или если прошло уже 4 часа и кто-то вынес свое решение, а вы еще нет. Механизм еще будет дорабатываться.

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

Вторая версия, о которой пойдет речь - локальная, которая запускается у вас на ПК и использует только ваш токен доступа, так как не у всех имеется возможность получить токен администратора. Так же в будущем планирую сделать версию для Bitbucket Cloud и возможно для Gitlab.

К сожалению, пока функционал локальной версии меньше, чем у серверной. Вот что пока не реализовано:

  • Уведомление о том, что ваша задача в чужом PR закрыта
  • Уведомление, если ваш логин упомянули в комментарии
  • Уведомление об ответах на ваши комментарии в любом PR

Так же серверная версия обладает настройками уведомлений о сборках в Teamcity!

Особенности реализации

Основной репозиторий тут.

На самом деле в реализации ничего сверхестественного нет. Каждую минуту происходит опрос API с синхронизацией данных в БД, если находятся новые PR или другие события, то отправляется уведомление в Telegram. Хотя есть одна особенность именно у API Bitbucket.

C комментариями в API дела обстоят не очень, ну либо я не разобрался и найдется добрый человек, который раскурит их API и сделает по-человечески. Пришлось немного наколхозить в серверной версии, чтобы была возможность находить комментарии и задачи. И для этого нужен токен администратора Bitbucket.

Так же стоит отметить, что сущность комментария и задачи это одно и то же. В API они отличаются только флагами, так вот решили разработчики Bitbucket Server. И на данный момент нет возможности просто взять и получить все комментарии или задачи.

Приходится брать id последнего известного комментария-задачи, добавлять ему единицу, после чего проходить по всем PR, чтобы узнать не появился ли в PR такой комментарий. И для этого необходим токен администратора Bitbucket, так как приходится проходить по всем репозиториям, по всем PR, а у простого пользователя может не быть доступа ко всем репозиториям и тогда весь механизм перестает работать.

Именно из-за этого в локальной версии бота все сделано немного по другому. У PR есть три поля, два из которых это количество комментариев и открытые задачи, а третье это совсем другая история :) Именно по этим полям проверяется факт появления новых комментариев-задач, после чего вам отправляется уведомление.

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

Запускаем проект

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

  1. Скачиваем docker образ
docker pull upagge/bitbucket-bot-local:latest
  1. Создаем бота в Telegram, который будет посылать вам уведомления. Делается это тут
  2. После создания вы получите токен, сохраните его. Пример: 34534050345:FlfrleflerferfRE-ergerFLREF9ERF-NGjM
  3. Теперь необходимо получить персональный токен в вашем bitbucket. В правом верхнем углу нажмите на иконку своего аккаунта, далее Manage Account --> Personal access tokens --> Create a token. Достаточно токена на чтение. Сохраните его
  4. Создаем БД, в которой будут храниться PR и ревьюверы к ним.
  5. Можно приступать к запуску
docker run --name bitbucketbot -d --env TELEGRAM_BOT_TOKEN=value --env TELEGRAM_BOT_USERNAME=value --env BITBUCKET_TOKEN=value --env TELEGRAM_ID=value --env BITBUCKET_URL=value --env BITBUCKET_LOGIN=value --env DATASOURCE_URL=value --env DATASOURCE_USERNAME=value --env DATASOURCE_PASSWORD=value --network="host" upagge/bitbucket-bot-local:latest

Вместо value подставляем свои значения. Очень важно не ошибиться, а то ничего не стартанет :)

Ниже приведена расшифровка для каждого параметра:

  • TELEGRAM_BOT_TOKEN — токен, который вы получили при создание бота.
  • TELEGRAM_BOT_USERNAME — название, которое вы дали боту. Пример my_bitbucket_bot
  • BITBUCKET_TOKEN — токен, который вы получили в Bitbucket
  • TELEGRAM_ID — ваш id в telegram, можно узнать у этого бота
  • BITBUCKET_URL — url на ваш bitbucket строго в таком формате http://localhost:7990
  • BITBUCKET_LOGIN — ваш логин в bitbucket, например mylogin
  • DATASOURCE_URL — ссылка на базу данных Postgres, в следующем формате: jdbc:postgresql://localhost:5432/bitbucket_bot_local
  • DATASOURCE_USERNAME — пользователь БД
  • DATASOURCE_PASSWORD — пароль от БД
Связанные посты
14 комментариев 👇

Я для своей команды написал похожую оповещалку, только для Слака (а теперь для Маттермоста).
Что она умеет:

  • шлет в общий канал оповещения об открытии/закрытии/удалении/мерджа пул реквеста
  • напоминает перед дейликом об открытых пул реквестах.
  • шлет новые параметры сэндбокса (адреса виртуалок, названия схем и т.д.)
  Развернуть 1 комментарий

Есть классная либа на питоне https://pypi.org/project/atlassian-python-api/ там с коментами в ПРах вроде всё в порядке.
Не посмотрел, что на джаве проект, кек. Есть ещё вот такая история, но я не тыкал: https://github.com/samiyev/bitbucket-telegram-bot

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

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

Было бы здорово добавить в https://github.com/Godfather-Bots/telegram-bot readme.

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

@IvanRusanov, мне сказал знакомый, что у гитлаба есть встроенная из коробки нотификация в телегу))

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

@uPagge, OMG! Спасибо, посмотрю. Возможно только что родился и умер мой пет проджект

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

@uPagge, а можно скриншот где эта интеграция настраивается?

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

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

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

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

Тоже думал свою интеграцию пилить.

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

@wCtlHRqamCtz2nJf, кажется не совсем из коробки, обманули меня, а я вас :D но я так понимаю там не шибко сложно, намного проще чем с битбакетом

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

@gitlab_bot в телеге умеет

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

@IvanRusanov, Добавлю скоро, никак руки не дойдут

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

@IvanRusanov, хех, появилась версия для GitLab

https://struchkov.dev/blog/gitlab-telegram-bot/

  Развернуть 1 комментарий
Иван Лопатин Перекладываю монады 17 ноября 2020

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

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

@johnspade, Спасибо за оценку))

Вообще эта проблема наблюдается и в маленькой команде из 10 человек, так что думаю в будущем запилить функцию отчетов.

То есть можно будет отписаться от каких-то сообщений, например от обычных комментариев, а для подписаных сделать примерно так: МОжно будет настроить интервал присылаемых сообщений, например раз в час, и раз в час будет прилетать сообщение с отчетом, такие то пр новы, в таких-то пр у вас новые таски и так далее

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

😎

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

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


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