суббота, 7 ноября 2009 г.

Установка и настройка системы контроля версий Mercurial на сервере

Встала передо мной задача установить на сервере в инете Mercurial, для организации контроля версий в одном проекте. Причем установить его таким образом, чтобы можно было в ближайшем будущем создавать ещё репозитории с небольшими затратами времени. Также необходимо было обеспечить только авторизованный доступ, так, чтобы можно было ограничить доступ пользователей как на запись, так и на чтение, причем для разных репозиториев по разному.
После часа гугленья нашлось одно решение, которое отвечало всем требованиям - использовать Apache в связке с Mercurial, при помощи hgwebdir.cgi из стандартного комплекта Mercurial. Итак, предположим что на сервере стоит Apache2 и Mercurial. Если этого нет, то нетрудно воспользоваться apt-get (у меня на серваке Debian), или пакетным менеджером своей системы. Отмечу только, что для выполнения всех требований нужна версия Mercurial не меньше 1.2.1, так как только в этой версии была исправлена ошибка, которая не позволяла разделять права на чтение различных репозиториев стандартными средствами.
Итак, основные задачи, которые предстоит решить:
1. Настроить Apache
2. Настроить hgwebdir.cgi
3. Создать и настроить репозиторий
 Поехали с начала. Я разместил корневую папку репозитория в папке /home/mike/www-data/hg/. Чтобы не путаться я на сервере все собственные данные размещаю у себя в домашней папке. В конфиг соответствующего виртуалхоста добавляем описание:
Alias /hg "/home/mike/www-data/hg"
  <Directory "/home/mike/www-data/hg/">
     Order allow,deny
     Allow from all
     AllowOverride All
     Options ExecCGI FollowSymLinks
     AddHandler cgi-script .cgi
  </Directory >
В данном случае предполагается, что все репозитории будут доступны по ссылкам вида http://[домен]/hg/[репозиторий]. AllowOverride необходим для возможности использования .htaccess файла, далее он потребуется. Создаем в каталоге /home/mike/www-data/hg/ файл .htaccess примерно такого содержания:
RewriteEngine On
RewriteBase /hg
RewriteRule ^$ hgwebdir.cgi  [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) hgwebdir.cgi/$1  [QSA,L]

AuthUserFile /home/mike/www-data/hg/htpasswd_hgstore
AuthGroupFile /dev/null
AuthName "HgRepo"
AuthType Basic
Require valid-user
Аутентификацию организуем срествами HTTP, логины и пароли будут храниться в файле /home/mike/www-data/hg/htpasswd_hgstore, как и написано в .htaccess. А в первой части указаны директивы для mod_rewrite (который естественно нужно подключить), которые позволяют получить красивые урлы вида http://[домен]/hg/[репозиторий], без указания hgwebdir.cgi. Правда описанный выше способ имеет свои недостатки - поле [репозиторий] в url не может совпадать с именем каталога на диске.
Идем дальше. В папку /home/mike/www-data/hg/ копируем файлик hgwebdir.cgi (в Debian он находится в /usr/share/doc/mercurial/examples/), и разрешаем ему выполняться:
chmod +x hgwebdir.cgi
Создаем в этом же каталоге файл hgweb.config, в котором прописываем следующее:
[paths]
test = repo_test

[web]
baseurl = /hg
Главное здесь - секция [paths]. В ней прописываются соответствия урлов и репозиториев на диске в виде URL = /path/to/repo, где /path/to/repo считается от текущего по отношению к hgweb.config каталога, а URL - от алиаса /hg/.
Нам потребуется ещё один файлик, а именно hgrc, который тоже создаем в каталоге с hgwebdir.cgi, и в этот самый hgrc вписываем:
[web]
#allow_push = *
#allow_read = *
push_ssl = false
contact = Mike Girkin
description = Get our elephants
allow_archive = bz2 gz zip
style = gitweb
Это заготовка для hgrc в каждом из репозиториев. Осталось дело за малым - создаем репозиторий, и копируем заготовку hgrc по месту:
mkdir repo_test
cd repo_test
hg init
cp ../hgrc repo_test/.hg/
Осталось только создать файлик с паролями htpasswd_hgstore с помощью утилиты htpasswd, и вбить в него нужное количество пользователей и паролей. Ограничить доступ на чтение/запись можно с помощью директив allow_read/allow_push в файлах hgrc лежащих в каждом из репозиториев, например:
allow_read = pupkin petrov sidorov
allow_push = petrov
Обращаю внимание, что в директивах allow_read/allow_push используются те логины, которые забиваются в htpasswd_hgstore, и используются для аутентификации клиентов. Для того, чтобы открыть доступ всем аутентифицировавшимся пользователям пишем allow_read = * или allow_push = *, соответственно.
И последнее, что нельзя забыть сделать, это поменять владельца для всей ~/www-data/hg/ (у меня Apache выполняется от имени www-data:www-data):
chown -R www-data:www-data ~/www-data/hg
На этом, для первого репозитория все настроено, и он должен быть доступен (в данном случае по ссылке http://[домен]/hg/test/, при этом он доступен как для утилиты hg и клиентов по этому url, так и через браузер, хотя необходимость последнего очень спорна.
Чтобы добавить новый репоиторий необходимо выполнить следующее:
1. Создать каталог (mkdir repo_new)
2. Прописать в hgweb.config в секцию [paths] соответсвие путей (new = repo_new)
3. Скопировать hgrc в repo_new/.hg/
4. Прописать во внутренний hgrc пользователей, которым разрешены операции над репозиторием
5. Изменить владельца на www-data (chown -R www-data:www-data repo_new)
На этом все. Спасибо за внимание ;)
Progg it

10 комментариев:

  1. Миша, а почему Mercurial если не секрет? Я понимаю что это вопрос религии больше, просто интересно. И как другие участники проекта к нему относятся? Я в том смысле, что среднего разработчика и к SVN не всегда можно нормально приучить...

    ОтветитьУдалить
  2. Вопрос выбора между Мерком и СВН - это уже не религия. Мерж из страшного сна СВНщика превращается в простую повседневную операцию, также и бранчи. Чисто за счет конвенций и структуры репозиториев можно подогнать систему практически под любой workflow, в том числе и с ревизией кода. К тому же в случае кодинга в отсутствие интернета не нужно думать как сохранять получаемые ревизии, чтобы потом их закоммитить...
    Ну а насчет освоения... За пару дней-максимум неделю вполне реально освоить, а потом уже за уши не оторвешь.

    ОтветитьУдалить
  3. Ну а преимущество перед имеющими ту же функциональность, но существенно более гиковскими, Git и Bazaar - вполне консистентный гуй.

    ОтветитьУдалить
  4. Можно ли поставить Mercurial на IIS?

    ОтветитьУдалить
  5. to alvas: Setting up a Mercurial server under IIS7 on Windows Server 2008 R2
    www.jeremyskinner.co.uk/mercurial-on-iis7

    ОтветитьУдалить
  6. Здравствуйте. Обязательна ли использовать серверную ОС для установки сервера Mercurial server?
    можно ли установить Mercurial server на WinXP?
    Заранее спасибо, Максим.

    ОтветитьУдалить
  7. Серверная ОС не обязательна. На ХР - можно.

    ОтветитьУдалить
  8. на ХР ставить как написано в статье?

    ОтветитьУдалить
  9. Если вам нужно раздавать через сетку (интернет), то придется ковырять IIS, как точно - не знаю :)

    ОтветитьУдалить
  10. по сети пока раздвать не нужно.. только на локальной машине...

    ОтветитьУдалить