Skip to content

Webhooks

يقبل Patchwire أحداث الدفع من أربعة مزودي SCM. ينطلق الفحص خلال نحو ثانية واحدة من الدفع وينتهي خلال أقل من دقيقة لمستودع نموذجي.

نمط الروابط

المزوِّدالرابط
Forgejohttps://api.patchwire.app/v1/hooks/forgejo
GitHubhttps://api.patchwire.app/v1/hooks/github
GitLabhttps://api.patchwire.app/v1/hooks/gitlab
Bitbucket Cloudhttps://api.patchwire.app/v1/hooks/bitbucket

كل النقاط الأربع ترفض الطلبات التي لا يتطابق توقيع HMAC الخاص بها مع PATCHWIRE_WEBHOOK_SECRET للتثبيت.

الحصول على المفتاح المشترك

افتح صفحة أي مشروع ← بطاقة إعداد الـWebhook. كل تبويب مزوِّد يعرض:

  • الرابط الكامل لِلَّصق
  • المفتاح المشترك لِلَّصق
  • الترويسة / مرشّح الأحداث الذي يجب ضبطه

انسخ مباشرةً من هناك. المفتاح يُدوَّر على جانب الخادم فقط؛ الواجهة تعرض دائماً القيمة الحالية.

الإعداد لكل مزوِّد

Forgejo

  1. المستودع ← SettingsWebhooksAdd webhook ← اختر Forgejo.
  2. URL: https://api.patchwire.app/v1/hooks/forgejo.
  3. HTTP method: POST.
  4. Content type: application/json.
  5. Secret: ألصق من بطاقة الإعداد.
  6. Trigger: اختر Push events (الافتراضي).
  7. Branch filter: اتركه فارغاً ليُطلَق على كل الفروع، أو حدِّد الفرع الافتراضي.
  8. احفظ. اضغط Test delivery — يجب أن ترى علامة خضراء واستجابة HTTP 200.

GitHub

  1. المستودع ← SettingsWebhooksAdd webhook.
  2. Payload URL: https://api.patchwire.app/v1/hooks/github.
  3. Content type: application/json.
  4. Secret: ألصق من بطاقة الإعداد.
  5. SSL verification: اتركه مُفعَّلاً (نقطتك تستخدم Let's Encrypt).
  6. Which events? اختر Just the push event.
  7. Active: ✅. احفظ.
  8. افتح الـwebhook الجديد ← Recent DeliveriesRedeliver للاختبار.

GitLab

  1. المشروع ← SettingsWebhooksAdd new webhook.
  2. URL: https://api.patchwire.app/v1/hooks/gitlab.
  3. Secret token: ألصق من بطاقة الإعداد. ملاحظة: GitLab يرسل هذه القيمة في ترويسة X-Gitlab-Token كما هي، وليس كـHMAC؛ يقارنها Patchwire مع المفتاح المضبوط بزمن ثابت.
  4. Trigger: فعِّل Push events.
  5. احفظ.
  6. اضغط TestPush events.

Bitbucket Cloud

  1. المستودع ← Repository settingsWebhooksAdd webhook.
  2. Title: أي شيء (مثل "Patchwire").
  3. URL: https://api.patchwire.app/v1/hooks/bitbucket.
  4. Status: Active.
  5. Triggers: Repository push.
  6. احفظ. لا يملك 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):

bash
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 ثانية من النهاية إلى النهاية.