---
title: "Konektor GitHub"
description: "Panduan integrasi GitHub lengkap untuk menyinkronkan event repositori, issue, pull request, dan aktivitas developer dengan Brevo melalui Tajo."
url: https://tajo.io/in/docs/connectors/custom/github/
markdown: https://tajo.io/in/docs/connectors/custom/github.md
lang: id-ID
robots: noindex
---

Ajukan akses awal

Masukkan nama depan dan alamat email kerja Anda. Kami akan mengirim tautan untuk mengonfirmasi permintaan akses Tajo.

# Konektor GitHub

Status konektor: Direncanakan Belum dibangun. Tajo belum menjalankan konektor ini.

| Field sumber | Field tujuan | Nilai contoh |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

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:

1. Akun GitHub dengan akses ke repositori yang dituju
2. GitHub App atau Personal Access Token (fine-grained direkomendasikan)
3. Akses admin ke repositori untuk mengonfigurasi webhook
4. Akun Brevo dengan akses API
5. Akun Tajo dengan langganan aktif

## Autentikasi

GitHub mendukung beberapa metode autentikasi. Tajo merekomendasikan GitHub Apps untuk akses tingkat organisasi.

### Opsi 1: GitHub App (direkomendasikan)

1. Buka **Settings** > **Developer settings** > **GitHub Apps**
2. Klik **New GitHub App**
3. 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
  Fork
```

### Opsi 2: Fine-grained Personal Access Token

1. Buka **Settings** > **Developer settings** > **Personal access tokens** > **Fine-grained tokens**
2. Klik **Generate new token**
3. Pilih repositori yang dituju
4. Berikan permission berikut:

```
Repository access: Selected repositories
Permissions:
  Issues: Read-only
  Pull requests: Read-only
  Contents: Read-only
  Metadata: Read-only
```

Keamanan 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

```bash
# Using GitHub App
tajo connectors install github \
  --app-id $GITHUB_APP_ID \
  --private-key-path ./github-app-key.pem \
  --installation-id $GITHUB_INSTALLATION_ID

# Using Personal Access Token
tajo connectors install github \
  --token $GITHUB_TOKEN
```

## Konfigurasi

### Penyiapan dasar

```yaml
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
```

### Pemetaan field

Petakan data pengguna GitHub ke atribut contact Brevo:

```yaml
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_BIO
```

## Endpoint 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

```javascript
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

```javascript
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

```javascript
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

```javascript
// Listen for new releases and trigger Brevo campaign
tajo.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

```yaml
connectors:
  github:
    debug: true
    log_level: verbose
    log_webhooks: true
```

### Uji koneksi

```bash
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

1. **Utamakan GitHub Apps dibanding PAT** - GitHub Apps memberikan permission yang lebih granular dan token yang diperbarui otomatis
2. **Aktifkan secret webhook** - Selalu verifikasi signature webhook dengan HMAC-SHA256
3. **Gunakan request kondisional** - Manfaatkan ETag agar kuota rate limit tidak terbuang
4. **Paginasikan respons besar** - GitHub mengembalikan maksimal 100 item per halaman; lakukan iterasi dengan header `Link`
5. **Sinkronkan saat aktivitas rendah** - Jadwalkan sync penuh di luar jam pengembangan tersibuk
6. **Pantau header rate limit** - Periksa `X-RateLimit-Remaining` untuk 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

## Sumber daya terkait

- [Konektor Jira](https://tajo.io/in/docs/connectors/custom/jira)
- [Konektor Linear](https://tajo.io/in/docs/connectors/custom/linear)
- [Konektor Notion](https://tajo.io/in/docs/connectors/custom/notion)
- [Brevo Contacts API](https://tajo.io/in/docs/contact-management)
