Predictor X

Интеграция с GitHub

Подключите приложение GitHub один раз, и любые PR, в названии ветки, заголовке или описании которых содержится идентификатор задачи, будут автоматически привязываться к ней, а слияние PR автоматически переведет задачу в статус Done.

Подключите учетную запись или организацию GitHub один раз в разделе Settings → GitHub. После этого любой pull request, в названии ветки, заголовке или описании которого есть идентификатор задачи (например, MUL-123), будет автоматически связан с этой задачей, появится в разделе Pull requests на боковой панели задачи, а при слиянии (merge) PR задача автоматически перейдет в статус Done.

Вам не нужно настраивать каждую задачу отдельно. Весь процесс управляется через идентификаторы.

Что делает эта интеграция

ИнтерфейсПоведение
Settings → GitHubАдминистраторы рабочего пространства видят вкладку GitHub с главным переключателем, кнопкой Connect GitHub и настройками функций (боковая панель PR, авторство, автосвязывание). После установки вы вернетесь обратно на вкладку GitHub.
Боковая панель задачи → Pull requestsКаждый PR автоматически привязывается к задаче. Отображаются заголовок, репозиторий, состояние (Open / Draft / Merged / Closed) и автор. Нажмите на строку, чтобы перейти к PR на GitHub.
Webhook (фоновый)При каждом событии pull_request Предиктор Икс обновляет данные о PR, сканирует их на наличие идентификаторов задач и (пере)создает ссылки. Операция идемпотентна — повторная отправка вебхука ничего не меняет.
Автостатус при слиянииКогда PR переходит в статус merged, каждая связанная с ним задача, которая еще не находится в статусе Done или Cancelled, перемещается в Done. Изменение статуса фиксируется в таймлайне с источником github_pr_merged.

Зеркалируется только сам PR. Коммиты, ссылки на ветки без открытого PR и состояния проверок CI не обрабатываются. Интеграция намеренно ограничена в функциональности.

Как происходит поиск идентификаторов

Вебхук извлекает идентификаторы из трех полей в следующем порядке: название ветки PR, заголовок PR, описание PR. Алгоритм сопоставления:

  • Не учитывает регистр — mul-123, MUL-123, Mul-123 будут распознаны как один и тот же идентификатор.
  • Ограничен — использование \b слева и границы цифр справа предотвращают захват номеров версий, таких как v1.2-3 или строк в формате email.
  • В рамках рабочего пространства — сопоставляется только с префиксом задач данного пространства. FOO-1 в пространстве с префиксом MUL будет проигнорирован, даже если числовой идентификатор совпадает.
  • Дедупликация — упоминание MUL-1, MUL-1 в описании приведет к созданию связи только один раз.

В одном PR можно ссылаться на несколько задач. Closes MUL-1, MUL-2 свяжет PR с обеими задачами, и их слияние переведет обе задачи в статус Done.

Правило автоперевода в статус Done

Когда поле merged у PR принимает значение true, оценивается каждая связанная задача:

Текущий статус задачиРезультат
doneБез изменений (уже конечное состояние).
cancelledБез изменений — статус cancelled означает, что пользователь явно отказался от работы; интеграция не переопределяет это действие.
Любой другой (todo, in_progress, in_review, blocked, backlog)Перемещается в done.

Закрытие PR без слияния лишь обновляет статус карточки PR на Closed. Связанные задачи остаются в прежних статусах — пользователь сам решает, что означает закрытие без слияния.

Действие в таймлайне приписывается системному актору system. Подписчики задачи получат уведомление об изменении статуса, точно так же, как если бы это сделал человек.

Что не связывается автоматически

  • Идентификаторы в сообщениях коммитов — сканируются только ветки, заголовки и описания PR. Коммит с заголовком MUL-123: fix login не будет автоматически связан, если эта же строка не появится в заголовке или описании PR.
  • Идентификаторы в комментариях к PR — сканируются только метаданные самого PR; последующие комментарии в GitHub игнорируются.
  • PR в репозиториях, где не установлено приложение — без установленного приложения Предиктор Икс не получает вебхуки.
  • Ручная привязка PR к задаче — интерфейса для этого пока нет. Если ваш процесс подразумевает использование идентификаторов там, где Предиктор Икс их не ищет, добавьте их в заголовок или описание PR.

Отключение

В разделе Settings → GitHub нет списка установленных приложений — вы управляете существующими установками напрямую через GitHub:

  • Через GitHub — удалите приложение Предиктор Икс GitHub по адресу https://github.com/settings/installations (для личных аккаунтов) или https://github.com/organizations/<org>/settings/installations (для организаций). Предиктор Икс получит вебхук installation.deleted и удалит соответствующие данные в реальном времени; любая открытая страница настроек обновится без перезагрузки.
  • Отключение внутри Предиктор Икс доступно только администраторам — элемент управления отключением на вкладке GitHub скрыт для обычных пользователей. Он остается доступным, даже если главный переключатель GitHub выключен, чтобы администраторы могли отозвать устаревшую установку после отключения функции.

После отключения зеркалированные записи PR остаются в базе данных, чтобы история в боковых панелях задач сохранялась, но новые события вебхуков от этой установки приниматься не будут.

Права доступа и видимость

  • Подключение / отключение требуют прав владельца или администратора рабочего пространства. Участники видят описание карточки, но кнопки подключения нет.
  • Боковая панель Pull requests в задаче видна всем, у кого есть доступ к чтению задачи — права доступа аналогичны правам на просмотр деталей задачи.
  • Приложение GitHub запрашивает доступ только на чтение pull request'ов и метаданных. Предиктор Икс не вносит коммиты, комментарии или статусы проверок обратно в GitHub.

Настройка собственного сервера (Self-host)

Если вы используете Предиктор Икс Cloud, интеграция уже настроена — пропустите этот раздел.

Для установки на свой сервер вам нужно создать одно приложение GitHub, направить его на свой сервер и задать две переменные окружения. Весь процесс описан ниже.

1. Создание приложения GitHub

Перейдите по одной из ссылок:

  • Личный аккаунт → https://github.com/settings/apps/new
  • Организация → https://github.com/organizations/<org>/settings/apps/new

Заполните поля:

ПолеЗначение
GitHub App nameЛюбое узнаваемое имя, например Предиктор Икс или Предиктор Икс (staging).
Homepage URLВаш фронтенд Предиктор Икс, например https://predictorx.example.com.
Callback URLОставьте пустым — Предиктор Икс не использует идентификацию пользователей через OAuth.
Setup URLhttps://<api-host>/api/github/setup. Отметьте "Redirect on update".
Webhook → ActiveВключено.
Webhook URLhttps://<api-host>/api/webhooks/github.
Webhook secretСгенерируйте длинную случайную строку (например, через openssl rand -hex 32). Это значение нужно будет вставить в переменные окружения Предиктор Икс на шаге 2.
Permissions → Repository → Pull requestsRead-only.
Permissions → Repository → MetadataRead-only (обязательно).
Subscribe to eventsОтметьте Pull request.
Where can this GitHub App be installed?На ваше усмотрение. Only on this account подойдет для большинства случаев.

После Create GitHub App сохраните два значения со страницы приложения:

  • Public link вверху — часть ссылки после последнего слэша является slug. https://github.com/apps/predictorx-acme → slug = predictorx-acme.
  • Webhook secret, который вы только что сгенерировали (GitHub не позволит прочитать его позже — сохраните сейчас).

Webhook secret ≠ Client secret. На странице настроек приложения эти поля расположены рядом. Webhook secret используется для подписи полезной нагрузки pull_request — именно он нужен Предиктор Икс. Client secret используется для OAuth и не применяется в этой интеграции. Их путаница вызовет ошибку 401 invalid signature при каждом вебхуке.

2. Настройка переменных окружения

На сервере API:

GITHUB_APP_SLUG=predictorx-acme
GITHUB_WEBHOOK_SECRET=<webhook secret, который вы сгенерировали>

# Опционально, но рекомендуется — заполняет имя аккаунта сразу при
# установке, не дожидаясь первого вебхука:
GITHUB_APP_ID=<числовой ID приложения со страницы настроек>
GITHUB_APP_PRIVATE_KEY=<полный PEM-блок, включая BEGIN/END строки>

