GitHub Connector
เชื่อมต่อ GitHub repositories กับ Brevo สำหรับการติดตามการมีส่วนร่วมของนักพัฒนา เวิร์กโฟลว์การแจ้งเตือน release และการตรวจสอบกิจกรรมชุมชนผ่าน Tajo
ภาพรวม
| คุณสมบัติ | ค่า |
|---|---|
| แพลตฟอร์ม | GitHub |
| หมวดหมู่ | แบบกำหนดเอง |
| ความซับซ้อนในการตั้งค่า | ปานกลาง |
| การผสานรวมอย่างเป็นทางการ | ไม่ |
| ข้อมูลที่ซิงค์ | เหตุการณ์ ผู้ใช้ Repositories |
| ประเภท API | REST API, GraphQL API |
| การยืนยันตัวตน | GitHub App / Personal Access Token / OAuth 2.0 |
| Base URL | https://api.github.com |
| เวอร์ชัน API | 2022-11-28 (header-based versioning) |
ฟีเจอร์
- การติดตามปัญหาและ PR - ซิงค์เหตุการณ์ปัญหาและ pull request กับไทม์ไลน์ผู้ติดต่อ Brevo
- การแจ้งเตือน Release - ทริกเกอร์แคมเปญ Brevo เมื่อมี repository release ใหม่
- การซิงค์ผู้ร่วมพัฒนา - แมปผู้ร่วมพัฒนา GitHub กับผู้ติดต่อ Brevo สำหรับการมีส่วนร่วมของชุมชน
- การติดตาม Star และ Fork - ตรวจสอบตัวชี้วัดความนิยมของ repository
- การส่งต่อเหตุการณ์ Webhook - ส่งต่อเหตุการณ์ GitHub ไปยังระบบอัตโนมัติ Brevo
- Repository catalog - ซิงค์ metadata ของ repository เป็นรายการ catalog ของ Brevo
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าคุณมี:
- บัญชี GitHub ที่มีสิทธิ์เข้าถึง repositories เป้าหมาย
- GitHub App หรือ Personal Access Token (แนะนำแบบ fine-grained)
- สิทธิ์ผู้ดูแลระบบสำหรับ repositories สำหรับการกำหนดค่า webhook
- บัญชี Brevo ที่มีสิทธิ์เข้าถึง API
- บัญชี Tajo ที่มีการสมัครสมาชิกที่ใช้งานอยู่
การยืนยันตัวตน
GitHub รองรับวิธีการยืนยันตัวตนหลายแบบ Tajo แนะนำให้ใช้ GitHub Apps สำหรับการเข้าถึงระดับองค์กร
ตัวเลือกที่ 1: GitHub App (แนะนำ)
- ไปที่ Settings > Developer settings > GitHub Apps
- คลิก New GitHub App
- กำหนดค่า app ด้วยสิทธิ์เหล่านี้:
Repository permissions: Issues: Read Pull requests: Read Contents: Read Metadata: Read
Organization permissions: Members: Read
Subscribe to events: Issues Pull request Push Release Star Forkตัวเลือกที่ 2: Fine-Grained Personal Access Token
- ไปที่ Settings > Developer settings > Personal access tokens > Fine-grained tokens
- คลิก Generate new token
- เลือก repositories เป้าหมาย
- ให้สิทธิ์เหล่านี้:
Repository access: Selected repositoriesPermissions: Issues: Read-only Pull requests: Read-only Contents: Read-only Metadata: Read-onlyความปลอดภัย Token
Fine-grained tokens มีวันหมดอายุ ตั้งค่าการหมุนเวียน token ก่อนหมดอายุ GitHub App installation tokens รีเฟรชโดยอัตโนมัติและเป็นที่นิยมสำหรับการใช้งานจริง
เชื่อมต่อกับ Tajo
# Using GitHub Apptajo connectors install github \ --app-id $GITHUB_APP_ID \ --private-key-path ./github-app-key.pem \ --installation-id $GITHUB_INSTALLATION_ID
# Using Personal Access Tokentajo connectors install github \ --token $GITHUB_TOKENการกำหนดค่า
การตั้งค่าพื้นฐาน
connectors: github: enabled: true auth_type: "github_app" # or "token"
repositories: - owner/repo-1 - owner/repo-2
sync: issues: true pull_requests: true releases: true contributors: true stars: true
lists: contributors: 20 stargazers: 21การแมปฟิลด์
แมปข้อมูลผู้ใช้ GitHub กับแอตทริบิวต์ผู้ติดต่อ Brevo:
field_mapping: # Standard fields login: GITHUB_USERNAME email: email name: FIRSTNAME
# Developer metrics contributions: GITHUB_CONTRIBUTIONS repositories_count: GITHUB_REPOS followers: GITHUB_FOLLOWERS created_at: GITHUB_JOINED
# Custom attributes company: COMPANY location: LOCATION bio: GITHUB_BIOAPI Endpoints
Tajo ผสานรวมกับ GitHub REST API endpoints ต่อไปนี้:
| Endpoint | เมธอด | จุดประสงค์ |
|---|---|---|
/repos/{owner}/{repo}/issues | GET | แสดงรายการปัญหาของ repository |
/repos/{owner}/{repo}/pulls | GET | แสดงรายการ pull requests |
/repos/{owner}/{repo}/releases | GET | แสดงรายการ releases |
/repos/{owner}/{repo}/contributors | GET | แสดงรายการผู้ร่วมพัฒนา |
/repos/{owner}/{repo}/stargazers | GET | แสดงรายการผู้ติดดาว |
/repos/{owner}/{repo}/forks | GET | แสดงรายการ forks |
/repos/{owner}/{repo}/events | GET | แสดงรายการเหตุการณ์ repository |
/users/{username} | GET | ดูโปรไฟล์ผู้ใช้ |
/orgs/{org}/members | GET | แสดงรายการสมาชิกองค์กร |
/repos/{owner}/{repo}/hooks | POST | สร้าง webhook |
ตัวอย่างโค้ด
เริ่มต้น Connector
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('github', { appId: process.env.GITHUB_APP_ID, privateKey: process.env.GITHUB_PRIVATE_KEY, installationId: process.env.GITHUB_INSTALLATION_ID});ซิงค์ผู้ร่วมพัฒนากับ Brevo
await tajo.connectors.sync('github', { type: 'full', resources: ['contributors'], repositories: ['owner/repo-1', 'owner/repo-2']});
const status = await tajo.connectors.status('github');console.log(status);// {// connected: true,// lastSync: '2024-03-15T11:00:00Z',// contributorsCount: 245,// issuesTracked: 1890,// releasesTracked: 34// }จัดการเหตุการณ์ Webhook
app.post('/webhooks/github', async (req, res) => { const signature = req.get('X-Hub-Signature-256'); const event = req.get('X-GitHub-Event');
// Verify webhook signature if (!verifyGitHubSignature(req.body, signature)) { return res.status(401).send('Unauthorized'); }
await tajo.connectors.handleWebhook('github', { event, payload: req.body });
res.status(200).send('OK');});ทริกเกอร์แคมเปญ Release
// Listen for new releases and trigger Brevo campaigntajo.connectors.on('github', 'release.published', async (event) => { await tajo.campaigns.trigger('release-announcement', { listId: 21, params: { version: event.release.tag_name, release_notes: event.release.body, download_url: event.release.html_url } });});ขีดจำกัดอัตรา
GitHub ใช้ขีดจำกัดอัตราตามวิธีการยืนยันตัวตน:
| การยืนยันตัวตน | ขีดจำกัดอัตราหลัก | Search API |
|---|---|---|
| ไม่ยืนยันตัวตน | 60 คำขอ/ชั่วโมง | 10 คำขอ/นาที |
| Personal Access Token | 5,000 คำขอ/ชั่วโมง | 30 คำขอ/นาที |
| GitHub App (installation) | 5,000 คำขอ/ชั่วโมง | 30 คำขอ/นาที |
| GitHub App (user-to-server) | 5,000 คำขอ/ชั่วโมง | 30 คำขอ/นาที |
Conditional Requests
Tajo ใช้ conditional requests (headers If-None-Match / If-Modified-Since) เพื่อลดการใช้ API การตอบสนองที่มี 304 Not Modified ไม่นับต่อขีดจำกัดอัตรา
ขีดจำกัดเพิ่มเติม:
- ขีดจำกัดอัตราทุติยภูมิ: ไม่เกิน 100 คำขอพร้อมกัน ไม่เกิน 900 points ต่อนาทีสำหรับ REST API endpoints
- GraphQL: 5,000 points ต่อชั่วโมง (ต้นทุน query แตกต่างกันตามความซับซ้อน)
การแก้ไขปัญหา
ปัญหาทั่วไป
| ปัญหา | สาเหตุ | วิธีแก้ |
|---|---|---|
| 401 Unauthorized | Token หมดอายุหรือข้อมูลรับรองไม่ถูกต้อง | สร้าง token ใหม่หรือติดตั้ง GitHub App ใหม่ |
| 403 Forbidden | สิทธิ์ไม่เพียงพอ | ตรวจสอบ scope ของ token หรือสิทธิ์ App |
| 404 Not Found | repo ส่วนตัวไม่มีสิทธิ์เข้าถึง | ให้สิทธิ์เข้าถึง repository กับ token หรือ App |
| เกินขีดจำกัดอัตรา | การเรียก API มากเกินไป | เปิดใช้ conditional requests และลดความถี่การซิงค์ |
| ไม่ได้รับ Webhooks | URL ไม่ถูกต้องหรือไฟร์วอลล์ | ตรวจสอบว่า URL webhook เข้าถึงได้สาธารณะ |
โหมด Debug
connectors: github: debug: true log_level: verbose log_webhooks: trueทดสอบการเชื่อมต่อ
tajo connectors test github# ✓ API authentication successful# ✓ Repository access verified# ✓ Issue data readable# ✓ Webhook delivery active# ✓ Rate limit healthy (4,850/5,000 remaining)แนวทางปฏิบัติที่ดีที่สุด
- ใช้ GitHub Apps แทน PATs - GitHub Apps ให้สิทธิ์แบบละเอียดและ tokens ที่รีเฟรชอัตโนมัติ
- เปิดใช้ webhook secrets - ตรวจสอบลายเซ็น webhook เสมอด้วย HMAC-SHA256
- ใช้ conditional requests - ใช้ ETags เพื่อหลีกเลี่ยงการสิ้นเปลือง quota ขีดจำกัดอัตรา
- Paginate การตอบสนองขนาดใหญ่ - GitHub ส่งคืนสูงสุด 100 รายการต่อหน้า วนซ้ำด้วย
Linkheaders - ซิงค์ระหว่างกิจกรรมน้อย - กำหนดการซิงค์แบบเต็มนอกชั่วโมงการพัฒนาสูงสุด
- ตรวจสอบ headers ขีดจำกัดอัตรา - ตรวจสอบ
X-RateLimit-Remainingเพื่อลดความเร็วเชิงรุก
ความปลอดภัย
- การยืนยันตัวตน GitHub App - JWT ตาม RSA key พร้อม installation tokens อายุสั้น
- ลายเซ็น Webhook - การตรวจสอบลายเซ็น HMAC-SHA256 บน webhook payloads ทั้งหมด
- Fine-Grained Tokens - กำหนดขอบเขตกับ repositories และสิทธิ์เฉพาะ
- HTTPS เท่านั้น - การสื่อสาร API ทั้งหมดเข้ารหัสผ่าน TLS 1.2+
- การจัดเก็บที่เข้ารหัส - Private keys และ tokens เข้ารหัสที่เก็บใน Tajo
- การหมดอายุ Token - Fine-grained tokens หมดอายุโดยอัตโนมัติ ตั้งค่าการแจ้งเตือนการหมุนเวียน