Безболезненная миграция с Gitosis на Gitolite

в 6:27, , рубрики: Git, gitolite, linux, Migration, метки: , , ,

Gitosis уже не поддерживается, и не за горами стабильный релиз Debian Wheezy, на котором его уже не будет. Поэтому было принято решение о миграции на gitolite. Не смотря на то, что есть соответствующий мануал, он не даёт ответа на вопрос — «Как это сделать и ничего не сломать?». Об этом сейчас и пойдёт речь.

Идея состоит в следующем: поднять на этом же пользователе gitolite, проверить его работу и с минимальным downtime заменить gitosis на gitolite.

Поскольку установка ведётся на одном пользователе, то возможны конфликты. Поэтому было выяснено, что при дефолтных конфигурациях возможны конфликты в следующих местах: в папке, в которой располагаются репозитории ~/repositories и в файле ~/.ssh/authorized_keys, который автоматически генерируется этими приложениями. В первом случае есть возможность изменить дефолтный путь, а вот для второго случая автор gitolite не предусмотрел такой возможности. Хоть там и perl, не беда — прорвёмся. Небольшой коммит исправил положение. Установку целесообразно производить из исходников, поскольку это даёт больше гибкости. Алтернативный способ — пересобрать пакет, но тогда теряется преимущество связанное с простым обновлением пакета. Так что первый вариант предпочтительней.

Я не буду расписывать полную установку, так как это уже сделали за меня, а опишу только специфичные моменты. Перед выполнением gitolite setup необходимо изменить в файле src/lib/Gitolite/Rc.pm параметры GL_REPO_BASE и SSH_AUTH_KEY. К примеру заменим authorized_keys на authorized_keys_gitolite, а в GL_REPO_BASE укажем другую папку. Теперь можно смело продолжать установку, поскольку конфликты исключены.

Gitolite и gitosis не могут одновременно использовать один экземпляр ssh, поэтому поднимем второй. Для этого нужно скопировать конфиг по адресу /etc/ssh/sshd_config скажем в /etc/ssh/sshd_config_gitolite и изменить последний.
Следует раскомментировать в нём поле AuthorizedKeysFile и прописать тот файл, который был указан ранее в конфиге gitolite (в нашем случае это authorized_keys_gitolite). А также заменить параметр Port на другой, пусть это будет 22222.

Теперь запускаем ssh в debug режиме sudo /usr/sbin/sshd -ddd -f /etc/ssh/sshd_config_gitolite и проверяем его работу. Для этого склонируем тестовый репозиторий git clone ssh://git@git-server:22222/testing. Далее переходим к той миграции, которая описана в мануале gitolite: добавляем ключи, мигрируем конфиг и тестим права доступа.

Последний шаг заключается в том, чтобы переключиться с gitosis на gitolite. Для этого отрубаем доступ всем к git (чтобы не поступало новых изменений) переместив файл .ssh/authorized_keys в другое место. Далее есть два пути: либо скопировать репозитории из ~/repositories в ~/repo либо сделать симлинки на них. После перемещения репозиториев запускаем gitolite setup, как описано в мануале. Последним действием заменим SSH_AUTH_KEY на дефолтное значение и переименуем файл authorized_keys_gitolite в authorized_keys. Таким образом миграция была успешно завершена.

Что в итоге: способ является достаточно безболезненным, потому что установка gitolite производится независимо и конфигурацию можно протестировать заранее. Плюс этого способа в том, что время downtime'a стремится к нулю.

Удачной миграции!

Автор: f0y

Поделиться

* - обязательные к заполнению поля