Перейти к содержимому
Все статьи
· Обновлено 15 февраля 2026 г.

Отправка уведомлений в Discord из GitHub Actions

Настройте автоматические уведомления в Discord при пуше, деплое или ошибках в GitHub Actions. Примеры workflow с embed-сообщениями и статусами.

github actionsci/cdwebhookавтоматизацияgithub actions discord 2026ci cd уведомленияdevops discord
Отправка уведомлений в Discord из GitHub Actions

Зачем отправлять уведомления из GitHub Actions в Discord?

GitHub Actions — мощный инструмент для автоматизации CI/CD, а Discord — удобная платформа для командной коммуникации. Связав их через webhook, вы получаете мгновенные уведомления о:

  • Успешных и неудачных деплоях — команда сразу узнает о статусе релиза
  • Прохождении тестов — автоматические отчёты о результатах CI
  • Новых релизах — анонсы версий прямо в канал разработки
  • Критических ошибках — алерты при падении workflow

Вместо того чтобы проверять вкладку Actions на GitHub, вся команда видит статус проектов в реальном времени в Discord.

Создание webhook в Discord

Перед настройкой GitHub Actions нужно создать webhook в Discord:

  1. Откройте настройки канала Discord (шестерёнка рядом с названием)
  2. Перейдите в ИнтеграцииВебхуки
  3. Нажмите Новый вебхук
  4. Задайте имя (например, “GitHub CI”) и скопируйте URL

URL будет выглядеть так:

https://discord.com/api/webhooks/1234567890/abcdefghijklmnop

Важно: Не коммитьте URL вебхука в репозиторий. Используйте GitHub Secrets.

Добавление webhook в GitHub Secrets

  1. Откройте ваш репозиторий на GitHub
  2. Перейдите в SettingsSecrets and variablesActions
  3. Нажмите New repository secret
  4. Имя: DISCORD_WEBHOOK_URL
  5. Значение: вставьте скопированный URL вебхука
  6. Нажмите Add secret

Теперь вы можете использовать ${{ secrets.DISCORD_WEBHOOK_URL }} в workflow без риска утечки.

Простое уведомление при пуше

Создайте файл .github/workflows/discord-notify.yml:

name: Discord Notification

on:
  push:
    branches: [main]

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Send Discord notification
        run: |
          curl -H "Content-Type: application/json" \
               -d '{
                 "content": "✅ Новый коммит в **${{ github.repository }}** от **${{ github.actor }}**",
                 "embeds": [{
                   "title": "Commit: ${{ github.event.head_commit.message }}",
                   "url": "${{ github.event.head_commit.url }}",
                   "color": 5763719,
                   "fields": [
                     {
                       "name": "Ветка",
                       "value": "${{ github.ref_name }}",
                       "inline": true
                     },
                     {
                       "name": "Автор",
                       "value": "${{ github.actor }}",
                       "inline": true
                     }
                   ]
                 }]
               }' \
               ${{ secrets.DISCORD_WEBHOOK_URL }}

Этот workflow отправляет уведомление при каждом пуше в main с информацией о коммите и авторе.

Уведомления о статусе деплоя

Более практичный пример — отправка уведомления после деплоя с индикацией успеха или ошибки:

name: Deploy and Notify

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Deploy to production
        id: deploy
        run: |
          # Ваш скрипт деплоя
          npm run build
          npm run deploy
      
      - name: Notify success
        if: success()
        run: |
          curl -H "Content-Type: application/json" \
               -d '{
                 "embeds": [{
                   "title": "Деплой успешен",
                   "description": "Приложение **${{ github.repository }}** задеплоено в production",
                   "color": 5763719,
                   "fields": [
                     {
                       "name": "Коммит",
                       "value": "${{ github.event.head_commit.message }}",
                       "inline": false
                     },
                     {
                       "name": "Автор",
                       "value": "${{ github.actor }}",
                       "inline": true
                     },
                     {
                       "name": "Ветка",
                       "value": "${{ github.ref_name }}",
                       "inline": true
                     }
                   ],
                   "timestamp": "${{ github.event.head_commit.timestamp }}"
                 }]
               }' \
               ${{ secrets.DISCORD_WEBHOOK_URL }}
      
      - name: Notify failure
        if: failure()
        run: |
          curl -H "Content-Type: application/json" \
               -d '{
                 "embeds": [{
                   "title": "Ошибка деплоя",
                   "description": "Деплой **${{ github.repository }}** завершился с ошибкой",
                   "color": 15548997,
                   "fields": [
                     {
                       "name": "Workflow",
                       "value": "${{ github.workflow }}",
                       "inline": true
                     },
                     {
                       "name": "Запущен",
                       "value": "${{ github.actor }}",
                       "inline": true
                     },
                     {
                       "name": "Логи",
                       "value": "[Посмотреть детали](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})",
                       "inline": false
                     }
                   ],
                   "timestamp": "${{ github.event.head_commit.timestamp }}"
                 }]
               }' \
               ${{ secrets.DISCORD_WEBHOOK_URL }}

