Коннектор GitHub
Подключите ваши репозитории GitHub к Brevo для отслеживания вовлечённости разработчиков, workflow уведомлений о релизах и мониторинга активности сообщества через Tajo.
Обзор
| Свойство | Значение |
|---|---|
| Платформа | GitHub |
| Категория | Custom |
| Сложность настройки | Умеренная |
| Официальная интеграция | Нет |
| Синхронизируемые данные | События, пользователи, репозитории |
| Тип API | REST API, GraphQL API |
| Аутентификация | GitHub App / Personal Access Token / OAuth 2.0 |
| Базовый URL | https://api.github.com |
| Версия API | 2022-11-28 (версионирование на уровне заголовков) |
Возможности
- Отслеживание issue и PR, синхронизируйте события issue и pull request в таймлайны контактов Brevo
- Уведомления о релизах, запускайте кампании Brevo при новых релизах репозитория
- Синхронизация контрибьюторов, сопоставляйте контрибьюторов GitHub с контактами Brevo для вовлечения сообщества
- Отслеживание star и fork, отслеживайте метрики популярности репозитория
- Пересылка событий вебхуков, пересылайте события GitHub в автоматизации Brevo
- Каталог репозиториев, синхронизируйте метаданные репозиториев как элементы каталога Brevo
Предварительные требования
Прежде чем начать, убедитесь, что у вас есть:
- Аккаунт GitHub с доступом к целевым репозиториям
- GitHub App или Personal Access Token (рекомендуется fine-grained)
- Права администратора репозиториев для настройки вебхуков
- Аккаунт Brevo с доступом к API
- Аккаунт Tajo с активной подпиской
Аутентификация
GitHub поддерживает несколько методов аутентификации. Tajo рекомендует использовать GitHub Apps для доступа на уровне организации.
Вариант 1: GitHub App (рекомендуется)
- Перейдите в Settings > Developer settings > GitHub Apps
- Нажмите New GitHub 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
- Выберите целевые репозитории
- Предоставьте эти разрешения:
Repository access: Selected repositoriesPermissions: Issues: Read-only Pull requests: Read-only Contents: Read-only Metadata: Read-onlyБезопасность токенов
Fine-grained токены имеют срок действия. Настройте ротацию токенов до истечения срока. Installation-токены GitHub App автоматически обновляются и предпочтительнее для продакшена.
Подключение к 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_BIOЭндпоинты API
Tajo интегрируется со следующими эндпоинтами GitHub REST API:
| Эндпоинт | Метод | Назначение |
|---|---|---|
/repos/{owner}/{repo}/issues | GET | Список issues репозитория |
/repos/{owner}/{repo}/pulls | GET | Список pull request |
/repos/{owner}/{repo}/releases | GET | Список релизов |
/repos/{owner}/{repo}/contributors | GET | Список контрибьюторов |
/repos/{owner}/{repo}/stargazers | GET | Список stargazer |
/repos/{owner}/{repo}/forks | GET | Список форков |
/repos/{owner}/{repo}/events | GET | Список событий репозитория |
/users/{username} | GET | Получить профиль пользователя |
/orgs/{org}/members | GET | Список участников организации |
/repos/{owner}/{repo}/hooks | POST | Создать вебхук |
Примеры кода
Инициализация коннектора
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// }Обработка событий вебхуков
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');});Запуск кампании релиза
// 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 запросов/мин |
Условные запросы
Tajo использует условные запросы (заголовки If-None-Match / If-Modified-Since) для снижения потребления API. Ответы с 304 Not Modified не учитываются в лимитах.
Дополнительные ограничения:
- Вторичные лимиты: не более 100 параллельных запросов. Не более 900 очков в минуту для эндпоинтов REST API.
- GraphQL: 5 000 очков в час (стоимость запроса зависит от сложности).
Устранение неполадок
Частые проблемы
| Проблема | Причина | Решение |
|---|---|---|
| 401 Unauthorized | Истёкший токен или неверные учётные данные | Перегенерируйте токен или переустановите GitHub App |
| 403 Forbidden | Недостаточные разрешения | Проверьте scope токена или разрешения App |
| 404 Not Found | Приватный репозиторий без доступа | Предоставьте доступ к репозиторию токену или App |
| Превышен лимит запросов | Слишком много API-вызовов | Включите условные запросы и уменьшите частоту синхронизации |
| Вебхуки не приходят | Неверный URL или файрвол | Проверьте, что URL вебхука публично доступен |
Режим отладки
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 вместо PAT, GitHub Apps предоставляют детальные разрешения и автоматически обновляющиеся токены
- Включайте секреты вебхуков, всегда проверяйте подписи вебхуков с HMAC-SHA256
- Используйте условные запросы, используйте ETag, чтобы не тратить квоту лимитов
- Пагинируйте большие ответы, GitHub возвращает максимум 100 элементов на страницу; итерируйте с заголовками
Link - Синхронизируйте в период низкой активности, планируйте полные синхронизации вне пиковых часов разработки
- Отслеживайте заголовки лимитов, проверяйте
X-RateLimit-Remaining, чтобы проактивно ограничивать нагрузку
Безопасность
- Аутентификация GitHub App, JWT на основе RSA-ключей с короткоживущими installation-токенами
- Подписи вебхуков, проверка HMAC-SHA256 для всех payload вебхуков
- Fine-grained токены, ограничены конкретными репозиториями и разрешениями
- Только HTTPS, все API-коммуникации зашифрованы через TLS 1.2+
- Зашифрованное хранилище, приватные ключи и токены зашифрованы в покое в Tajo
- Истечение токенов, fine-grained токены автоматически истекают; настройте уведомления о ротации