Webhooks
يقبل Patchwire أحداث الدفع من أربعة مزودي SCM. ينطلق الفحص خلال نحو ثانية واحدة من الدفع وينتهي خلال أقل من دقيقة لمستودع نموذجي.
نمط الروابط
| المزوِّد | الرابط |
|---|---|
| Forgejo | https://api.patchwire.app/v1/hooks/forgejo |
| GitHub | https://api.patchwire.app/v1/hooks/github |
| GitLab | https://api.patchwire.app/v1/hooks/gitlab |
| Bitbucket Cloud | https://api.patchwire.app/v1/hooks/bitbucket |
كل النقاط الأربع ترفض الطلبات التي لا يتطابق توقيع HMAC الخاص بها مع PATCHWIRE_WEBHOOK_SECRET للتثبيت.
الحصول على المفتاح المشترك
افتح صفحة أي مشروع ← بطاقة إعداد الـWebhook. كل تبويب مزوِّد يعرض:
- الرابط الكامل لِلَّصق
- المفتاح المشترك لِلَّصق
- الترويسة / مرشّح الأحداث الذي يجب ضبطه
انسخ مباشرةً من هناك. المفتاح يُدوَّر على جانب الخادم فقط؛ الواجهة تعرض دائماً القيمة الحالية.
الإعداد لكل مزوِّد
Forgejo
- المستودع ← Settings ← Webhooks ← Add webhook ← اختر Forgejo.
- URL:
https://api.patchwire.app/v1/hooks/forgejo. - HTTP method:
POST. - Content type:
application/json. - Secret: ألصق من بطاقة الإعداد.
- Trigger: اختر Push events (الافتراضي).
- Branch filter: اتركه فارغاً ليُطلَق على كل الفروع، أو حدِّد الفرع الافتراضي.
- احفظ. اضغط Test delivery — يجب أن ترى علامة خضراء واستجابة HTTP 200.
GitHub
- المستودع ← Settings ← Webhooks ← Add webhook.
- Payload URL:
https://api.patchwire.app/v1/hooks/github. - Content type:
application/json. - Secret: ألصق من بطاقة الإعداد.
- SSL verification: اتركه مُفعَّلاً (نقطتك تستخدم Let's Encrypt).
- Which events? اختر Just the push event.
- Active: ✅. احفظ.
- افتح الـwebhook الجديد ← Recent Deliveries ← Redeliver للاختبار.
GitLab
- المشروع ← Settings ← Webhooks ← Add new webhook.
- URL:
https://api.patchwire.app/v1/hooks/gitlab. - Secret token: ألصق من بطاقة الإعداد. ملاحظة: GitLab يرسل هذه القيمة في ترويسة
X-Gitlab-Tokenكما هي، وليس كـHMAC؛ يقارنها Patchwire مع المفتاح المضبوط بزمن ثابت. - Trigger: فعِّل Push events.
- احفظ.
- اضغط Test ← Push events.
Bitbucket Cloud
- المستودع ← Repository settings ← Webhooks ← Add webhook.
- Title: أي شيء (مثل "Patchwire").
- URL:
https://api.patchwire.app/v1/hooks/bitbucket. - Status: Active.
- Triggers: Repository push.
- احفظ. لا يملك Bitbucket زر اختبار مدمج — ادفع commit للتجربة.
توقيع Bitbucket Cloud
توقيع الـwebhook في Bitbucket Cloud يختلف عن GitHub/Forgejo. Patchwire يتحقّق من ترويسة X-Hub-Signature-256 فقط عند إرسالها — الحمولات الأقدم تعتمد على فحص نطاق IP المصدر. للإعدادات عالية الثقة، فضّل مسارات GitHub/GitLab/Forgejo.
كيف تُحَلّ المنظمة والمشروع
جسم الـwebhook يحمل full_name للمستودع (مثل acme/web). يُقسِّمه Patchwire على / للحصول على:
owner← يُحلّ كـslug المنظمةname← يُحلّ كـslug المشروع
إذا كانت منظمتك في Patchwire acme وسجَّلت مشروعاً بـslug web، فإن webhook المستودع acme/web يصل بشكل صحيح.
إذا فشل أي من الحلَّين، يعيد الـwebhook HTTP 200 مع "status":"ignored" — هذا متعمَّد. إعادة 4xx تجعل الـSCM يحاول إلى الأبد.
مراقبة إطلاق الـwebhook
سجلات الـAPI (عبر SSH):
ssh hostinger "sudo kubectl logs -n patchwire deploy/patchwire-api --tail=50 | grep -E 'cloning|scan complete|scan-bg'"سترى:
INFO cloning repo url=… branch=main target=/tmp/.tmpXXX
INFO running semgrep path=/tmp/.tmpXXX
INFO running gitleaks path=/tmp/.tmpXXX
INFO scan-bg: scan complete scan_id=… status=completed findings=2 raw_findings=3الزمن الإجمالي: نسخ (~10 ثوانٍ) + semgrep (~30) + gitleaks (~10) + كتابة قاعدة البيانات (~ثوانٍ قليلة) ≈ 50–60 ثانية من النهاية إلى النهاية.