Здесь используются условия if: success() и if: failure() для отправки разных сообщений в зависимости от результата деплоя. Зелёный embed при успехе, красный при ошибке.

Уведомления о новых релизах

Автоматически анонсируйте релизы в Discord:

name: Release Notification

on:
  release:
    types: [published]

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Announce release
        run: |
          curl -H "Content-Type: application/json" \
               -d '{
                 "content": "@here Новый релиз!",
                 "embeds": [{
                   "title": "${{ github.event.release.name }}",
                   "description": "${{ github.event.release.body }}",
                   "url": "${{ github.event.release.html_url }}",
                   "color": 5793266,
                   "fields": [
                     {
                       "name": "Версия",
                       "value": "${{ github.event.release.tag_name }}",
                       "inline": true
                     },
                     {
                       "name": "Автор",
                       "value": "${{ github.event.release.author.login }}",
                       "inline": true
                     }
                   ],
                   "footer": {
                     "text": "${{ github.repository }}"
                   },
                   "timestamp": "${{ github.event.release.published_at }}"
                 }]
               }' \
               ${{ secrets.DISCORD_WEBHOOK_URL }}

Этот workflow срабатывает при публикации релиза и отправляет embed с описанием, версией и ссылкой на GitHub.

Использование готового action

Вместо curl можно использовать готовый GitHub Action для Discord webhook:

name: Discord Webhook Action

on: [push]

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Send notification
        uses: sarisia/actions-status-discord@v1
        with:
          webhook: ${{ secrets.DISCORD_WEBHOOK_URL }}
          title: "Build completed"
          description: "Commit: ${{ github.event.head_commit.message }}"
          color: 0x5865F2
          username: GitHub Actions

Action sarisia/actions-status-discord упрощает отправку уведомлений и автоматически подставляет статус workflow.

Отправка уведомлений только при ошибках

Чтобы не спамить канал при каждом успешном билде, можно отправлять уведомления только при ошибках:

name: Test and Notify on Failure

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Run tests
        run: npm test
      
      - name: Notify on failure
        if: failure()
        run: |
          curl -H "Content-Type: application/json" \
               -d '{
                 "content": "⚠️ Тесты упали в **${{ github.repository }}**",
                 "embeds": [{
                   "title": "Ошибка в тестах",
                   "color": 15548997,
                   "fields": [
                     {
                       "name": "Коммит",
                       "value": "${{ github.event.head_commit.message }}",
                       "inline": false
                     },
                     {
                       "name": "Автор",
                       "value": "${{ github.actor }}",
                       "inline": true
                     },
                     {
                       "name": "Логи",
                       "value": "[Открыть](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})",
                       "inline": true
                     }
                   ]
                 }]
               }' \
               ${{ secrets.DISCORD_WEBHOOK_URL }}

Полезные переменные GitHub Actions

В уведомлениях можно использовать множество встроенных переменных:

  • ${{ github.repository }} — имя репозитория (например, user/repo)
  • ${{ github.actor }} — пользователь, запустивший workflow
  • ${{ github.ref_name }} — имя ветки или тега
  • ${{ github.event.head_commit.message }} — сообщение коммита
  • ${{ github.event.head_commit.url }} — ссылка на коммит
  • ${{ github.run_id }} — ID запуска workflow (для ссылки на логи)
  • ${{ github.server_url }} — URL GitHub сервера

