Subversion – это система контроля версий и изменений в файлах. Она позволяет хранить всю историю изменений контролируемых объектов и восстанавливать данные с любой фиксированной точки. Subvesion активно используется при Web-разработке.
В статье используются CentOS 6.0 и SubVersion 1.6.11
1. Введение
В интернете я видел множество статей о SubVersion описывающих как настроить аутентификацию пользователей, как защитить передаваемые через интернет данные, где лучше расположить репозиторий. Вариантов много, но в подавляющем большинстве случаев схема сводится к рисунку приведенному ниже.
В хранилище Subversion хранятся рабочие данные и все изменения производимые с ними. К этому хранилищу можно получить доступ через файловую систему, через svn+ssh соединение или по протоколу http, поэтому хранилище может располагаться в любом месте. Что бы начать работать с веб-сайтом нужно загрузить в хранилище данные при помощи svn import, и впоследствии восстанавливать нужную версию (ревизию) при помощи svn export. Веб-дизайнер или программист создает копию репозитория при помощи svn checkout, вносит изменения и передает их на сервер командой svn commit, для получения последних изменений используется команда svn update.
Преимущество такого подхода состоит в том что всегда можно восстановить работоспособную версию веб-сайта, а программисты или веб-дизайнеры работают с локальной копией (обычно на ней базируется веб-сайт с другим именем) и не затрагивают основной проект, всегда можно просмотреть кто и какие изменения вносил.
2. Установка
Самая простая часть работы с SubVersion – это установка. Устанавливаем:
[root@svnsrv ~]# yum install subversion
Создаем директорию для репозиториев:
[root@svnsrv /]# mkdir /var/www/svn
Это корневая директория и в ней будут располагаться все наши проекты.
3. Основные приемы работы
Все примеры приводятся на локальном репозитории к которому мы получаем доступ через файловую систему, о настройке и работе через удаленное соединение я расскажу ниже. Документы веб-проекта mysite.ru находятся в папке /sites/mysite.ru/html, создадим для него репозиторий SubVesion:
[root@svnsrv ~]# mkdir -p /var/www/svn/mysite.ru [root@svnsrv ~]# svnadmin create /var/www/svn/mysite.ru
Загружаем данные в репозиторий:
[root@svnsrv ~]# svn import /sites/mysite.ru/html file:///var/www/svn/mysite.ru -m "Startup svn for www.mysite.ru" Adding /sites/mysite.ru/html/index.html Committed revision 1.
После параметра -m [--message] идет пояснение к производимому действию, этот параметр обязательный и будет присутствовать во всех командах записи в репозиторий. Текущая ревизия (версия) данных 1 и внутри лежит один файл index.html содержащий следующий текст:
[root@svnsrv ~]# cat /sites/mysite.ru/html/index.html Firsh page in my site
Просмотреть файлы в репозитории можно про помощи команды
[root@svnsrv ~]# svn list file:///var/www/svn/mysite.ru index.html
Загружаем из репозитория данные для работы:
[root@svnsrv ~]# svn checkout file:///var/www/svn/mysite.ru A mysite.ru/index.html Checked out revision 1.
В текущей директории появилась папка mysite.ru с данными проекта, те с файлом index.html. Переходим в директорию mysite.ru и вносим небольшие изменения в этот файл.
[root@svnsrv ~]# cd mysite.ru [root@svnsrv mysite.ru]# echo "<h1>My Header</h1>" >> index.html
Просматриваем список изменений:
[root@svnsrv mysite.ru]# svn status M index.html
Буква M перед именем файла означает, что данный файл был модифицирован и изменения пока еще не переданы в репозиторий. Подтверждаем изменения:
[root@svnsrv mysite.ru]# svn commit -m "Modify header in index.html" Sending index.html Transmitting file data . Committed revision 2.
С данными мы поработали, теперь нужно можно применить их к основному проекту:
[root@svnsrv mysite.ru]# svn export file:///var/www/svn/mysite.ru /sites/mysite.ru/html --force A /sites/mysite.ru/html A /sites/mysite.ru/html/index.html Exported revision 2.
Вернуться к предыдущей ревизии можно при помощи следующей команды, где -r1 – номер ревизии:
[root@svnsrv mysite.ru]# svn export file:///var/www/svn/mysite.ru /sites/mysite.ru/html --force -r1 A /sites/mysite.ru/html A /sites/mysite.ru/html/index.html Exported revision 1.
На первый взгляд кажется сложно-неудобно, очевидно что с любой новой системой нужно поработать и немножко набить под нее руку. Я не предлагаю своим веб-дизайнерам или программистам запоминать длинные строчки – для них предусмотрен доступ по ssh и есть пара простых скриптов формата get.- получить данные и send.- отправить данные в репозиторий. При помощи SubVersion очень удобно хранить историю изменений в больших конфигах и бэкап-скриптах на серверах, небольшой bash-скрипт для выполнения функции svn commit и готово.
4. Доступ к репозиторию
Кроме файлового метода доступ к репозиторию Subvesion можно получить при помощи протоколов https и ssh+svn. Оба протокола защищают передаваемую информацию при помощи шифрования. Есть и другие методы подключения к репозиторию, но они менее безопасные.
4.1 Доступ через HTTP/HTTPS
При организации доступа по протоколам HTTP/HTTPS для авторизации пользователей мы будем использовать учетные данные из файлов htpasswd никак не связанные с системными пользователяеми. Это может быть очень удобными, когда мы хотим предоставить доступ к репозиторию сторонней организации и не хотим при этом давать излишние права доступа. Для примера приведу настройку для протокола HTTP, он не является защищенным, но принцип настройки HTTPS и HTTP остается одинаковым, разница лишь наличии сертификата и типа шифрования.
Устанавливаем компоненты:
[root@svnsrv mysite.ru]# yum install httpd mod_dav_svn
Приводим файл /etc/httpd/conf.d/subversion.conf к следующему виду:
LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /repos> DAV svn SVNParentPath /var/www/svn SVNListParentPath on AuthType Basic AuthName "Authorization Realm" AuthUserFile /var/www/svn/htpasswd Require valid-user </Location>
Следующей командой мы создаем файл содержащий учетные данные пользователей для Apache, добавляем туда первого пользователя user1 и задаем его пароль:
[root@svnsrv conf.d]# htpasswd -c /var/www/svn/htpasswd user1 New password: Re-type new password: Adding password for user user1
Если нужно добавить еще одного пользователя – вызываем туже самую команду без параметра -c:
[root@svnsrv conf.d]# htpasswd /var/www/svn/htpasswd user2 New password: Re-type new password: Adding password for user user2
Даем пользователю apache разрешения на каталог /var/www/svn
[root@svnsrv conf.d]# chown -R apache:apache /var/www/svn
В случае если используется SELinux, восстанавливаем защитный контекст:
[root@svnsrv conf.d]# restorecon -v -R /var/www/svn
Запускаем Apache:
[root@localhost ~]# service httpd start Starting httpd: [ OK ]
Переходим к проверке. В качестве клиентского компьютера который должен получить доступ к репозиторию я использую ноутбук с Ubuntu 11.10, адрес сервера 192.168.20.104. Получаем локальную копию данных репозитория:
alsigned@home-desk:~$ svn checkout http://192.168.20.104/repos/mysite.ru --username user1 Authentication realm: <http://192.168.20.104:80> Authorization Realm Пароль для 'user1': A mysite.ru/index.html Получена редакция 2.
После параметра –username вводится имя пользователя, которое мы задали при помощи команды htpasswd, а затем при запросе вводится пароль. В дальнейшем он сохраняется и все операции можно проводить уже без ввода пароля. Для примера внесем небольшие изменения в файл проекта и передадим их на сервер:
alsigned@home-desk:~$ cd mysite.ru alsigned@home-desk:~/mysite.ru$ echo "Ubuntu desktop string" >> index.html alsigned@home-desk:~/mysite.ru$ svn commit -m "Ubuntu edit" Посылаю index.html Передаю данные . Создана редакция 3.
Как видно сейчас у нас изменился метод взаимодействия с репозиторием SubVersion, но сложность в сравнении с файловым вариантом никак не увеличилась, единственное нужно настраивать Apache, пользователей и сертификаты в случае с HTTPS.
4.2 Доступ через SSH
Это наиболее распространенный способ удаленного подключения к репозиторию SubVersion. Он удобен тем что для его использования нужны минимальные настройки и можно использовать одни и те же учетные данные для доступа к SubVersion, доступа к консоли через ssh-подключение и к примеру доступа к SFTP-серверу. Но есть и недостастаток – разные версии SubVersion установленные на клиенте и сервере не всегда работают и не всегда работают правильно, те в идеале версия на клиенте должна совпадать с версией на сервере.
Добавляем в систему пользователя user1 и задаем для него пароль:
[root@svnsrv ~]# useradd user1 [root@svnsrv ~]# passwd user1 Changing password for user user1. New password: Retype new password: passwd: all authentication tokens updated successfully.
Переходим к клиентскому компьютеру – у меня это опять ноутбук с Ubuntu 11.10, адрес сервера 192.168.20.104. Что бы при каждом взаимодействии с репозиторием не забивать пароль пользователя user1 – копируем открытый ключ на удаленный сервер:
alsigned@home-desk:~$ ssh-copy-id user1@192.168.20.104 user1@192.168.20.104's password:
Получаем локальную копию репозитория:
alsigned@home-desk:~$ svn checkout svn+ssh://user1@192.168.20.104/var/www/svn/mysite.ru A mysite.ru/index.html Получена редакция 4.
Для примера вносим небольшие изменения в файл проекта и передаем их на сервер:
alsigned@home-desk:~$ cd mysite.ru alsigned@home-desk:~/mysite.ru$ echo "Ubuntu desktop string ssh+svn" >> index.html alsigned@home-desk:~/mysite.ru$ svn commit -m "Ubuntu edit ssh+svn" Посылаю index.html Передаю данные . Создана редакция 5.
Так же как и в примере с HTTPS в сравнении с файловым вариантом сложность осталась прежней, а из настроек мы добавили системного пользователя и передали на сервер открытый ключ для SSH.
5. Просмотр изменений при помощи WebSVN
Выше я описал как можно импортировать, экспортировать, изменять или восстанавливать данные в репозитории SubVersion, в случае если нужно например сравнить две ревизии или посмотреть кто и какие изменения сделал намного удобнее использовать графические утилиты. Я пользуюсь веб-интерфейсом написанными на PHP под названием WebSVN, последнюю версию можно скачать по адресу http://websvn.tigris.org/servlets/ProjectDocumentList.
Устанавливаем Apache и PHP:
[root@svnsrv ~]# yum install httpd php53
Скачиваем архив:
[root@svnsrv ~]# wget http://websvn.tigris.org/files/documents/1380/49056/websvn-2.3.3.tar.gz
Распаковываем его и копируем в директорию /var/www/html/websvn:
[root@svnsrv ~]# tar zvxf websvn-2.3.3.tar.gz [root@svnsrv ~]# mkdir /var/www/html/websvn [root@svnsrv ~]# cp -R websvn-2.3.3 /var/www/html/websvn
Переходим в папку include и копируем файл distconfig.php в файл conifig.php. В файле distconifig.php содержатся варианты настроек для WebSVN – нам остается только раскомментировать нужные и перенести в config.php.
[root@svnsrv ~]# cd /var/www/html/websvn/include [root@svnsrv ~]# cp distconfig.php config.php
Для начала работы вполне достаточно добавить в config.php следующую строчку, описывающую расположение репозитория в файловой системе:
$config->parentPath('/var/www/svn');
Если настройки Apache сделаны по-умолчанию, то набрав в браузере http://адÑеÑ_ÑеÑвеÑа/websvn мы перейдем в интерфейс WebSVN.
3 Коммент. : “Настройка SubVersion”
Отличная статья. Не против, если утащу к себе в блог, чтобы не потерялась?
Привет, SarAdmin.
Я не люблю когда информацию и статьи копируют сайта на сайт, чтобы интернет становился лучше нужно, что бы каждый вносил туда, что-то свое индивидуальное.
большое спасибо за статью!