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”

  1. Отличная статья. Не против, если утащу к себе в блог, чтобы не потерялась?

  2. Привет, SarAdmin.

    Я не люблю когда информацию и статьи копируют сайта на сайт, чтобы интернет становился лучше нужно, что бы каждый вносил туда, что-то свое индивидуальное.

  3. arucard пишет:

    большое спасибо за статью!

Оставить комментарий