บทความทั้งหมด
อีเวนต์ของ repository ไหลเป็น webhook เข้าสู่แล็ปท็อปพัฒนาในเครื่อง
GitHubwebhook debugginglocal testingCI/CD

ทดสอบ webhook ของ GitHub ในเครื่อง: คู่มือฉบับเต็ม

การทดสอบ webhook ของ GitHub ในเครื่อง ให้คุณรับอีเวนต์ push, pull request, issue และ workflow บนเครื่องของคุณโดยไม่ต้องดีพลอยขึ้น staging รัน tunnel localhost ลงทะเบียน URL HTTPS ในตั้งค่า GitHub App หรือ repository ของคุณ แล้วดีบัก handler พร้อมการตรวจสอบลายเซ็นเต็มรูปแบบ

ทำไม webhook ของ GitHub ต้องมี endpoint สาธารณะ

GitHub ส่งอีเวนต์ webhook เป็นคำขอ HTTP POST ไปยัง URL ที่ตั้งค่าไว้ เครื่องในพื้นที่ของคุณที่ 127.0.0.1 เซิร์ฟเวอร์ของ GitHub เข้าถึงไม่ได้ tunnel localhost ให้ endpoint HTTPS สาธารณะที่ GitHub ต้องการ

GitHub Apps กับ webhook ของ repository

webhook ของ repository

ตั้งค่ารายตัวที่ Settings → Webhooks ดีสำหรับทดสอบ handler อีเวนต์ของ repo เดียวระหว่างพัฒนาฟีเจอร์

webhook ของ GitHub App

ตั้งค่าระดับแอปในตั้งค่า GitHub App จำเป็นเมื่อสร้างการเชื่อมต่อที่ให้บริการหลาย repository หรือ organization

การส่งทั้งสองแบบใช้การตรวจสอบลายเซ็น HMAC-SHA256 ผ่าน header X-Hub-Signature-256

ทีละขั้น: ทดสอบ webhook GitHub ในเครื่อง

  1. เริ่มแอปในเครื่องพร้อม endpoint webhook (เช่น /api/webhooks/github)
  2. รัน npx portpreview 3000 เพื่อรับ URL HTTPS สาธารณะ
  3. ใน GitHub เพิ่ม URL tunnel บวก path webhook เป็น payload URL
  4. ตั้ง content type เป็น application/json และเลือกอีเวนต์ที่จะรับ
  5. สร้าง webhook secret และเก็บใน environment variable ในเครื่อง
  6. ทริกเกอร์อีเวนต์ (push commit, เปิด PR, สร้าง issue) แล้วตรวจดูการส่ง
  7. ยืนยันว่า handler ตรวจสอบลายเซ็นและคืน 2xx ภายใน 10 วินาที

ตรวจสอบลายเซ็น webhook GitHub ในเครื่อง

GitHub เซ็นทุก payload ด้วย webhook secret ของคุณ handler ของคุณต้อง:

  • อ่าน body ดิบของคำขอก่อน parse JSON
  • คำนวณ HMAC-SHA256 ด้วย secret ของคุณ
  • เทียบกับ header X-Hub-Signature-256 ด้วยการเทียบเวลาคงที่

เครื่องมือ tunnel ที่รักษา header ดั้งเดิมให้คุณทดสอบเส้นทางตรวจสอบจริง อย่าข้ามการตรวจลายเซ็นระหว่างพัฒนาในเครื่อง

อีเวนต์ที่ควรทดสอบในเครื่อง

  • push — ลอจิกทริกเกอร์ CI, hook ป้องกัน branch, pipeline ดีพลอย
  • pull_request — อัตโนมัติรีวิว, บอตป้ายกำกับ, เช็ก merge
  • issues — ซิงก์ tracker issue, เวิร์กโฟลว์มอบหมาย
  • installation — วงจรชีวิตติดตั้ง/ถอนติดตั้ง GitHub App
  • workflow_run — อัตโนมัติหลัง CI และประมวลผล artifact

ดีบักการส่ง webhook GitHub ที่ล้มเหลว

GitHub ลองส่งซ้ำที่ล้มเหลวด้วย backoff แบบเอ็กซ์โพเนนเชียล ความล้มเหลวที่พบบ่อยในการทดสอบในเครื่อง:

  • handler timeout (GitHub คาดหวังคำตอบภายใน 10 วินาที)
  • ลายเซ็นไม่ตรงจากการ parse body ก่อนตรวจสอบ
  • เซสชัน tunnel หมดอายุระหว่าง GitHub ลองซ้ำ
  • ฟิลเตอร์อีเวนต์ผิด — handler รับอีเวนต์ที่ไม่ได้ประมวลผล

ใช้ การเล่นซ้ำ webhook เพื่อทดสอบการส่งที่ล้มเหลวซ้ำโดยไม่ต้อง push commit ใหม่

การทดสอบ webhook GitHub กับ smee.io

smee.io เป็น proxy webhook GitHub ยอดนิยมสำหรับการพัฒนาในเครื่อง ใช้ได้ดีกับการ forward พื้นฐาน แต่ขาดการตรวจสอบคำขอและการเล่นซ้ำในตัว PortPreview รวม tunneling กับการจับและเล่นซ้ำไว้ในเครื่องมือเดียว สำหรับคู่มือดีบัก webhook ที่กว้างกว่า ดู วิธีดีบัก webhook ในเครื่อง

เข้าร่วมรายชื่อรอของ PortPreview เพื่อทดสอบ webhook GitHub พร้อมการมองเห็นคำขอในตัว

คำถามที่พบบ่อย

ทดสอบ webhook ของ GitHub บน localhost อย่างไร?
เริ่ม tunnel localhost ด้วย PortPreview เพิ่ม URL HTTPS เป็น payload URL ของ webhook ในตั้งค่า repository หรือ App ของ GitHub แล้วทริกเกอร์อีเวนต์และตรวจดูการส่งแต่ละครั้ง
การตรวจสอบลายเซ็นของ GitHub ทำงานกับ tunnel ไหม?
ได้ PortPreview รักษา header X-Hub-Signature-256 และ body ดิบของคำขอ ดังนั้นการตรวจสอบ HMAC ทำงานเหมือนใน production
ถ้า handler ในเครื่องของฉันช้าเกินไปสำหรับ GitHub จะเกิดอะไรขึ้น?
GitHub คาดหวังคำตอบ 2xx ภายใน 10 วินาที ไม่งั้นจะทำเครื่องหมายว่าการส่งล้มเหลวและลองซ้ำ ใช้การประมวลผลแบบ async สำหรับงานยาวและคืน 202 ทันที