Konektor GitHub
Hubungkan repositori GitHub Anda ke Brevo untuk melacak engagement developer, menjalankan alur notifikasi rilis, dan memantau aktivitas komunitas melalui Tajo.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | GitHub |
| Kategori | Kustom |
| Kompleksitas penyiapan | Menengah |
| Integrasi resmi | Tidak |
| Data yang disinkronkan | Events, Users, Repositories |
| Tipe API | REST API, GraphQL API |
| Autentikasi | GitHub App / Personal Access Token / OAuth 2.0 |
| Base URL | https://api.github.com |
| Versi API | 2022-11-28 (versioning berbasis header) |
Fitur
- Pelacakan issue dan PR - Sinkronkan event issue dan pull request ke linimasa contact Brevo
- Notifikasi rilis - Picu kampanye Brevo saat ada rilis repositori baru
- Sync kontributor - Petakan kontributor GitHub ke contacts Brevo untuk engagement komunitas
- Pelacakan star dan fork - Pantau metrik popularitas repositori
- Penerusan event webhook - Teruskan event GitHub ke otomatisasi Brevo
- Katalog repositori - Sinkronkan metadata repositori sebagai item katalog Brevo
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Akun GitHub dengan akses ke repositori yang dituju
- GitHub App atau Personal Access Token (fine-grained direkomendasikan)
- Akses admin ke repositori untuk mengonfigurasi webhook
- Akun Brevo dengan akses API
- Akun Tajo dengan langganan aktif
Autentikasi
GitHub mendukung beberapa metode autentikasi. Tajo merekomendasikan GitHub Apps untuk akses tingkat organisasi.
Opsi 1: GitHub App (direkomendasikan)
- Buka Settings > Developer settings > GitHub Apps
- Klik New GitHub App
- Konfigurasikan app dengan permission berikut:
Repository permissions: Issues: Read Pull requests: Read Contents: Read Metadata: Read
Organization permissions: Members: Read
Subscribe to events: Issues Pull request Push Release Star ForkOpsi 2: Fine-grained Personal Access Token
- Buka Settings > Developer settings > Personal access tokens > Fine-grained tokens
- Klik Generate new token
- Pilih repositori yang dituju
- Berikan permission berikut:
Repository access: Selected repositoriesPermissions: Issues: Read-only Pull requests: Read-only Contents: Read-only Metadata: Read-onlyKeamanan token
Token fine-grained memiliki tanggal kedaluwarsa. Siapkan rotasi token sebelum masa berlakunya habis. Token instalasi GitHub App diperbarui otomatis dan lebih disarankan untuk penggunaan produksi.
Menghubungkan ke 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_TOKENKonfigurasi
Penyiapan dasar
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: 21Pemetaan field
Petakan data pengguna GitHub ke atribut contact 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_BIOEndpoint API
Tajo terintegrasi dengan endpoint GitHub REST API berikut:
| Endpoint | Method | Tujuan |
|---|---|---|
/repos/{owner}/{repo}/issues | GET | Menampilkan issue repositori |
/repos/{owner}/{repo}/pulls | GET | Menampilkan pull request |
/repos/{owner}/{repo}/releases | GET | Menampilkan rilis |
/repos/{owner}/{repo}/contributors | GET | Menampilkan kontributor |
/repos/{owner}/{repo}/stargazers | GET | Menampilkan stargazer |
/repos/{owner}/{repo}/forks | GET | Menampilkan fork |
/repos/{owner}/{repo}/events | GET | Menampilkan event repositori |
/users/{username} | GET | Mengambil profil pengguna |
/orgs/{org}/members | GET | Menampilkan anggota organisasi |
/repos/{owner}/{repo}/hooks | POST | Membuat webhook |
Contoh kode
Inisialisasi konektor
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});Menyinkronkan kontributor ke 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// }Menangani event 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');});Memicu kampanye rilis
// 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 } });});Batas rate
GitHub menerapkan rate limit berdasarkan metode autentikasi:
| Autentikasi | Rate limit utama | Search API |
|---|---|---|
| Tanpa autentikasi | 60 request/jam | 10 request/menit |
| Personal Access Token | 5.000 request/jam | 30 request/menit |
| GitHub App (installation) | 5.000 request/jam | 30 request/menit |
| GitHub App (user-to-server) | 5.000 request/jam | 30 request/menit |
Request kondisional
Tajo menggunakan request kondisional (header If-None-Match / If-Modified-Since) untuk menekan konsumsi API. Respons dengan 304 Not Modified tidak dihitung terhadap rate limit.
Batas tambahan:
- Rate limit sekunder: Tidak lebih dari 100 request bersamaan. Tidak lebih dari 900 poin per menit untuk endpoint REST API.
- GraphQL: 5.000 poin per jam (biaya query bervariasi menurut kompleksitas).
Pemecahan masalah
Masalah umum
| Masalah | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | Token kedaluwarsa atau kredensial salah | Buat ulang token atau pasang ulang GitHub App |
| 403 Forbidden | Permission tidak mencukupi | Periksa scope token atau permission App |
| 404 Not Found | Repositori privat tanpa akses | Berikan akses repositori ke token atau App |
| Rate limit terlampaui | Terlalu banyak panggilan API | Aktifkan request kondisional dan kurangi frekuensi sync |
| Webhook tidak diterima | URL salah atau terhalang firewall | Pastikan URL webhook dapat diakses publik |
Mode debug
connectors: github: debug: true log_level: verbose log_webhooks: trueUji koneksi
tajo connectors test github# ✓ API authentication successful# ✓ Repository access verified# ✓ Issue data readable# ✓ Webhook delivery active# ✓ Rate limit healthy (4,850/5,000 remaining)Praktik terbaik
- Utamakan GitHub Apps dibanding PAT - GitHub Apps memberikan permission yang lebih granular dan token yang diperbarui otomatis
- Aktifkan secret webhook - Selalu verifikasi signature webhook dengan HMAC-SHA256
- Gunakan request kondisional - Manfaatkan ETag agar kuota rate limit tidak terbuang
- Paginasikan respons besar - GitHub mengembalikan maksimal 100 item per halaman; lakukan iterasi dengan header
Link - Sinkronkan saat aktivitas rendah - Jadwalkan sync penuh di luar jam pengembangan tersibuk
- Pantau header rate limit - Periksa
X-RateLimit-Remaininguntuk melakukan throttling secara proaktif
Keamanan
- Autentikasi GitHub App - JWT berbasis kunci RSA dengan token instalasi berumur pendek
- Signature webhook - Verifikasi signature HMAC-SHA256 pada semua payload webhook
- Token fine-grained - Dibatasi ke repositori dan permission tertentu
- HTTPS Only - Semua komunikasi API dienkripsi melalui TLS 1.2+
- Penyimpanan terenkripsi - Private key dan token dienkripsi saat disimpan di Tajo
- Masa berlaku token - Token fine-grained kedaluwarsa otomatis; siapkan peringatan rotasi