Отправка уведомлений в Discord из GitHub Actions
Настройте автоматические уведомления в Discord при пуше, деплое или ошибках в GitHub Actions. Примеры workflow с embed-сообщениями и статусами.
Зачем отправлять уведомления из GitHub Actions в Discord?
GitHub Actions — мощный инструмент для автоматизации CI/CD, а Discord — удобная платформа для командной коммуникации. Связав их через webhook, вы получаете мгновенные уведомления о:
- Успешных и неудачных деплоях — команда сразу узнает о статусе релиза
- Прохождении тестов — автоматические отчёты о результатах CI
- Новых релизах — анонсы версий прямо в канал разработки
- Критических ошибках — алерты при падении workflow
Вместо того чтобы проверять вкладку Actions на GitHub, вся команда видит статус проектов в реальном времени в Discord.
Создание webhook в Discord
Перед настройкой GitHub Actions нужно создать webhook в Discord:
- Откройте настройки канала Discord (шестерёнка рядом с названием)
- Перейдите в Интеграции → Вебхуки
- Нажмите Новый вебхук
- Задайте имя (например, “GitHub CI”) и скопируйте URL
URL будет выглядеть так:
https://discord.com/api/webhooks/1234567890/abcdefghijklmnop
Важно: Не коммитьте URL вебхука в репозиторий. Используйте GitHub Secrets.
Добавление webhook в GitHub Secrets
- Откройте ваш репозиторий на GitHub
- Перейдите в Settings → Secrets and variables → Actions
- Нажмите New repository secret
- Имя:
DISCORD_WEBHOOK_URL - Значение: вставьте скопированный URL вебхука
- Нажмите 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 через curl: примеры команд для терминала — Основы отправки webhook через curl для использования в CI/CD
- Автоматические уведомления через Discord Webhook — Полное руководство — Паттерны автоматизации уведомлений для различных сценариев
- Отправка Discord Webhook из JavaScript и Node.js — Альтернативные способы отправки уведомлений из Node.js
- Отложенные сообщения Discord Webhook — Автоматизация отправки сообщений по расписанию
- Автоматизация Discord Webhook — Продвинутые workflow автоматизации уведомлений
Попробуйте в нашем инструменте
Открыть конструктор Discord Webhook