Подписаться на блог

GitLab CI & Telegram

Последнее время стал замечать, что всё больше людей юзают GitLab, отмечая, что у него клёвый CI/CD. Не знаю, как правильно всё это оценивать, но попробовать я решил однозначно.

Во-первых, переместил статические сайтики с GitHub Pages на GitLab Pages. Во-вторых, сделал небольшое ExpressJS-приложение и разместил на GitLab, а так же настроил деплой на Heroku, что, оказалось, очень просто.

GitLab CI, конечно, крут, много полезных примеров и доков, из коробки поддерживается множество интеграций и фич, но мне была нужна интеграция с Telegram, т. к. он всегда включен.

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

Задача поставлена, сложностей никаких (на самом деле они возникали, но это я доки невнимательно читал). Делаем.

Чтобы взаимодействовать с Telegram создадим бота: пишем @BotFather, создаём обычного бота, загружаем аватарку и т. п. Всё это делается максимально просто. После создания бота в чатик прилетит token для работы с API.

Бот будет слать уведомления пользователю с нужным ID, но просто так Telegram не позволяет рассылать сообщения от бота любому пользователю, поэтому новосозданному боту нужно отправить хотя бы какое-то сообщение от пользователя, которому должны приходить уведомления.

Сохраняем нужные значения в GitLab:

  1. Settings нужного репозитория;
  2. Пункт CI/CD;
  3. Secret variables;
  4. Сохранить в переменную TELEGRAM_BOT_TOKEN token, присланный после создания бота через BotFather;
  5. В TELEGRAM_USER_ID сохраняем ID пользователя, которому будут отправляться уведомления.

Для удобной отправки уведомлений создадим скрипт в `ci-notify.sh`, в котором будем обращаться к API Telegram и отправлять сообщение нужному пользователю через созданного бота:

#!/bin/bash

TIME="10"
URL="https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage"
TEXT="Deploy status: $1%0A%0AProject:+$CI_PROJECT_NAME%0AURL:+$CI_PROJECT_URL/pipelines/$CI_PIPELINE_ID/%0ABranch:+$CI_COMMIT_REF_SLUG"

curl -s --max-time $TIME -d "chat_id=$TELEGRAM_USER_ID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null

В качестве первого параметра для этого скрипта должен передаваться статус деплоя. В .gitlab-ci.yml описываем вызов этого скрипта в нужное время с нужными параметрами:

stages:
- deploy
- notify

deploy:
  image: node:4.2.2
  stage: deploy

  script:
  #deploy success
  - sh .ci-notify.sh ✅

  artifacts:
    paths:
    - public
  only:
  - master

notify_error:
  stage: notify
  script:
  - sh .ci-notify.sh ❌
  when: on_failure #deploy fail

Для обозначения статуса деплоя я использовал Emoji. В случае успешного выполнения деплоя просто вызывается скрипт с нужны параметром. В случае неудачного деплоя “управление переходит” в следующий stage, в котором происходит уведомление о неудачном деплое.

Таким образом, где-то за 10 минут можно настроить простые уведомления в Telegram из GitLab CI и хоть чуть-чуть почувствовать себя DevOps’ом. Если подзаморочиться, то можно расширить возможности всего этого, но мне как-то лень.