Настройте профессиональный сервер Discord для обслуживания вашего приложения с помощью веб-хуков!

В этой статье мы обсудим CI/CD, что такое веб-перехватчик и способы использования веб-перехватчиков в разногласиях для создания сервера для обслуживания продукта, отслеживания ошибок и предоставления командам разработчиков простого доступа к информации о приложении.

Для продолжения необходимо базовое понимание Python, git и flask/servers/requests. Я буду использовать пример минимального сервера flask для отправки и получения запросов на указанный сервер разногласий.

Что такое вебхук?

Используя веб-перехватчики, сервер Discord может получать сообщения от других серверов или приложений, находящихся за пределами сети Discord. Вы указываете URL-адрес при настройке веб-перехватчика для сервера Discord, чтобы он мог отправлять туда POST-запросы, если происходит указанное событие. Затем вы можете использовать этот URL-адрес для инициирования операций на вашем сервере или в приложении, таких как публикация на канале Discord или выполнение какой-либо другой задачи.

Так что же могут делать вебхуки Discord?

  • Отправка сообщений на сервере
  • Обновите роли или разрешения для пользователей на сервере Discord.
  • Измените настройки сервера, например, смените имя сервера или аватар.
  • Запускайте действия во внешних приложениях или серверах, например отправку уведомления или обновление базы данных.
  • Выполнение задач модерации, таких как блокировка или отключение пользователей.

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

Как я могу использовать их в своем техническом обслуживании Discord?

Есть несколько способов включить веб-перехватчики в обслуживающий сервер разногласий, например.

  • Отправлять сообщения/отчеты об ошибках для уведомления соответствующих ролей
  • Назначить ошибку дежурному инженеру через дискорд
  • Отчет о результатах модульного и интеграционного тестирования

Эти дополнительные функции могут упростить общение и создать прямую связь между задачами и разработчиками. В этой статье я покажу, как создать веб-перехватчик, который сообщает результаты модульного тестирования через Github.

Создать веб-перехватчик

Мы рассмотрим, как реализовать некоторые из этих примеров с помощью библиотеки запросов в Python. Во-первых, давайте посмотрим, как создать вебхук на стороне раздора:

Чтобы использовать веб-перехватчик на вашем сервере разногласий, ваше приложение должно будет отправлять POST-запросы для связи с ним. Давайте создадим небольшой файл сервера на python и скопируем URL-адрес веб-хука, созданного в приведенном выше gif-файле.

Прежде чем мы начнем, вам нужно установить эти зависимости с помощью pip

pip3 install flask python-dotenv && pip freeze > requirements.txt

И затем мы создадим эти 3 файла

Вот что делают наши файлы:

  • server.py: сервер flask, который читает почтовый запрос, содержащий сообщение, а затем отправляет это сообщение на наш сервер разногласий. Он использует файл dotenv для нашего URL-адреса веб-перехватчика (который должен храниться в секрете).
  • req.py: управляет нашими запросами, позволяет отправлять запросы на публикацию на наш сервер.
  • .env: секретный файл среды, в котором хранится конфиденциальный контент, который мы не хотим публиковать. Чтобы узнать больше о том, как их использовать, ознакомьтесь с этой статьей!

Почему бы не отправить сообщение напрямую от req.py по ссылке в дискорде? Если все, что вы планируете делать, это отправлять сообщения в дискорд самостоятельно, вы, безусловно, можете. Однако при подключении к внешним вебхукам и API более оптимально иметь наш сервер в качестве посредника, так как это позволяет нам контролировать и форматировать входящие запросы. Поскольку нет гарантии, что все внешние приложения будут использовать один и тот же формат вебхука что делает дискорд или что мы хотим отображать в наших каналах дискорда. Сервер позволяет нам это исправить.

Чтобы запустить наш код, вам нужно сначала запустить server.py (python3 server.py), а затем отправить столько запросов, сколько вы хотите, с помощью req.py (python3 req.py)

Давайте проверим сервер!

Хостинг нашего сервера

Мы будем использовать Glitch для бесплатного размещения нашего сервера. У Glitch нет способа по умолчанию создать новый пустой проект, поэтому вы можете либо импортировать наш предыдущий код из GitHub, либо открыть новый стартовый проект и удалить ненужные нам файлы.

вот демо о том, как открыть новый стартовый проект в глюке:

После копирования и вставки нашего кода в наш глитч-проект наш проект должен выглядеть так:

В нижней части веб-страницы должна быть кнопка с названием компьютера терминал,

Давайте нажмем ее и выполним следующую команду, когда откроется меню терминала:

pip3 install -r requirements.txt && python3 server.py

Как только он завершит установку наших пакетов, он должен открыть наш сервер, что позволит нам звонить ему из любого места. Вы можете найти ссылку для своего сервера, открыв значок предварительного просмотра и открыв программу в новой вкладке.

Давайте вернемся в нашу локальную среду и снова запустим нашу функцию req.py. Нам нужно будет закрыть наш локальный сервер, если он все еще работает, и изменить ссылку в нашем .env на ту, которую мы скопировали из глюка, добавив «/ discord» для ссылки на определенный нами маршрут. Давайте запустим python3 req.py и убедимся, что он проходит:

Приложение для непрерывной интеграции

Теперь, когда мы создали наш сервер и наш веб-хук, мы можем начать подключать его к внешним приложениям. Непрерывная интеграция (CI) — это практика разработки, которая включает частую интеграцию изменений кода от нескольких участников в общий репозиторий.

