وبهوکها به شما امکان میدهند انتگریشنهایی بسازید که به رویدادهای مخازن گیتییار شما پاسخ میدهند. وقتی رویدادی اتفاق میافتد (مثل push یا ایجاد مسئله)، گیتییار یک HTTP POST payload به URL پیکربندیشده ارسال میکند.
push - Git push به مخزنcreate - branch یا tag ایجاد شدdelete - branch یا tag حذف شدfork - مخزن fork شدrelease - انتشار منتشر شدissues - مسئله باز، بسته، دوباره باز شدissue_comment - کامنت روی مسئلهpull_request - PR باز، بسته، merge، sync شدwiki - صفحه ویکی ایجاد، ویرایش، حذف شدURL: Endpoint که payload های وبهوک را دریافت میکند
https://your-server.com/webhook
نوع محتوا: فرمت payload
application/json - فرمت JSON (توصیه میشود)application/x-www-form-urlencoded - فرم انکود شدهSecret: Secret اختیاری برای تأیید payload
سرور شما باید header X-Gitea-Signature را با استفاده از HMAC-SHA256 تأیید کند.
تأیید SSL: تأیید گواهیهای SSL
احراز هویت پایه HTTP: افزودن احراز هویت
username:password
کدام رویدادها؟:
فعال: فعال یا غیرفعال کردن وبهوک
{
"secret": "your-secret",
"ref": "refs/heads/main",
"before": "6113c5d64f9c8b4e7f2e4a7b3d1c9e5f8a2b4c6d",
"after": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0",
"commits": [
{
"id": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0",
"message": "افزودن ویژگی جدید",
"url": "http://localhost:3000/user/repo/commit/a1b2c3d4",
"author": {
"name": "جان دو",
"email": "john@example.com"
}
}
],
"repository": {
"id": 1,
"name": "my-repo",
"full_name": "user/my-repo",
"url": "http://localhost:3000/user/my-repo"
},
"pusher": {
"name": "user",
"email": "user@example.com"
}
}
همیشه امضاهای وبهوک را تأیید کنید:
import hmac
import hashlib
def verify_webhook(payload, signature, secret):
expected = hmac.new(
secret.encode('utf-8'),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
Trigger ساختها روی push:
from flask import Flask, request
import subprocess
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
# تأیید امضا
# پردازش payload
# Trigger ساخت
subprocess.run(['./build.sh'])
return 'OK', 200
if __name__ == '__main__':
app.run(port=5000)
ارسال پیام به کانال Slack:
import requests
def notify_slack(message):
url = "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK"
payload = {
"text": f"Push جدید به مخزن: {message}"
}
requests.post(url, json=payload)
ایجاد تیکت در سیستمهای خارجی:
def create_jira_issue(payload):
# استخراج اطلاعات مسئله
# ایجاد تیکت در Jira
# لینک برگشت به گیتییار
pass
وبهوک fire نمیشود:
خطای 404:
خطای 401/403:
خطای 500: