Mercurial – это очень популярная распределённая (так как отсутствует центральное хранилище кода) система контроля версий, применяемая многими девелоперами. Работа с файлами проекта происходит в локальной директории. По мере завершения каких-то логических этапов работы выполняется commit изменений в данный локальный репозиторий. При необходимости производится синхронизация изменений с репозиториями других девелоперов: операция pull выполняет вливание чужих наборов изменений, а операция push отдаёт свои.
Считается, что оно даже круче, чем Subversion :) Чем именно круче я толком не знаю пока, ибо плотно не пользовался еще.
Далее речь пойдёт о том, как создать доступный по протоколу HTTPS защищенный mercurial-репозиторий, который будет условно считаться "основным" в процессе работы над проектом. Так SVN-нозависимым товарищам проще справится с новой идеологией распределённости. Да и процесс управления бекапами становится проще – административно объявляем, что бекапим только этот условно основной репозиторий, а остальные оставляем на совести отдельных девелоперов.
- Первым делом нужно установить сам mercurial и apache httpd (для примера возьмём дистрибутив CentOS):
yum install mercurial httpd mod_ssl
- Потом собственно создаём локальный (для веб-сервера) репозиторий:
mkdir -p /var/www/repos.mydomain.com/hg/repos/myrepo cd /var/www/repos.mydomain.com/hg/repos hg init myrepo
- Далее создаём виртуальный хост:
<VirtualHost 10.10.10.10:443> SSLEngine on ServerAdmin [email protected] ServerName repos.mydomain.com DocumentRoot /var/www/repos.mydomain.com/html/ ErrorLog /var/www/repos.mydomain.com/logs/error_ssl_log CustomLog /var/www/repos.mydomain.com/logs/access_ssl_log common SSLCertificateKeyFile /etc/ssl/mydomain.com/_.yourdomain.com.key SSLCertificateFile /etc/ssl/mydomain.com/_.yourdomain.com.crt SSLCertificateChainFile /etc/ssl/mydomain.com/gd_bundle.crt SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 ScriptAliasMatch ^/hg(.*) /var/www/repos.mydomain.com/cgi-bin/hgweb.cgi$1 <Directory /var/www/repos.mydomain.com/cgi-bin/> Options ExecCGI FollowSymLinks AllowOverride None </Directory> <Location /hg/> AuthType Basic AuthName "Mercurial repositories" AuthUserFile /var/www/repos.mydomain.com/conf/htpasswd.conf Require valid-user </Location> </VirtualHost>
Скрипт hgweb.cgi берётся из rpm-ки (по умолчанию ставится в /usr/share/doc/mercurial*/hgweb.cgi) и ложится в доступную апачу директорию, как указано в конфиге выше. В файл /var/www/repos.mydomain.com/conf/htpasswd.conf вносим пользователей, которые будут работать с репозиторием, с помощью команды htpasswd.
- Далее в ту же директорию, куда скопировали hgweb.cgi, ложим файл hgweb.config такого содержания:
# /prefix/to/strip/off = /root/of/tree/full/of/repos [collections] /var/www/repos.mydomain.com/hg/repos/ = /var/www/repos.mydomain.com/hg/repos/ [web] baseurl = /hg
- В файле /var/www/repos.mydomain.com/cgi-bin/hgweb.cgi изменяем значение переменной config (путь к hgweb.config).
- По умолчанию push (запись в репозиторий) запрещен, чтобы его разрешить, нужно создать файл /var/www/repos.mydomain.com/hg/repos/myrepo/.hg/hgrc следующего содержания:
[web] allow_push = dev1, dev2 allow_read = dev1, dev2, devjunior encoding = utf-8 [trusted] users = apache
Здесь подразумевается, что httpd выполняется под пользователем apache.
С этого момента репозиторий готов и доступен по URL: https://repos.mydomain.com/hg/myrepo.
Причём читать его могут три пользователя с логинами dev1, dev2 и devjunior, а вносить изменения – только два, с логинами dev1 и dev2.Если полный доступ нужно разрешить всем кроме некоторого списка READ-ONLY пользователей, то в сопровождении будет более удобным такой конфиг:
[web] allow_read = * deny_push = jenkins allow_push = * encoding = utf-8 push_ssl = false [trusted] users = apache
Чтобы избавиться от предупреждений вроде этого
warning: repos.mydomain.com certificate with fingerprint f8:85:d9:cb:b0:05:38:55:95:4e:74:a0:f9:3a:ba:5f:63:58:fd:b6 not verified (check hostfingerprints or web.cacerts config setting)
нужно добавить в конфиг-файл /etc/mercurial/hgrc такое:
[web] cacerts = /etc/pki/tls/certs/ca-bundle.crt
Где /etc/pki/tls/certs/ca-bundle.crt - файл с корневыми SSL-сертификатами.
Другой способ решения (сработает только для одного конкретного репозитория с адресом repo.mydomain.com) – добавить в тот же файл
[hostfingerprints] repo.mydomain.com = f8:85:d9:cb:b0:05:38:55:95:4e:74:a0:f9:3a:ba:5f:63:58:fd:b6
Дополнительная информация: http://mercurial.selenic.com/wiki
Также новичкам рекомендую посмотреть обучающее видео на тему эффективной работы с Mercurial:
Что-то у вас тут не клеится - в конфиге апача один путь (начинается с /var/www), а в hgweb.config - другой (начинается с /usr/hosting). Опечатка?
А если при push-е вылазит "remote: ssl required", то надо добавить в hgrc такое:
[web]
push_ssl = false
Дизайн, спасибо, поправил.
Коммитер без тестов позабавил :)