В этом разделе я подключу наш сервер к веб-перехватчику Github, который будет отправлять сообщение каждый раз, когда мы отправим в репозиторий. Для этого потребуются некоторые знания git и возможность отправлять коммиты в репозиторий Github. Позже я покажу, как подключить его к рабочему процессу Github Actions, чтобы сообщить о его результатах.

Что такое действия Github? Github имеет функцию в своих репозиториях, где вы можете установить для них функции, которые они будут выполнять при определенных событиях (например, при отправке вашего кода), называемых действиями. Мы подключим Github Action из популярного репозитория, чтобы мы могли отправить сообщение в наш дискорд, если он прошел или не прошел.

Github-Push Webhook

Перейдите в один из ваших репозиториев на Github, перейдите на вкладку настроек и нажмите веб-хуки, добавьте веб-хук.

Наш URL-адрес полезной нагрузки должен быть нашей ошибкой, наш тип контента должен быть установлен как application/json, и мы можем установить триггеры только для push-события. Теперь мы можем добавить вебхук.

Нам также нужно переписать наш файл server.py, чтобы он принимал ответы веб-перехватчика от Github, давайте сделаем это сейчас.

# server.py
# Daniel Kogan
# 12.27.2022

import requests, os
from dotenv import load_dotenv
from flask import Flask, request

load_dotenv()

app = Flask(__name__)

WEBHOOK_URL = os.environ["WEBHOOK_URL"] # your webhook url goes here

def send_message_from_github(data):
  repo_name = str(data['repository']['full_name']) # repository name
  time = str(data['repository']['updated_at']) # time of latest commit
  sender = str(data['pusher']['name']) # who committed
  commit_message = str(data['commits'][0]['message']) # commit message
  data = {
    "content": "A new commit '***"+commit_message+"***' was pushed to *__" + repo_name + "__* by *" + sender + "* at " + time
  }
  requests.post(WEBHOOK_URL, json=data)  


@app.route('/')
def main():
    return 'Hello, World!'

@app.route('/discord', methods=['POST'])
def discord():
    data = request.get_json()
    send_message_from_github(data)
    return 'Message sent!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

Теперь наш серверный файл может считывать полезную нагрузку веб-перехватчика Github, обрабатывать информацию, переформатировать ее и отправлять в веб-перехватчик раздора для вывода сообщения.

Мы можем настроить это так, чтобы в каждом репозитории был веб-хук, указывающий на URL-адрес, и мы могли бы видеть каждую фиксацию, которую мы делаем на нашем сервере.

Расширено до действий Github

Чтобы расширить нашу функциональность для рабочих процессов Github, нам нужно будет пересмотреть настройки, которые мы определили для веб-перехватчика. В частности, нам нужно отредактировать триггер при отправке, чтобы он срабатывал по отдельным событиям, а затем выбрать параметр запуск рабочего процесса.

После этого мы перепишем наш server.py еще раз, на этот раз с дополнительной проверкой ошибок и другими функциями.

# server.py
# Daniel Kogan
# 12.27.2022

import requests, os
from dotenv import load_dotenv
from flask import Flask, request

load_dotenv()

app = Flask(__name__)

WEBHOOK_URL = os.environ["WEBHOOK_URL"] # your webhook url goes here

def send_message_to_discord(data):
  if not ('action' in data and 'workflow_run' in data): # check if it is a workflow response
    return 400 # error, return error code
  if not data['action'] == 'completed':
    return 200 # ignore in progress and requested workflows, throw accepted
  name = data['workflow_run']['name'] # workflow name
  status = data['workflow_run']['conclusion'] # success, failure, cancelled
  repo_name = str(data['repository']['full_name']) # repository name
  if status == 'success': status+=' ✅' 
  else: status+=' ❌'
  data = {
    "content": f"**{repo_name}**: Workflow __{name}__ has completed with status **{status}**"
  }
  requests.post(WEBHOOK_URL, json=data)  
  return 200 # success


@app.route('/')
def main():
    return 'Hello, World!'

@app.route('/discord', methods=['POST'])
def discord():
    data = request.get_json()
    status = send_message_to_discord(data)
    return 'Message sent!', status

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

На вашем Github вам нужно будет смоделировать неудачный и успешный рабочий процесс, чтобы увидеть результаты, но если вы уже настроили рабочий процесс, вот некоторые потенциальные сообщения, которые вы можете увидеть в своем следующем коммите:

Заключение

Вы можете использовать вебхуки в разногласиях различными способами, включая поддержку непрерывной интеграции. Некоторые распространенные способы использования веб-перехватчиков — это отправка сообщений каждый раз, когда выходит новая статья или твит, или вообще все, о чем вы хотели бы получать уведомления с помощью поддерживающего API.

Веб-хуки можно использовать для управления информацией о вашем проекте, обеспечения информирования команд об определенных событиях, а также для регистрации записей коммитов на вашем сервере разногласий, чтобы оглянуться назад.

Интегрируя уведомления веб-перехватчиков в конвейер CI/CD, члены команды могут получать обновления в режиме реального времени о сборках, развертываниях и других событиях, помогая обеспечить быстрое выявление и устранение любых проблем.

Чтобы увидеть исходные файлы для этого проекта, проверьте его здесь на Github: