Руководство администратора

Настройка интеграции с SCM (SVN / Git)

Подключение SVN- и Git-репозиториев (Gitea / GitHub / GitLab) для трассировки коммитов к Запросам на Изменение

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

Что необходимо

• СУТР Навигатор версии 0.16.0 или выше • SVN-сервер, доступный с сервера СУТР Навигатор по протоколу svn:// или http(s):// • Сервисный аккаунт SVN с правами чтения (для Import) • Доступ к SVN-серверу для установки hook-скрипта (для Webhook) • Утилиты jq, curl, openssl на SVN-сервере (для hook-скрипта)

Шаг 1. Миграция базы данных

Применить миграцию

При обновлении существующей установки: make server-migrate Или вручную: docker exec rms-navigator-api /app/packages/database/node_modules/.bin/prisma migrate deploy --schema=/app/packages/database/prisma/schema.prisma Миграция добавляет тип scm_type, таблицы scm_repositories и scm_commits. Все операции аддитивные — существующие данные не затрагиваются.

Шаг 2. Переменные окружения

Конфигурация

• SCM_ENCRYPTION_KEY (обязательная) — ключ шифрования паролей SVN, 64 hex-символа (32 байта). Сгенерировать: openssl rand -hex 32 • SCM_DIFF_CACHE_MAX_SIZE_MB (необязательная, по умолчанию: 100) — максимальный размер LRU-кэша для diff в МБ

Docker Compose

Добавьте в .env.server (или .env.prod): SCM_ENCRYPTION_KEY=your-64-char-hex-key-here SCM_DIFF_CACHE_MAX_SIZE_MB=100 Затем перезапустите: make server-restart

Шаг 3. Добавить репозиторий в UI

Добавить репозиторий

