Согласитесь, статей описывающих настройку
svnsync миллион с хвостиком. Плодить энтропию не цель этой статьи. Руководства по первоначальной настройке приведены в конце заметки.
Сконцентрируем внимание на подходах связанных с необходимостью регулярного запуска
svnsync sync для поддержания нашего зеркала в актуальном состоянии. Здесь можно выделить два основных лагеря:
- первый: периодический запуск svnsync sync из crond;
- второй: запуск svnsync из post-commit hook(a).
Минус первого подхода заключается в том, что изменения попадают на зеркало с некоторой задержкой. В самом лучшем случае регулярность обновлений будет кратна одной минуте. Что в свою очередь создаст дополнительные нагрузки на жесткие диски и выброс дополнительного тепловой энергии в атмосферу.
Минус большинства реализаций второго подхода синхронность запуска.
post-commit hook выполняется в рамках
svn commit(а). Другими словами
svn commit вернет управление только по завершении выполнения всех операций в
post-commit hook(e). Получается чем дольше будет работать
post-commit hook, тем дольше разработчик будет ждать выполнения
svn commit(a). Соответственно теряются драгоценные человеко-минуты.
Асинхронность второго подхода - это очевидный ответ. Более того, все что потребуется для реализации есть в любом современном дистрибутиве:
xinetd и
nc.
Подход предельно прост. В момент выполнения
svn commit(a) разработчиком, вызывается
post-commit hook, единственная задача которого отправить
UDP пакет на заданный порт зеркала
SVN. На зеркале
SVN(a) указанный порт прослушивает демон xinetd с зарегистрированным обработчиком
svnsync sync. Подход дает неоспоримый плюс - в момент
commit(a) время отработки
post-commit hook(a) минимальны.
Реализуем теорию на бумаге. Условимся, для UDP пакетов использовать порт
8383, адрес мастер сервера 1.2.3.4, адрес зеркалирующего сервера 5.6.7.8. В мастер репозитории вашего хранилища необходимо создать скрипт
hooks/post-commit следующего содержания:
#!/bin/sh
host=5.6.7.8 # Адрес зеркалирующего сервера
port=8383
echo '1' | nc -w 1 -u $host $port
И сделать его исполняемым
chmod +x hooks/post-commit
На зеркалирующем сервере создаем файл
/etc/xinetd.d/svnsync следующего содержания:
service svnsync
{
type = UNLISTED
disable = no
socket_type = dgram
port = 8383
wait = yes
user = nobody
passenv = PATH
server = /usr/bin/svnsync
server_args = sync file:///srv/svn
only_from = 127.0.0.1 1.2.3.4 # Адреса, с которых дозволено получать UDP пакеты
}
Описание сервиса предполагает, что зеркало хранилища расположено в директории
file:///srv/svn и владельцем файлов является пользователь
nobody. Разумеется, не забываем перезапустить/запустить службу
xinetd.
Документация:
1. Краткое и емкое
руководство о настройке зеркалирования с использованием svnsync;
2. Русскоязычное
руководство.