GITHUB_APP_SLUG и GITHUB_WEBHOOK_SECRET обязательны. Если хотя бы одно отсутствует:

  • Кнопка Connect GitHub в настройках будет неактивна с подсказкой "не настроено".
  • Эндпоинт /api/webhooks/github будет возвращать 503 github webhooks not configured — Предиктор Икс отклоняет события без секрета, вместо того чтобы ошибочно считать любую подпись валидной.

GITHUB_APP_ID и GITHUB_APP_PRIVATE_KEY опциональны. Они позволяют при установке получать реальное имя организации или пользователя через эндпоинт GitHub /app/installations/{id}. Без них карточка подключения будет кратко показывать Connected to unknown, пока GitHub не доставит вебхук installation.created (обычно через несколько секунд). Сгенерируйте закрытый ключ в разделе Private keys → Generate a private key на странице настроек приложения; вставьте весь PEM-блок (включая строки -----BEGIN/END RSA PRIVATE KEY-----) в переменную окружения, сохраняя переносы строк.

FRONTEND_ORIGIN также должен быть задан; колбэк настройки после установки перенаправит пользователя на <FRONTEND_ORIGIN>/settings?tab=github.

После изменения переменных окружения перезапустите API.

3. Выполнение миграций

Интеграция использует таблицы из миграции 079_github_integration. При обновлении старой версии:

make migrate-up

Будут созданы три таблицы: github_installation, github_pull_request, issue_pull_request. Они настроены на каскадное удаление вместе с рабочим пространством.

4. Подключение через UI

В Предиктор Икс:

  1. Откройте Settings → GitHub как владелец или администратор.
  2. Нажмите Connect GitHub. Откроется вкладка GitHub.
  3. Выберите репозитории, которым нужно дать доступ, и нажмите Install.
  4. GitHub перенаправит вас на <api-host>/api/github/setup, который запишет установку и вернет вас на <FRONTEND_ORIGIN>/settings?tab=github&github_connected=1.

После этого откройте любой PR, в названии ветки/заголовке/описании которого есть идентификатор задачи — через несколько секунд на странице задачи появится блок Pull requests.

5. Проверка через curl

Если на странице Recent Deliveries в GitHub после установки отображается 401 invalid signature, значит секреты не совпадают. Самый быстрый способ проверить, где ошибка:

SECRET="<значение из GITHUB_WEBHOOK_SECRET>"
BODY='{"zen":"test"}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$SECRET" -hex | awk '{print $NF}')
curl -i -X POST https://<api-host>/api/webhooks/github \
  -H "X-Hub-Signature-256: sha256=$SIG" \
  -H "X-GitHub-Event: ping" \
  -H "Content-Type: application/json" \
  -d "$BODY"
HTTP статусЧто значитРешение
200 {"ok":"pong"}Секрет на сервере верный. Ошибка на стороне GitHub.Настройки приложения GitHub → Webhook secret → вставьте значение зановоSave changes. Отправьте повторно.
401 invalid signatureСекрет на сервере не совпадает с тем, что вы ожидаете.Проверьте, применилась ли переменная окружения (например, через kubectl exec → `echo -n "$GITHUB_WEBHOOK_SECRET"
503 github webhooks not configuredGITHUB_WEBHOOK_SECRET пуст в процессе.Задайте переменную окружения, перезапустите API.

Ограничения

Несколько нюансов, которые стоит учитывать сейчас:

  • Нет UI для ручной связи — единственный способ связать PR — это наличие идентификатора в ветке, заголовке или описании.
  • Нет CI / статуса проверок — зеркалируется только сам PR. Статус сборки, комментарии ревьюеров и список проверяющих в Предиктор Икс не отображаются.
  • Нет настроек правила merge → Done на уровне пространства — это фиксированное правило (слияние → Done, если не cancelled). Возможность настройки — задача на будущее.
  • Логика для нескольких PR на одну задачу консервативна — если два PR ссылаются на MUL-123 и первый из них слит, задача сразу переходит в Done. Доработка, ожидающая завершения всех связанных PR, находится в разработке.

Дальнейшие шаги