1. Откройте Пространство → Настройки → Интеграции → Репозитории 2. Нажмите «Добавить репозиторий» 3. Заполните: Название, Тип (SVN), URL (например svn://svn.example.com/project/trunk), Логин, Пароль 4. Укажите маску commit message (regex) — первая capture-группа = код ЗИ 5. Нажмите «Проверить подключение» 6. Нажмите «Добавить репозиторий» для сохранения

Маски commit message

Примеры regex-масок для извлечения кодов ЗИ: • ЗИ-(\d+) — совпадает с «ЗИ-42: описание» → код «42» • CR-(\d+) — совпадает с «CR-123: fix timeout» → код «123» • \[(\d+)\] — совпадает с «[456] update config» → код «456» Коммиты без совпадения с маской сохраняются без привязки к ЗИ.

Шаг 4. Импорт истории коммитов

Запустить импорт

Нажмите «Импорт» на карточке репозитория для загрузки существующей истории коммитов. Процесс: 1. Выполняется svn log для получения всех коммитов 2. Для каждого коммита парсится commit message по маске 3. Код ЗИ сопоставляется с существующими Запросами на Изменение 4. Если ЗИ не найден — создаётся placeholder со статусом DRAFT 5. Последующие импорты загружают только новые коммиты (инкрементально) Для больших репозиториев первый импорт может занять время.

Шаг 5. SVN Post-Commit Hook (Webhook)

Получить Webhook URL и секрет

После добавления репозитория Webhook URL отображается в диалоге: https://rm.example.com/api/v1/webhooks/scm/<REPOSITORY_ID> Секрет для HMAC-подписи (webhookSecret) можно получить через API: curl -s -b cookies.txt https://rm.example.com/api/v1/spaces/<SPACE_ID>/repositories/<REPO_ID> | jq -r '.data.webhookSecret'

Установить hook-скрипт

На SVN-сервере создайте файл hooks/post-commit в директории репозитория: #!/bin/bash REPOS="$1" REV="$2" WEBHOOK_URL="https://rm.example.com/api/v1/webhooks/scm/REPOSITORY_ID" SECRET="WEBHOOK_SECRET" AUTHOR=$(svnlook author -r "$REV" "$REPOS") DATE=$(svnlook date -r "$REV" "$REPOS") MESSAGE=$(svnlook log -r "$REV" "$REPOS") CHANGED=$(svnlook changed -r "$REV" "$REPOS") PAYLOAD=$(jq -n --arg rev "$REV" --arg author "$AUTHOR" --arg date "$DATE" --arg message "$MESSAGE" --arg changed "$CHANGED" '{revision: $rev, author: $author, date: $date, message: $message, changed: $changed}') SIGNATURE=$(echo -n "$PAYLOAD" | openssl dgst -sha256 -hmac "$SECRET" -hex | awk '{print $2}') curl -s -X POST "$WEBHOOK_URL" -H "Content-Type: application/json" -H "X-SCM-Signature: sha256=$SIGNATURE" -d "$PAYLOAD" --max-time 10 > /dev/null 2>&1 & exit 0 Сделайте исполняемым: chmod +x hooks/post-commit Требования на SVN-сервере: jq, curl, openssl, svnlook

Просмотр коммитов

В карточке Запроса на Изменение

Откройте Запрос на Изменение → вкладка «Коммиты». Каждый коммит показывает: • Номер ревизии, автор, дата • Первая строка commit message • Количество изменённых файлов, добавленных/удалённых строк Клик на коммит раскрывает: • Полный commit message • Список изменённых файлов с типом изменения (A/M/D) • Unified diff (загружается из SVN по запросу, кэшируется на сервере)

Устранение неполадок

Импорт завершается с ошибкой

• Проверьте доступность SVN-сервера: docker exec rms-navigator-api svn info --non-interactive --username USER --password PASS svn://server/repo • Проверьте логи API: docker compose logs api | grep scm • Убедитесь, что SCM_ENCRYPTION_KEY задан в переменных окружения

Webhook не обрабатывается

• Проверьте, что SVN-сервер может достучаться до СУТР Навигатор: curl -v https://rm.example.com/api/v1/webhooks/scm/REPO_ID • Проверьте, что секрет в hook-скрипте совпадает с webhookSecret репозитория • Проверьте формат JSON — все поля (revision, author, date, message) обязательны

Коммиты не привязываются к ЗИ

• Проверьте, что формат commit message соответствует маске (regex) • Проверьте, что ЗИ с таким кодом существует в пространстве • Если ЗИ не найден, система создаёт placeholder. Проверьте список ЗИ на наличие записей «[SCM Import]»

Git-интеграция — Предварительные требования

Что необходимо

• СУТР Навигатор версии 0.57.0 или выше • Личный токен доступа (PAT) с нужными правами: — Gitea: read:repository, read:user, право создания webhook — GitHub / GitHub Enterprise: scope repo (или public_repo для публичных), admin:repo_hook — GitLab: read_repository + api (для создания webhook) • Git-репозиторий, доступный с сервера API СУТР Навигатор по HTTPS • SSH и локальный клон НЕ поддерживаются — используйте только HTTPS + PAT

Внутренний CA для self-hosted серверов

Если Git-сервер использует TLS-сертификат, подписанный внутренним УЦ, задайте NODE_EXTRA_CA_CERTS в .env.server (или .env.prod) и перезапустите API: NODE_EXTRA_CA_CERTS=/path/to/internal-ca.crt Без этого запросы к API провайдера завершатся ошибкой «unable to verify the first certificate».

Git-интеграция — Добавить репозиторий в UI

Добавить Git-репозиторий

1. Откройте Пространство → Настройки → Интеграции → Репозитории 2. Нажмите «Добавить репозиторий» 3. Выберите Тип = Git 4. Выберите Провайдер: Gitea / GitHub / GitLab 5. Укажите URL репозитория (HTTPS), например https://git.example.com/org/project 6. Введите Личный токен доступа (PAT) 7. Укажите маску commit message (regex) — первая capture-группа = код ЗИ 8. Нажмите «Проверить подключение» 9. Нажмите «Добавить репозиторий» для сохранения Токен шифруется AES-256-CBC перед сохранением (ключ: SCM_ENCRYPTION_KEY).

Git-интеграция — Импорт истории коммитов

Запустить импорт

Нажмите «Импорт» на карточке репозитория для загрузки истории коммитов через API провайдера. Процесс: 1. Загружает коммиты из дефолтной ветки через REST API провайдера 2. Парсит каждый commit message по маске 3. Сопоставляет код ЗИ с существующими Запросами на Изменение 4. Если ЗИ не найден — создаётся placeholder со статусом DRAFT 5. Последующие импорты инкрементальные (только новые коммиты) Первый импорт ограничен SCM_GIT_IMPORT_MAX_COMMITS (по умолчанию: 500). Увеличьте в переменных окружения при необходимости.

Git-интеграция — Настройка push-webhook

Получить Webhook URL и секрет

После добавления репозитория Webhook URL и секрет отображаются в диалоге: https://rm.example.com/api/v1/webhooks/scm/<REPOSITORY_ID> Секрет (webhookSecret) можно получить через API: curl -s -b cookies.txt https://rm.example.com/api/v1/spaces/<SPACE_ID>/repositories/<REPO_ID> | jq -r '.data.webhookSecret'

Настройка webhook в Gitea

Репозиторий → Settings → Webhooks → Add Webhook → Gitea: • Target URL: https://rm.example.com/api/v1/webhooks/scm/<REPOSITORY_ID> • HTTP Method: POST • Content Type: application/json • Secret: значение webhookSecret • Trigger On: Push Events Gitea подписывает запросы заголовком X-Gitea-Signature (HMAC-SHA256). СУТР Навигатор проверяет подпись автоматически.

Настройка webhook в GitHub / GitHub Enterprise

Репозиторий → Settings → Webhooks → Add webhook: • Payload URL: https://rm.example.com/api/v1/webhooks/scm/<REPOSITORY_ID> • Content type: application/json • Secret: значение webhookSecret • Which events: Just the push event • Active: включено GitHub подписывает запросы заголовком X-Hub-Signature-256 (HMAC-SHA256). СУТР Навигатор проверяет подпись автоматически.

Настройка webhook в GitLab

Репозиторий → Settings → Webhooks: • URL: https://rm.example.com/api/v1/webhooks/scm/<REPOSITORY_ID> • Secret token: значение webhookSecret • Trigger: Push events (отмечено) Важно: GitLab использует заголовок X-Gitlab-Token (передаёт секрет в открытом виде, а не HMAC-подпись). СУТР Навигатор поддерживает оба режима и выбирает метод проверки автоматически по заголовку запроса.

Git-интеграция — Устранение неполадок

Ошибка 401 при проверке подключения или импорте

• Убедитесь, что PAT не просрочен и не отозван • Проверьте scope токена: Gitea (read:repository, webhook create), GitHub (repo + admin:repo_hook), GitLab (read_repository + api) • Убедитесь, что токен принадлежит аккаунту с доступом к репозиторию

Ошибка сертификата (self-hosted)

Ошибка: «unable to verify the first certificate» Задайте NODE_EXTRA_CA_CERTS=/etc/ssl/certs/internal-ca.crt в окружении API и перезапустите сервис.

Git webhook не обрабатывается

• Проверьте доступность СУТР Навигатор с платформы: curl -v https://rm.example.com/api/v1/webhooks/scm/REPO_ID • Gitea/GitHub: секрет в настройках webhook должен совпадать с webhookSecret репозитория; логи: docker compose logs api | grep webhook • GitLab: убедитесь, что поле «Secret token» заполнено (литеральное значение, не HMAC)

Импорт обрывается — история неполная

Первый импорт ограничен SCM_GIT_IMPORT_MAX_COMMITS (по умолчанию 500). Увеличьте значение в .env.server, перезапустите API и нажмите «Импорт» ещё раз для загрузки следующей партии.