Отправка уведомлений из репозитория GitLab одновременно на несколько вебхуков

·2 мин. чтения

Скорее-всего вы уже столкнулись с тем, что официальная интеграция "Discord Notifications" в GitLab имеет забавное ограничение на всего один вебхук (канал-назначение, куда будет отправлено уведомление).

Как выглядит официальная интеграция Discord Notifications
Как выглядит официальная интеграция Discord Notifications

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

Я решил разобраться как реализовать отправку сообщений вручную, и с собственным форматированием. В решении используется обычный CI/CD Pipelines в GitLab и .gitlab-ci.yml файл, который запускает скрипт для отправки сообщений DIscord с нужными нам параметрами.

  1. Заходим в Settings вашего репозитория и открываем меню CI/CD.
  2. Разворачиваем блок Variables и жмем на кнопку Add variable.
  3. В настройках выбираем Mask and hidden, скроллим ниже, вводим название переменной (Key) - WEBHOOK_URL_1, и вставляем в значение (Value) - URL вашего Discord вебхука №1. Сохраняем нажав Add variable.
  1. Делаем тоже самое для второго (или третьего, и до бесконечности) вебхука, указав другое название переменной (Key) - WEBHOOK_URL_2, и другое значение (Value). Сохраняем нажав Add variable.

  2. Создаем фаил .gitlab-ci.yml в корне вашего репозитория со следующим содержимым:

stages:
  - notify

notify:
  stage: notify
  image: alpine:latest
  when: always
  allow_failure: true
  script:
    - apk add --no-cache curl jq
    - |
      for webhook in "$WEBHOOK_URL_1" "$WEBHOOK_URL_2"; do
        curl -X POST "$webhook" \
          -H "Content-Type: application/json" \
          -d "$(jq -n \
            --arg title "$CI_PROJECT_NAME" \
            --arg msg "$CI_COMMIT_MESSAGE" \
            --arg branch "$CI_COMMIT_REF_NAME" \
            --arg commit "$CI_COMMIT_SHORT_SHA" \
            --arg url "$CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA" \
            --arg repo "$CI_PROJECT_PATH" \
            --arg user "$GITLAB_USER_NAME" \
            --arg user_login "$GITLAB_USER_LOGIN" \
            --arg user_avatar "$GITLAB_USER_AVATAR_URL" \
            --arg profile_url "$CI_SERVER_URL/$GITLAB_USER_LOGIN" \
            '{
              embeds: [{
                title: $title,
                description: $msg,
                color: 3066993,
                fields: [
                  { name: "Branch", value: $branch, inline: true },
                  { name: "Commit", value: "[\($commit)](\($url))", inline: true },
                  { name: "Author", value: "[\($user)](\($profile_url))", inline: true }
                ],
                thumbnail: { url: $user_avatar },
                footer: { text: $repo }
              }]
            }')"
      done
  1. Заливаем только что добавленный файл в удаленный репозиторий.
  2. Ждем выполнения CI/CD pipeline, что обычно занимает чуть менее одной минуты.
  3. Смотрим результат. Если вы выполнили все правильно, то в выбранный канал Discord придет уведомление.

Примечание: если вы хотите добавить больше чем 2 вебхука чтобы отправлять в еще больше каналов, измените следующую строку:

for webhook in "$WEBHOOK_URL_1" "$WEBHOOK_URL_2" "$WEBHOOK_URL_3"; do

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

Похожие публикации

Как настроить Apache Reverse Proxy для Node.js

Использование Reverse Proxy с Node.js может значительно улучшить управление и... Читать далее
·2 мин. чтения

Пароль для Bitbucket при клонировании репозитория

Предположим у вас уже есть репозиторий в Bitbucket и вам нужно клонировать его... Читать далее
·2 мин. чтения

Error: listen EACCES: permission denied

Если вы наткнулись на ошибку такого рода при запуске вашего NodeJS... Читать далее
·1 мин. чтения

© geekrainian.com.