В чем разница между Webhook и Server Hook в Git?

«В чем разница между Webhook и Server Hook в Git?» — вопрос из категории Git, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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, деплой).