Github action с нотификациями в Telegram

Недавно начал разбираться с Github action. Понял, что это мощный инструмент, который позволяет делать различные автоматизации. Добавить continious integration можно в один клик. Github предлагает готовые темплейты для maven, gradle и т.д. Мне захотелось немножко больше. Например, посылать нотификации в Telegram на каждый push или pull request. Я зашел в Github Marketplace засечил Telegram и, вуаля, Github предлагает нам action Telegram Notify. На первый взгляд выглядит довольно просто, но, когда дошло до дела, пришлось попотеть. Чтобы собрать все кусочки пазла, надо было разобраться как создавать ботов в Telegram.

Создаем бота в Telegram

  • Заходим в Telegram аппликейшн и начинаем общение с BotFather. Для этого просто в поиске находим BotFather и жмем start
  • В диалоге с BotFather набираем /newbot и отвечаем на вопросы бота: даем имя боту и уникальный username. Все, бот готов. BotFather покажет token для бота, который будет необходим для работы с ботом. Имеет смысл token сохранить, но его всегда можно заново спросить у BotFather

Создаем группу в Telegram

  • В Telegram аппликейшене создаем новую группу. Например с названием Github Notifications
  • Добавляем в группу нашего бота используя его уникальный username. На этом с ботом все. Можно начинать его тестировать

Тестируем бота

Тестировать можно используя curl. Для тестирования нам нужно знать token и chat_id. Token — это тот самый, который вернул BotFather при создании бота. Для того, что узнать chat_id нужно вызвать getUpdates метод для нашего бота

curl https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/getUpdates

Тут нужно обратить внимание, что в URL перед токеном должно быть ключевое слово «bot». Его легко упустить из вида, а без него Telegram API будет возвращать ошибку.

Ответ должен выглядеть так:

{
   "ok":true,
   "result":[
      {
         "update_id":605665419,
         "message":{
            "message_id":7,
            "from":{
               "id":300137526,
               "is_bot":false,
               "first_name":"Chuck",
               "last_name":"Norris",
               "language_code":"ru"
            },
            "chat":{
               "id":-123456678,
               "title":"Notifications",
               "type":"group",
               "all_members_are_administrators":true
            },
            "date":1586661656,
            "group_chat_created":true
         }
      }
   ]
}

Из этого ответа нас интересует идентификатор chat -> id (отрицательное число ). Теперь может послать сообщение через нашего бота

curl -X POST \
     -H 'Content-Type: application/json' \
     -d '{ "chat_id": "'$CHAT_ID'", "text": "This is a test from curl", "disable_notification": "true" }' \
     https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage

Если все ок, то в группе, которую мы создали в Telegram должно появиться сообщение «This is a test from curl»

Создаем action на github

На Githab навигируемся в интересующий нас репозиторий и на закладку Settings. В меню слева находим Secrets. Здесь создаем две переменных CHAT_ID и TELEGRAM_TOKEN с теми же самыми значениями, которые мы использовали при тестировании бота.

Далее навигируемся на закладку Actions и создаем новый action. Github предложит разные темплейты в зависимости от языка программирования, но их можно проигнорировать. Просто жмем справа в верхнем углу кнопку Set up a workflow yourself.

Github создаст файл main.yml, в который помещаем следующий сценарий:

name: Java CI

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Send notification to telegram
      uses: appleboy/telegram-action@master
      with:
        to: ${{ secrets.CHAT_ID }}
        token: ${{ secrets.TELEGRAM_TOKEN }}
        args: Repository {{ repo }}. The ${{ github.event_name }} event triggered a new build.

Далее делаем git commit и git push и проверяем сообщения в Telegram в группе Github Notifications.