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

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

Подключение SVN-репозиториев для трассировки коммитов к Запросам на Изменение

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

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

• СУТР Навигатор версии 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]»