Руководство администратора
Настройка интеграции с 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]»