Встала передо мной задача установить на сервере в инете 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)
На этом все. Спасибо за внимание ;)
Миша, а почему Mercurial если не секрет? Я понимаю что это вопрос религии больше, просто интересно. И как другие участники проекта к нему относятся? Я в том смысле, что среднего разработчика и к SVN не всегда можно нормально приучить...
ОтветитьУдалитьВопрос выбора между Мерком и СВН - это уже не религия. Мерж из страшного сна СВНщика превращается в простую повседневную операцию, также и бранчи. Чисто за счет конвенций и структуры репозиториев можно подогнать систему практически под любой workflow, в том числе и с ревизией кода. К тому же в случае кодинга в отсутствие интернета не нужно думать как сохранять получаемые ревизии, чтобы потом их закоммитить...
ОтветитьУдалитьНу а насчет освоения... За пару дней-максимум неделю вполне реально освоить, а потом уже за уши не оторвешь.
Ну а преимущество перед имеющими ту же функциональность, но существенно более гиковскими, Git и Bazaar - вполне консистентный гуй.
ОтветитьУдалитьМожно ли поставить Mercurial на IIS?
ОтветитьУдалитьto alvas: Setting up a Mercurial server under IIS7 on Windows Server 2008 R2
ОтветитьУдалитьwww.jeremyskinner.co.uk/mercurial-on-iis7
Здравствуйте. Обязательна ли использовать серверную ОС для установки сервера Mercurial server?
ОтветитьУдалитьможно ли установить Mercurial server на WinXP?
Заранее спасибо, Максим.
Серверная ОС не обязательна. На ХР - можно.
ОтветитьУдалитьна ХР ставить как написано в статье?
ОтветитьУдалитьЕсли вам нужно раздавать через сетку (интернет), то придется ковырять IIS, как точно - не знаю :)
ОтветитьУдалитьпо сети пока раздвать не нужно.. только на локальной машине...
ОтветитьУдалить