Полный список переменных доступен в документации GitHub Actions.

Что дальше

Теперь вы можете настроить автоматические уведомления в Discord для любых событий в GitHub Actions. Это особенно полезно для команд, которые используют Discord как основной канал коммуникации. Для сбора обратной связи от команды после деплоя можно использовать опросы, а для организации обсуждений — треды и форумы.

Попробуйте визуально спроектировать embed-сообщения в нашем бесплатном конструкторе Discord Webhook, а затем скопируйте JSON в ваш workflow.

Помимо кода, discord-webhook.com предлагает визуальный конструктор с такими функциями как отложенные сообщения, поддержка тредов и форумов, опросы и интерактивные кнопки с действиями — всё без написания кода.

Уведомления о Pull Request

Помимо пушей и деплоев, одним из самых востребованных сценариев является уведомление команды о новых и обновлённых Pull Request. Когда разработчик открывает PR, ревьюеры должны узнать об этом как можно быстрее — и Discord-канал для этого подходит идеально.

Настройте workflow, который срабатывает на события opened, synchronize и closed для pull request:

name: PR Notification

on:
  pull_request:
    types: [opened, synchronize, closed]

jobs:
  notify-pr:
    runs-on: ubuntu-latest
    steps:
      - name: Send PR notification
        run: |
          if [ "${{ github.event.action }}" = "closed" ] && [ "${{ github.event.pull_request.merged }}" = "true" ]; then
            COLOR=5763719
            STATUS="✅ Вмержен"
          elif [ "${{ github.event.action }}" = "closed" ]; then
            COLOR=9807270
            STATUS="🚫 Закрыт"
          else
            COLOR=5793266
            STATUS="🔄 Открыт"
          fi

          curl -H "Content-Type: application/json" \
               -d "{
                 \"embeds\": [{
                   \"title\": \"PR #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}\",
                   \"url\": \"${{ github.event.pull_request.html_url }}\",
                   \"color\": $COLOR,
                   \"fields\": [
                     {\"name\": \"Статус\", \"value\": \"$STATUS\", \"inline\": true},
                     {\"name\": \"Автор\", \"value\": \"${{ github.event.pull_request.user.login }}\", \"inline\": true},
                     {\"name\": \"Изменения\", \"value\": \"+${{ github.event.pull_request.additions }} / -${{ github.event.pull_request.deletions }} в ${{ github.event.pull_request.changed_files }} файлах\", \"inline\": true}
                   ]
                 }]
               }" \
               ${{ secrets.DISCORD_WEBHOOK_URL }}

Такой workflow показывает заголовок PR, автора, статистику изменённых строк и файлов. Для визуальной настройки embed-полей используйте форматирование эмбедов — это поможет сделать уведомления информативнее и нагляднее. Обратите внимание на цветовую кодировку: зелёный для вмерженных PR, синий для открытых, серый для закрытых без мержа — так команда мгновенно считывает статус по цвету.

Плановые отчёты

Не все уведомления должны быть реактивными. Иногда команде полезно получать регулярные сводки — например, ежедневный отчёт о состоянии репозитория или еженедельную статистику активности. GitHub Actions поддерживает cron-расписание, которое отлично подходит для таких задач.

name: Daily Report

on:
  schedule:
    - cron: '0 9 * * 1-5'  # Каждый будний день в 9:00 UTC

jobs:
  daily-report:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Generate and send report
        env:
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          COMMITS_TODAY=$(git log --since="24 hours ago" --oneline | wc -l)
          AUTHORS=$(git log --since="24 hours ago" --format='%an' | sort -u | tr '\n' ', ' | sed 's/, $//')
          OPEN_PRS=$(gh pr list --state open --json number | jq length)

          curl -H "Content-Type: application/json" \
               -d "{
                 \"embeds\": [{
                   \"title\": \"📊 Ежедневный отчёт: ${{ github.repository }}\",
                   \"color\": 5793266,
                   \"fields\": [
                     {\"name\": \"Коммитов за 24ч\", \"value\": \"$COMMITS_TODAY\", \"inline\": true},
                     {\"name\": \"Открытых PR\", \"value\": \"$OPEN_PRS\", \"inline\": true},
                     {\"name\": \"Активные авторы\", \"value\": \"${AUTHORS:-нет активности}\", \"inline\": false}
                   ],
                   \"footer\": {\"text\": \"Автоматический отчёт\"},
                   \"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"
                 }]
               }" \
               $DISCORD_WEBHOOK_URL

