Коннектор Linear
Подключите ваш рабочий проект Linear к Brevo для отслеживания задач, ориентированных на клиентов, уведомлений об обновлениях продукта и кампаний по вехам разработки через Tajo.
Обзор
| Свойство | Значение |
|---|---|
| Платформа | Linear |
| Категория | Custom |
| Сложность настройки | Простая |
| Официальная интеграция | Нет |
| Синхронизируемые данные | Задачи, проекты, пользователи, события |
| Тип API | GraphQL API |
| Аутентификация | OAuth 2.0 / Personal API Key |
| Базовый URL | https://api.linear.app/graphql |
Возможности
- Синхронизация событий задач, пересылка событий создания, обновления и завершения задач в хронологию контактов Brevo
- Отслеживание вех проекта, запуск кампаний Brevo при достижении ключевых вех проекта
- Привязка задач к клиентам, связывание задач Linear с контактами Brevo для видимости поддержки
- Сегментация по меткам, сопоставление меток Linear с атрибутами контактов Brevo
- Аналитика циклов, синхронизация данных о завершении спринтов/циклов для отчётности о производительности команды
- Автоматизация на основе вебхуков, пересылка событий в real-time через вебхуки Linear
Предварительные требования
Прежде чем начать, убедитесь, что у вас есть:
- Рабочий проект Linear с правами администратора
- Personal API key или настроенное OAuth-приложение
- Аккаунт Brevo с доступом к API
- Аккаунт Tajo с активной подпиской
Аутентификация
Linear поддерживает Personal API keys и OAuth 2.0.
Вариант 1: Personal API Key
- Перейдите в Linear > Settings > API > Personal API keys
- Нажмите Create key
- Назовите ключ “Tajo Integration”
- Скопируйте сгенерированный ключ (начинается с
lin_api_)
curl -X POST https://api.linear.app/graphql \ -H "Authorization: $LINEAR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"query": "{ viewer { id name email } }"}'Вариант 2: OAuth 2.0
Для интеграций, обслуживающих несколько рабочих проектов:
- Создайте OAuth-приложение на linear.app/settings/api/applications
- Укажите redirect URI:
https://app.tajo.io/callbacks/linear - Запросите scope:
read,write,issues:create,comments:create
GraphQL API
Linear использует исключительно GraphQL API. Все запросы и мутации проходят через единственный эндпоинт: https://api.linear.app/graphql. Tajo автоматически строит все GraphQL-запросы.
Подключение к Tajo
# Используя Personal API Keytajo connectors install linear \ --api-key $LINEAR_API_KEY
# Используя OAuthtajo connectors install linear \ --client-id $LINEAR_CLIENT_ID \ --client-secret $LINEAR_CLIENT_SECRETКонфигурация
Базовая настройка
connectors: linear: enabled: true
sync: issues: true projects: true cycles: true users: true
teams: - key: "ENG" sync_to_list: 38 - key: "SUPPORT" sync_to_list: 39
issue_states: - Backlog - Todo - "In Progress" - Done - CanceledСопоставление полей
Сопоставьте данные пользователей и задач Linear с атрибутами Brevo:
field_mapping: # User fields id: LINEAR_USER_ID email: email name: FIRSTNAME
# Issue metrics mapped to contact events last_issue_identifier: LAST_LINEAR_ISSUE last_issue_state: LAST_ISSUE_STATUS last_issue_priority: LAST_ISSUE_PRIORITY total_issues: LINEAR_ISSUE_COUNT
# Project data current_project: ACTIVE_PROJECT team_key: LINEAR_TEAMСопоставление событий
event_mapping: Issue.create: ISSUE_CREATED Issue.update: ISSUE_UPDATED Issue.remove: ISSUE_DELETED Comment.create: COMMENT_ADDED Project.update: PROJECT_UPDATED Cycle.update: CYCLE_UPDATEDЭндпоинты API
Linear использует единственный GraphQL-эндпоинт. Ключевые запросы и мутации, используемые Tajo:
| Операция | Тип | Назначение |
|---|---|---|
issues | Query | Список и фильтрация задач |
issue | Query | Получить задачу по ID |
projects | Query | Список всех проектов |
cycles | Query | Список циклов (спринтов) |
teams | Query | Список команд рабочего проекта |
users | Query | Список участников рабочего проекта |
viewer | Query | Получить данные аутентифицированного пользователя |
issueCreate | Mutation | Создать новую задачу |
issueUpdate | Mutation | Обновить существующую задачу |
commentCreate | Mutation | Добавить комментарий к задаче |
webhookCreate | Mutation | Зарегистрировать вебхук |
Пример GraphQL-запроса
query GetIssues($filter: IssueFilter, $first: Int, $after: String) { issues(filter: $filter, first: $first, after: $after) { nodes { id identifier title state { name } priority assignee { email name } labels { nodes { name } } createdAt updatedAt } pageInfo { hasNextPage endCursor } }}Примеры кода
Инициализация коннектора
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('linear', { apiKey: process.env.LINEAR_API_KEY});Синхронизация задач
await tajo.connectors.sync('linear', { type: 'incremental', resources: ['issues'], teams: ['ENG', 'SUPPORT'], since: '2024-01-01'});
const status = await tajo.connectors.status('linear');console.log(status);// {// connected: true,// lastSync: '2024-03-15T18:00:00Z',// issuesTracked: 3200,// projectsMonitored: 8,// usersLinked: 45// }Обработка вебхуков Linear
app.post('/webhooks/linear', async (req, res) => { const event = req.body;
// Проверка подписи вебхука const signature = req.get('Linear-Signature'); if (!verifyLinearSignature(req.body, signature)) { return res.status(401).send('Unauthorized'); }
await tajo.connectors.handleWebhook('linear', { type: event.type, action: event.action, payload: { issueId: event.data?.id, identifier: event.data?.identifier, title: event.data?.title, state: event.data?.state?.name, assigneeEmail: event.data?.assignee?.email } });
res.status(200).send('OK');});Создание задачи из события Brevo
// Создание задачи Linear при отправке запроса контактом Brevotajo.events.on('contact.event', async (event) => { if (event.name === 'FEATURE_REQUEST') { await tajo.connectors.create('linear', { teamId: 'ENG', title: `Feature Request: ${event.data.subject}`, description: event.data.description, priority: 3, labelIds: ['feature-request'] }); }});Ограничения скорости
Linear применяет ограничения к своему GraphQL API:
| Тип лимита | Значение |
|---|---|
| Частота запросов | 1 500 запросов в час на API key |
| Сложность запроса | 10 000 очков сложности на запрос |
| Пагинация | Максимум 250 узлов на страницу (по умолчанию 50) |
| Вебхуки | Неограниченное количество входящих событий |
Бюджет сложности
Linear использует систему ограничения скорости на основе сложности. Простые запросы стоят меньше очков. Tajo оптимизирует запросы для минимизации сложности, запрашивая только нужные поля и используя эффективную пагинацию.
Linear возвращает 429 Too Many Requests с заголовком Retry-After при превышении лимитов.
Устранение неполадок
Частые проблемы
| Проблема | Причина | Решение |
|---|---|---|
| 401 Unauthorized | Недействительный или отозванный API key | Сгенерируйте новый API key в настройках Linear |
| Ошибки запросов | Неверный синтаксис GraphQL | Проверьте запросы в API explorer Linear |
| Отсутствующие задачи | Ограниченный доступ к команде | Убедитесь, что владелец API key имеет доступ к целевым командам |
| Вебхук не срабатывает | Неверный URL или отключён | Проверьте статус вебхука в Linear Settings > API > Webhooks |
| Неполная пагинация | Отсутствует курсор after | Убедитесь, что цикл пагинации продолжается до hasNextPage = false |
Режим отладки
connectors: linear: debug: true log_level: verbose log_queries: trueПроверка подключения
tajo connectors test linear# ✓ GraphQL API connection successful# ✓ Workspace access verified# ✓ Team list readable# ✓ Issue query operational# ✓ Webhook registration availableЛучшие практики
- Используйте вебхуки для real-time, регистрируйте вебхуки вместо опроса API для изменений задач
- Фильтруйте по команде, синхронизируйте только задачи из нужных команд для снижения нагрузки на API
- Оптимизируйте GraphQL-запросы, запрашивайте только нужные поля, чтобы оставаться в пределах лимитов сложности
- Сопоставляйте метки с сегментами, используйте метки Linear для сегментации контактов в Brevo
- Обрабатывайте пагинацию, всегда проверяйте
hasNextPageи используйтеendCursorдля получения полных данных - Проверяйте подписи вебхуков, всегда валидируйте заголовок
Linear-Signature
Безопасность
- Аутентификация по API Key, персональные ключи, привязанные к рабочему проекту
- OAuth 2.0, безопасный поток авторизации для интеграций с несколькими рабочими проектами
- Только HTTPS, все API-коммуникации зашифрованы через TLS 1.2+
- Подписи вебхуков, верификация подписи на основе HMAC
- Шифрованное хранение, API ключи зашифрованы при хранении в Tajo
- Соответствие SOC 2, платформа Linear сертифицирована по SOC 2 Type II