Введение
После освоения базовых функций GitHub можно настроить его под конкретные нужды команды или интегрировать с внешними сервисами. В этом разделе мы разберем использование хуков и API GitHub для кастомизации и автоматизации процессов.
Сервисы и хуки
Раздел «Webhooks and Services» в настройках репозитория позволяет подключать внешние системы. Перейдите в «Settings» и выберите вкладку «Webhooks and Services».
Сервисы: Выберите сервис, например, email, для уведомлений. Укажите адрес (например, anna.k@example.ru) и активируйте. Email будет получать уведомления при каждом push. Для интеграции с системой вроде Travis CI настройте встроенный сервис для запуска тестов.
Хуки: Для кастомной интеграции добавьте вебхук через «Add webhook». Укажите URL (например, https://myservice.com/hook) и секретный ключ. По умолчанию хук реагирует на push-события.
Пример: веб-сервис на Python с Flask для уведомления о изменениях в файле config.yml определённой ветки:
from flask import Flask, request, json
from smtplib import SMTP
app = Flask(__name__)
@app.route('/payload', methods=['POST'])
def webhook():
data = json.loads(request.data)
pusher = data['pusher']['name']
branch = data['ref']
files = [item for commit in data['commits'] for item in commit['modified']]
if pusher == 'ekaterina' and branch == 'ref/heads/dev-branch' and 'config.yml' in files:
with SMTP('smtp.example.com') as server:
server.sendmail('ekaterina@example.com', 'ekaterina@example.com', 'Config changed!')
return '', 200 Используйте консоль отладки на странице вебхука для тестирования доставок.
GitHub API
API позволяет автоматизировать действия, такие как комментирование или изменение статусов. Пример запроса без аутентификации:
$ curl https://api.github.com/users/ekaterina_nikitina Для действий с приватным контентом используйте токен доступа из «Applications» в настройках.
Пример: комментирование задачи №5 в репозитории ekaterina_nikitina/task-manager:
$ curl -H "Content-Type: application/json" \
-H "Authorization: token YOUR_TOKEN" \
--data '{"body":"Отличная работа!"}' \
https://api.github.com/repos/ekaterina_nikitina/task-manager/issues/5/comments Изменение статуса запроса на слияние
Пример: вебхук проверяет наличие тега «Reviewed-by» в коммитах:
from flask import Flask, request, json
import requests
app = Flask(__name__)
@app.route('/payload', methods=['POST'])
def webhook():
data = json.loads(request.data)
repo_name = data['repository']['full_name']
for commit in data['commits']:
if 'Reviewed-by' in commit['message']:
state = 'success'
desc = 'Reviewed successfully!'
else:
state = 'failure'
desc = 'Review missing.'
sha = commit['id']
url = f"https://api.github.com/repos/{repo_name}/statuses/{sha}"
headers = {'Authorization': f"token {os.environ['TOKEN']}", 'Content-Type': 'application/json'}
requests.post(url, json={'state': state, 'description': desc, 'context': 'validate/review'}, headers=headers)
return '', 200 Статусы отображаются на странице запроса, помогая избежать слияния проблемного кода.
Заключение
Сценарии GitHub с хуками и API позволяют гибко настраивать процессы.
Отзывы