Ответ
Webhook — HTTP-колбэк, инициируемый внешним сервисом (GitHub, GitLab) при событиях в репозитории. Server Hook (Git Hook) — локальный скрипт, выполняемый на Git-сервере (или локально) при определенных событиях Git.
Сравнение с точки зрения DevOps-практик:
| Критерий | Webhook | Server Hook (Git Hook) |
|---|---|---|
| Место выполнения | Удаленный сервер (ваш CI/CD, мониторинг) | Локально на Git-сервере или в репозитории |
| Триггер | События на GitHub/GitLab/Bitbucket | Локальные Git-операции (commit, push, receive) |
| Типичное использование | Запуск CI/CD пайплайна, уведомления в Slack, деплой | Валидация кода, enforcement политик, автоматизация |
| Управление | Через UI/API Git-хоста | Файлы в .git/hooks/ или на Git-сервере |
| Масштабирование | Легко масштабируется, stateless | Требует синхронизации между репозиториями |
Примеры использования в DevOps:
Webhook для CI/CD (GitHub → Jenkins):
# Настройка в GitHub:
URL: https://jenkins.company.com/github-webhook/
Events: push, pull_request
Secret: ${WEBHOOK_SECRET}
# Jenkins получает POST с payload и запускает pipeline
Server Hook для контроля качества (pre-receive):
#!/bin/bash
# /home/git/repositories/project.git/hooks/pre-receive
while read oldrev newrev refname; do
# Проверяем, что commit message содержит JIRA ticket
if ! git log --format=%B $oldrev..$newrev | grep -q "JIRA-[0-9]"; then
echo "ERROR: Все коммиты должны содержать JIRA ticket (JIRA-123)" >&2
exit 1
fi
# Проверяем размер файлов
if git diff --name-only $oldrev..$newrev | xargs ls -l | awk '$5 > 10485760 {print $9}' | grep -q .; then
echo "ERROR: Обнаружены файлы >10MB" >&2
exit 1
fi
done
Гибридный подход: Часто используем оба механизма: Server Hooks для быстрой валидации (отклоняет неправильные push сразу), Webhooks для сложной автоматизации (CI/CD, деплой).