Уведомления о событиях Bitbucket в Telegram

Этот проект позволит вам легко интегрировать уведомления от вашего Bitbucket Server в Telegram.

· 4 мин.

Архивный проект

Bitbucket Server больше не доступен для установки self-host. Поэтому поддерживать этот проект нет смысла.

🦊 Я перешел с Bitbucket на GitLab и написал бота для уведомлений из GitLab.

Уведомления из GitLab в Telegram
У меня острая неприязнь email уведомлений. Если сообщений много, то проще получать уведомления в Telegram. Поэтому я для себя написал бота, который сообщает об основных событиях в GitLab.

Суть проекта

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

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

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

Возможности

Если есть проблема, то нужно ее решать. Так появилась идея написать “очередного полезного” бота, который будет сообщать о новых 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 есть три поля, два из которых это количество комментариев и открытые задачи, а третье это совсем другая история :) Именно по этим полям проверяется факт появления новых комментариев-задач, после чего вам отправляется уведомление.

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

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

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

Скачиваем 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 — пароль от БД