Conector de GitHub
Conecta tus repositorios de GitHub con Brevo para hacer seguimiento de la interacción de desarrolladores, automatizar flujos de notificación de releases y monitorizar la actividad de la comunidad a través de Tajo.
Resumen
| Propiedad | Valor |
|---|---|
| Plataforma | GitHub |
| Categoría | Personalizada |
| Complejidad de configuración | Moderada |
| Integración oficial | No |
| Datos sincronizados | Eventos, Usuarios, Repositorios |
| Tipo de API | REST API, GraphQL API |
| Autenticación | GitHub App / Personal Access Token / OAuth 2.0 |
| URL base | https://api.github.com |
| Versión de la API | 2022-11-28 (versionado por cabecera) |
Funcionalidades
- Seguimiento de issues y PR - Sincroniza eventos de issues y pull requests con las cronologías de contacto de Brevo
- Notificaciones de releases - Dispara campañas de Brevo al publicar nuevas versiones de los repositorios
- Sincronización de colaboradores - Asocia colaboradores de GitHub con contactos de Brevo para el engagement de la comunidad
- Seguimiento de stars y forks - Monitoriza métricas de popularidad del repositorio
- Reenvío de eventos de webhook - Reenvía los eventos de GitHub a las automatizaciones de Brevo
- Catálogo de repositorios - Sincroniza los metadatos del repositorio como elementos del catálogo de Brevo
Requisitos previos
Antes de empezar, asegúrate de tener:
- Una cuenta de GitHub con acceso a los repositorios objetivo
- Una GitHub App o un Personal Access Token (fine-grained recomendado)
- Acceso de administrador a los repositorios para configurar los webhooks
- Una cuenta de Brevo con acceso a la API
- Una cuenta de Tajo con suscripción activa
Autenticación
GitHub admite varios métodos de autenticación. Tajo recomienda usar GitHub Apps para accesos a nivel de organización.
Opción 1: GitHub App (recomendada)
- Ve a Settings > Developer settings > GitHub Apps
- Haz clic en New GitHub App
- Configura la app con estos permisos:
Repository permissions: Issues: Read Pull requests: Read Contents: Read Metadata: Read
Organization permissions: Members: Read
Subscribe to events: Issues Pull request Push Release Star ForkOpción 2: Personal Access Token fine-grained
- Ve a Settings > Developer settings > Personal access tokens > Fine-grained tokens
- Haz clic en Generate new token
- Selecciona los repositorios objetivo
- Concede estos permisos:
Repository access: Selected repositoriesPermissions: Issues: Read-only Pull requests: Read-only Contents: Read-only Metadata: Read-onlySeguridad de los tokens
Los tokens fine-grained tienen fecha de expiración. Configura la rotación antes de que expiren. Los tokens de instalación de GitHub App se refrescan automáticamente y son preferibles para producción.
Conectar con 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_TOKENConfiguración
Configuración básica
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: 21Asignación de campos
Asocia los datos de usuario de GitHub con los atributos de contacto de 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_BIOEndpoints de la API
Tajo se integra con los siguientes endpoints de la REST API de GitHub:
| Endpoint | Método | Propósito |
|---|---|---|
/repos/{owner}/{repo}/issues | GET | Listar issues del repositorio |
/repos/{owner}/{repo}/pulls | GET | Listar pull requests |
/repos/{owner}/{repo}/releases | GET | Listar releases |
/repos/{owner}/{repo}/contributors | GET | Listar colaboradores |
/repos/{owner}/{repo}/stargazers | GET | Listar stargazers |
/repos/{owner}/{repo}/forks | GET | Listar forks |
/repos/{owner}/{repo}/events | GET | Listar eventos del repositorio |
/users/{username} | GET | Obtener perfil de usuario |
/orgs/{org}/members | GET | Listar miembros de la organización |
/repos/{owner}/{repo}/hooks | POST | Crear webhook |
Ejemplos de código
Inicializar el conector
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});Sincronizar colaboradores con 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// }Gestionar eventos de 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');});Disparar una campaña de 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 } });});Límites de velocidad
GitHub aplica límites de velocidad según el método de autenticación:
| Autenticación | Límite de velocidad principal | Search API |
|---|---|---|
| Sin autenticar | 60 peticiones/hora | 10 peticiones/minuto |
| Personal Access Token | 5.000 peticiones/hora | 30 peticiones/minuto |
| GitHub App (instalación) | 5.000 peticiones/hora | 30 peticiones/minuto |
| GitHub App (user-to-server) | 5.000 peticiones/hora | 30 peticiones/minuto |
Peticiones condicionales
Tajo usa peticiones condicionales (cabeceras If-None-Match / If-Modified-Since) para reducir el consumo de la API. Las respuestas 304 Not Modified no cuentan para los límites de velocidad.
Límites adicionales:
- Límites de velocidad secundarios: No más de 100 peticiones concurrentes. No más de 900 puntos por minuto para los endpoints de la REST API.
- GraphQL: 5.000 puntos por hora (el coste de la consulta varía según la complejidad).
Resolución de problemas
Problemas habituales
| Problema | Causa | Solución |
|---|---|---|
| 401 Unauthorized | Token expirado o credenciales incorrectas | Regenera el token o reinstala la GitHub App |
| 403 Forbidden | Permisos insuficientes | Revisa los scopes del token o los permisos de la App |
| 404 Not Found | Repositorio privado sin acceso | Concede acceso al repositorio al token o App |
| Límite de velocidad superado | Demasiadas llamadas a la API | Activa las peticiones condicionales y reduce la frecuencia de sincronización |
| Los webhooks no se reciben | URL incorrecta o firewall | Verifica que la URL del webhook sea accesible públicamente |
Modo depuración
connectors: github: debug: true log_level: verbose log_webhooks: trueProbar la conexión
tajo connectors test github# ✓ API authentication successful# ✓ Repository access verified# ✓ Issue data readable# ✓ Webhook delivery active# ✓ Rate limit healthy (4,850/5,000 remaining)Buenas prácticas
- Usa GitHub Apps en lugar de PATs - Las GitHub Apps ofrecen permisos granulares y tokens con refresh automático
- Activa los secretos de webhook - Verifica siempre las firmas de webhook con HMAC-SHA256
- Usa peticiones condicionales - Aprovecha los ETags para no malgastar la cuota de límite
- Pagina las respuestas grandes - GitHub devuelve un máx. de 100 elementos por página; itera con las cabeceras
Link - Sincroniza en momentos de baja actividad - Programa las sincronizaciones completas fuera de las horas punta de desarrollo
- Monitoriza las cabeceras de límite - Revisa
X-RateLimit-Remainingpara aplicar throttle de forma proactiva
Seguridad
- Autenticación con GitHub App - JWT basado en clave RSA con tokens de instalación de corta duración
- Firmas de webhook - Verificación HMAC-SHA256 en todos los payloads de webhook
- Tokens fine-grained - Limitados a repositorios y permisos específicos
- Solo HTTPS - Toda la comunicación con la API se cifra vía TLS 1.2+
- Almacenamiento cifrado - Claves privadas y tokens cifrados en reposo en Tajo
- Expiración de tokens - Los tokens fine-grained expiran automáticamente; configura alertas de rotación