Cегодня я хотел бы поделиться своим опытом синхронизации уведомлений Continuous Integration серверов (Bamboo, Jenkins, TeamCity и тп.) с бесплатным мессенджером от Павла Дурова — Telegram.

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

Для организации данной синхронизации мы будем использовать BOT API от телеграмма, Gmail API от Google, а также наш ubuntu сервер на Digital Ocean.

Для начала нам нужно создать нового бота в телеграмм. Для этого я рекомендую воспользоваться пунктом 1 из вот этой статьи: habrahabr.ru/post/262247. После регистрации мы получаем данные доступа к нашему боту вида: 112714817:AAEwZWoZ6X1Go76gt3_hUz9717ihNboXrnw

Обязательно запоминаем эти данные — они нам ещё пригодятся!



Далее, нам нужно создать новый чат, в который и будет отсылать уведомления наш бот. Создаем и не забываем пригласить в него бота и ваших коллег. Теперь нам обязательно нужно узнать ID этого чата, для чего посылаем в чат любое тестовое сообщение, а затем в браузере или сurl (что кому удобнее) вбиваем:
https://api.telegram.org/bot<TOKEN>/getUpdates



Из ответа сервера мы узнаем, что ID нашего чата — «-35576913» (учтите, что «-» — это часть ID, терять его нельзя). Теперь проверяем, что все работает правильно. Для этого пытаемся отправить с нашего бота тестовое сообщение:
https://api.telegram.org/bot<TOKEN>/sendMessage?chat_id=-35576913&text=Test_Message



Отлично: мы получили наше тестовое сообщение, а значит все работает как надо! Теперь плавно переходим к Gmail API. Для начала нам нужно создать новый проект в console.developers.google.com. После чего выдаем нашему проекту доступ к Gmail API. А затем нам необходимо получить JSON с креденшелами нашего нового проекта:





Отлично, почти все готово! Теперь я предлагаю воспользоваться моим скриптом на python. Взять его можно здесь: github.com/egorvas/ci_to_telegram/blob/master/ci_to_telegram.py

Также необходимо будет поставить два сторонних python модуля:
pip install google-api-python-client
pip install requests

Вам нужно положить файлик с client_secret.json в ту же папку, что и скрипт, и запустить выполнение, после чего откроется браузер и предложит вам разрешить доступ к gmail почте.



Я для нашего проекта создал новый gmail аккаунт, к которому и привязал уведомления с bamboo, но вы можете использовать уже созданный. Как душа пожелает!

Не забываем проверить, что уведомления с CI приходят на эту почту. Теперь в папке со скриптом, помимо client_secret.json, должна лежать папка credentials. Если все так, значит вы сделали верно.



Теперь нам нужно немного видоизменить скрипт, для этого меняем переменные TELEGRAM_BOT_CREDENTIALS и CHAT_ID на те, что мы узнали выше. Теперь пробуем выполнить скрипт, и, если все правильно, то в чат с вашим ботом должны упасть все непрочитанные письма.

В двух словах о том, что делает скрипт. Сначала он находит все непрочитанные письма в вашем почтовом ящике, затем он отправляет текст от них к вам в телеграмм, а далее — делает эти письма прочитанными.

Остался самый последний шаг: нам нужно организовать повторяющийся запуск этого скрипта. Я использовал cron на нашем ubuntu сервере. Грузим нашу папку со скриптами по ssh на сервер и настраиваем cron:

Для начала устанавливаем cron:
sudo apt-get update
sudo apt-get install cron

Затем запускаем редактор настроек cron:
crontab -e

Добавляем повторение нашего скрипта через каждую минуту:
* * * * python /usr/share/telegram/ci_to_telegram.py>

Проверяем, что все сохранилось корректно:
crontab -l

Теперь наш скрипт запускается каждую минут. Если новых писем на почте нет, то он ничего не делает. А в ином случае — отправляет текст письма к вам в телеграмм и делает письмо прочитанным.

На этом все. Спасибо за внимание. Если будут вопросы — пишите, с радостью отвечу.

Комментарии (6)


  1. BupycNet
    18.08.2015 17:34

    К слову советую вам попробовать мой сервис для этих целей. И в телеграм можно принимать уведомления и на комп в дополнение и на телефон даже без телеграма. И не нужно пилить своего отдельного бота + на другие каналы подписаться можно.

    Для команды тоже есть интересные решения — можно их в разные каналы разбить и с разных сервисов на разные каналы пушить + еще в общие чаты телеграм зеркалировать, есть такая функция.

    PS. PushAll


    1. egorvas
      18.08.2015 18:02

      Да, решение безусловно интересное и возможно я обратил бы на него внимание, если бы увидел раньше.
      Но основная проблема у меня была именно в парсинге e-mail, и ваша софтина не помогла бы мне её решить.
      У бота jaconda есть похожая функциональность, там к каждому каналу создается уникальный e-mail адрес и на него можно слать почту.
      Увы jaconda очень тормозит и письма приходили с задержкой больше дня, что очевидно очень плохо.
      Советую вам подумать над реализацией данной функциональности.


      1. BupycNet
        18.08.2015 18:17

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

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

        Я к слову при создании сразу задам там уже изначальные фильтры для соц сетей и т.д. Можно будет через одно приложение принимать уведомления от всех сайтов и соц сетей используя почтовый шлюз.


  1. xakpc
    19.08.2015 01:37

    т.е. вы создали email куда складываются письма из CI, потом этот ящик разбирается и сообщения кидаются в Telegram?

    у нас в Leecero.Notifis есть решение, когда на специальный адрес отправляется письмо с заголовком = токену бота, любым телом и оно сразу отправляется в Telegram, всем кто на него подписан.


    1. egorvas
      19.08.2015 09:37

      Если на пальцах то да.
      Но преимущество моего решения — кастомизации.
      Например уведомления с бамбу приходят не в самом красивом виде и для своего проекта я их паршу, добавляют какие коммиты вошли в билд и уже потом отправляю в красивом виде.


      1. xakpc
        19.08.2015 10:36

        а кастомизация никуда не пропадет. обратите внимание на mailgun (мы именно его используем). он умеет парсить email и кидает его как json body в post запрос. а тут уже можно парсить как угодно и отправлять по списку пользователей. конечно есть и сложности — например нужен свой домен (для почты). хотя может можно и с публичными, я не пробовал.