Коннектор Linear

Подключите ваш рабочий проект Linear к Brevo для отслеживания задач, ориентированных на клиентов, уведомлений об обновлениях продукта и кампаний по вехам разработки через Tajo.

Обзор

СвойствоЗначение
ПлатформаLinear
КатегорияCustom
Сложность настройкиПростая
Официальная интеграцияНет
Синхронизируемые данныеЗадачи, проекты, пользователи, события
Тип APIGraphQL API
АутентификацияOAuth 2.0 / Personal API Key
Базовый URLhttps://api.linear.app/graphql

Возможности

  • Синхронизация событий задач, пересылка событий создания, обновления и завершения задач в хронологию контактов Brevo
  • Отслеживание вех проекта, запуск кампаний Brevo при достижении ключевых вех проекта
  • Привязка задач к клиентам, связывание задач Linear с контактами Brevo для видимости поддержки
  • Сегментация по меткам, сопоставление меток Linear с атрибутами контактов Brevo
  • Аналитика циклов, синхронизация данных о завершении спринтов/циклов для отчётности о производительности команды
  • Автоматизация на основе вебхуков, пересылка событий в real-time через вебхуки Linear

Предварительные требования

Прежде чем начать, убедитесь, что у вас есть:

  1. Рабочий проект Linear с правами администратора
  2. Personal API key или настроенное OAuth-приложение
  3. Аккаунт Brevo с доступом к API
  4. Аккаунт Tajo с активной подпиской

Аутентификация

Linear поддерживает Personal API keys и OAuth 2.0.

Вариант 1: Personal API Key

  1. Перейдите в Linear > Settings > API > Personal API keys
  2. Нажмите Create key
  3. Назовите ключ “Tajo Integration”
  4. Скопируйте сгенерированный ключ (начинается с lin_api_)
Terminal window
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

Для интеграций, обслуживающих несколько рабочих проектов:

  1. Создайте OAuth-приложение на linear.app/settings/api/applications
  2. Укажите redirect URI: https://app.tajo.io/callbacks/linear
  3. Запросите scope: read, write, issues:create, comments:create

GraphQL API

Linear использует исключительно GraphQL API. Все запросы и мутации проходят через единственный эндпоинт: https://api.linear.app/graphql. Tajo автоматически строит все GraphQL-запросы.

Подключение к Tajo

Terminal window
# Используя Personal API Key
tajo connectors install linear \
--api-key $LINEAR_API_KEY
# Используя OAuth
tajo 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:

ОперацияТипНазначение
issuesQueryСписок и фильтрация задач
issueQueryПолучить задачу по ID
projectsQueryСписок всех проектов
cyclesQueryСписок циклов (спринтов)
teamsQueryСписок команд рабочего проекта
usersQueryСписок участников рабочего проекта
viewerQueryПолучить данные аутентифицированного пользователя
issueCreateMutationСоздать новую задачу
issueUpdateMutationОбновить существующую задачу
commentCreateMutationДобавить комментарий к задаче
webhookCreateMutationЗарегистрировать вебхук

Пример 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 при отправке запроса контактом Brevo
tajo.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

Проверка подключения

Terminal window
tajo connectors test linear
# ✓ GraphQL API connection successful
# ✓ Workspace access verified
# ✓ Team list readable
# ✓ Issue query operational
# ✓ Webhook registration available

Лучшие практики

  1. Используйте вебхуки для real-time, регистрируйте вебхуки вместо опроса API для изменений задач
  2. Фильтруйте по команде, синхронизируйте только задачи из нужных команд для снижения нагрузки на API
  3. Оптимизируйте GraphQL-запросы, запрашивайте только нужные поля, чтобы оставаться в пределах лимитов сложности
  4. Сопоставляйте метки с сегментами, используйте метки Linear для сегментации контактов в Brevo
  5. Обрабатывайте пагинацию, всегда проверяйте hasNextPage и используйте endCursor для получения полных данных
  6. Проверяйте подписи вебхуков, всегда валидируйте заголовок Linear-Signature

Безопасность

  • Аутентификация по API Key, персональные ключи, привязанные к рабочему проекту
  • OAuth 2.0, безопасный поток авторизации для интеграций с несколькими рабочими проектами
  • Только HTTPS, все API-коммуникации зашифрованы через TLS 1.2+
  • Подписи вебхуков, верификация подписи на основе HMAC
  • Шифрованное хранение, API ключи зашифрованы при хранении в Tajo
  • Соответствие SOC 2, платформа Linear сертифицирована по SOC 2 Type II

Связанные ресурсы

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AI-ассистент

Привет! Спрашивайте меня о документации.