Расписание 0 9 * * 1-5 запускает workflow каждый будний день в 9 утра по UTC. Вы можете адаптировать его под свой часовой пояс и добавить еженедельные сводки (например, 0 10 * * 1 — по понедельникам в 10:00). Отчёт собирает количество коммитов, список активных авторов и число открытых PR — вся ключевая информация в одном embed. Подробнее о различных паттернах автоматизации уведомлений вы можете прочитать в отдельном руководстве.

Матричные билды с уведомлениями

Когда проект поддерживает несколько версий Node.js, Python или других рантаймов, вы используете матрицу билдов. Проблема в том, что каждая ячейка матрицы — это отдельный job, и при наивном подходе Discord-канал засыпает десятками сообщений. Решение — отдельный job, который запускается после всей матрицы и отправляет агрегированный результат.

name: Matrix Build

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18, 20, 22]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm ci && npm test

  notify:
    needs: test
    runs-on: ubuntu-latest
    if: always()
    steps:
      - name: Check matrix result
        run: |
          if [ "${{ needs.test.result }}" = "success" ]; then
            COLOR=5763719
            STATUS="✅ Все версии прошли тесты"
          else
            COLOR=15548997
            STATUS="❌ Часть матрицы провалилась"
          fi

          curl -H "Content-Type: application/json" \
               -d "{
                 \"embeds\": [{
                   \"title\": \"Матричный билд: ${{ github.repository }}\",
                   \"color\": $COLOR,
                   \"fields\": [
                     {\"name\": \"Результат\", \"value\": \"$STATUS\", \"inline\": false},
                     {\"name\": \"Матрица\", \"value\": \"Node.js 18, 20, 22\", \"inline\": true},
                     {\"name\": \"Коммит\", \"value\": \"${{ github.event.head_commit.message }}\", \"inline\": true},
                     {\"name\": \"Логи\", \"value\": \"[Подробности](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})\", \"inline\": false}
                   ]
                 }]
               }" \
               ${{ secrets.DISCORD_WEBHOOK_URL }}

Ключевой момент — директива needs: test гарантирует, что уведомление отправится только после завершения всех ячеек матрицы. Условие if: always() обеспечивает отправку уведомления независимо от того, успешна матрица или нет. Выражение needs.test.result возвращает агрегированный статус: success только если все ячейки прошли успешно, иначе — failure. Таким образом, вместо трёх отдельных сообщений команда получает одно информативное уведомление с общим результатом.

Безопасность секретов

При работе с webhook URL в CI/CD безопасность — приоритет номер один. Webhook URL фактически является токеном доступа: любой, кто его знает, может отправлять сообщения в ваш канал, включая фишинговые ссылки и вредоносный контент.

Основные правила защиты:

  • Только GitHub Secrets — никогда не храните URL вебхука в коде, .env-файлах или конфигах, попадающих в репозиторий. Используйте исключительно secrets.DISCORD_WEBHOOK_URL.
  • Минимальные права GITHUB_TOKEN — если ваш workflow использует GITHUB_TOKEN, убедитесь, что permissions ограничены до необходимого минимума (например, contents: read для чтения репозитория).
  • Ротация при утечке — если webhook URL попал в публичный доступ, немедленно удалите его в настройках канала Discord и создайте новый. Обновите секрет в GitHub.
  • Аудит доступа — регулярно проверяйте, у кого есть доступ к секретам репозитория. В организациях используйте environment-level secrets с обязательными ревьюерами для production-окружений.
  • Форки и PR от внешних контрибьюторов — помните, что pull_request события из форков не имеют доступа к секретам. Это защита по умолчанию — не обходите её через pull_request_target без тщательной проверки.

Соблюдение этих правил защитит ваш Discord-сервер от нежелательных сообщений и сохранит целостность CI/CD пайплайна.

Похожие статьи

Попробуйте в нашем инструменте

Открыть конструктор Discord Webhook