В gitlab есть функционал об отправке сообщений в telegram. Но на примере этого сайта есть свои ограничения.

Что не так

Добавляя статьи и тестируя их через тестовые домены (окружения) в Gitlab CI (подробнее тут) понадобилась возможность получать уведомление, когда площадка готова для проверки. Процесс сборки, заливки и установки домена не мгновенный, а сидеть и отслеживать “когда же оно уже всё” - не очень продуктивно. Поэтому начал искать способ получения уведомлений при завершении работы пайплайна. В gitlab есть встроенная интеграция с telegram. И она даже умеет реагировать на изменение статуса пайплайнов. Проблема в сообщение, которое приходит из gitlab:

1
repo_name: Pipeline #0000000000 of branch main by Anon Anonovich (username) has passed in 00:44

Где:

  • repo_name - ссылка на репозиторий;
  • #0000000000 - ссылка на пайплайн;
  • main - ссылка на ветку;
  • Anon Anonovich (username) - имя пользователя на сайте и его ник в скобках.

Как видно из сообщения - нет ссылки на окружение, что бы можно было сразу перейти и посмотреть результат в браузере. Для ветки main это не большая проблема, так как это основной домен сайта. Но домены для тестовых площадок создаются с рандомным кодом, и что бы на него попасть всеравно приходится идти в репозиторий. Из-за этого было решено оставить такие уведомления только для сбойных пайплайнов и включить дополнительный шаг в свой .gitlab-ci.yml.

Теория

Для отправки сообщения в telegram ботом нужно воспользоваться методом sendMessage. Здесь есть три важных параметра:

  • chat_id - идентификатор, куда будет отправлено сообщение (в моем случае идентификатор канала);
  • text - собственно само сообщение;
  • parse_mode - единственный не обязательный параметр, но лучше его задать самому, что бы можно было применить форматирование для сообщения.

Так же в ссылке https://api.telegram.org/bot<token>/sendMessage, нужно будет указать token бота.

Дополнительный этап в .gitlab-ci.yml

Теперь можно дополнить .gitlab-ci.yml (install-curl-jq-jo уже был описан в предыдущей статье):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
dev-link:
  stage: notify
  needs:
    - dev-domain
  variables:
    TEXT: |-
      Ветка: <a href="https://gitlab.com/***/***/-/tree/${CI_COMMIT_BRANCH}">${CI_COMMIT_BRANCH}</a>
      Ссылка: <a href="https://${CI_ENVIRONMENT_SLUG}.${SITE_DOMAIN}">https://${CI_ENVIRONMENT_SLUG}.${SITE_DOMAIN}</a>      
  before_script:
    - *install-curl-jq-jo
  script:
    - DATA=$( jo chat_id=${TG_NOTIFY_CHAT_ID} parse_mode=HTML text="${TEXT}" )
    - curl -s -X POST "https://api.telegram.org/bot${TG_NOTIFY_TOKEN}/sendMessage" -H "Content-Type:application/json" --data "${DATA}" | jq
  environment:
    name: staging/$CI_COMMIT_REF_SLUG
    action: access
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: never
    - if: $CI_COMMIT_BRANCH

Теперь после удачной сборки и добавления временного поддомена в cloudflare прите сообщение в telegram со ссылкой на ветку и ссылкой на тестовый домен.

Желать отдельное сообщение для продакшн окружения не стал, так как там ссылка всегда одна и та же. Но если понадобится выводить дополнительную информацию, то добавить не составит труда. Главное перепроверить что указано в параметрах needs и rules.