GitLab CI & Telegram
Последнее время стал замечать, что всё больше людей юзают GitLab, отмечая, что у него клёвый CI/CD. Не знаю, как правильно всё это оценивать, но попробовать я решил однозначно.
Во-первых, переместил статические сайтики с GitHub Pages на GitLab Pages. Во-вторых, сделал небольшое ExpressJS-приложение и разместил на GitLab, а так же настроил деплой на Heroku, что, оказалось, очень просто.
GitLab CI, конечно, крут, много полезных примеров и доков, из коробки поддерживается множество интеграций и фич, но мне была нужна интеграция с Telegram, т. к. он всегда включен.
Ну, раз нет интеграции из коробки, то сделаем сами, причем на данном этапе нужно всего лишь уведомление о статусе деплоя.
Задача поставлена, сложностей никаких (на самом деле они возникали, но это я доки невнимательно читал). Делаем.
Чтобы взаимодействовать с Telegram создадим бота: пишем @BotFather, создаём обычного бота, загружаем аватарку и т. п. Всё это делается максимально просто. После создания бота в чатик прилетит token для работы с API.
Бот будет слать уведомления пользователю с нужным ID, но просто так Telegram не позволяет рассылать сообщения от бота любому пользователю, поэтому новосозданному боту нужно отправить хотя бы какое-то сообщение от пользователя, которому должны приходить уведомления.
Сохраняем нужные значения в GitLab:
- Settings нужного репозитория;
- Пункт CI/CD;
- Secret variables;
- Сохранить в переменную TELEGRAM_BOT_TOKEN token, присланный после создания бота через BotFather;
- В 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’ом. Если подзаморочиться, то можно расширить возможности всего этого, но мне как-то лень.