Насктройка сервера SVN используя Apache2

Перейти к: навигация, поиск

Введение

Система Subversion была разработана как непосредственная открытая замена для CVS, выстроенная «с нуля», чтобы решить многие проблемы своей предшественницы. Версия 1.01 была выпущена в марте 2004-го года. Во главе списка ее отличительных особенностей – контроль версий каталогов, который не может обеспечить CVS. Это ключевой момент, поскольку Subversion позволяет вам манипулировать каталогами таким же образом, как и файлами – переносить, переименовывать, копировать и удалять. Основанная на файлах структура CVS – причина ее еще одной большой проблемы. При фиксации изменений существует вероятность потерять соединение на полпути. В случае с CVS, результатом этого станет ситуация, когда половина файлов от разработчика будет обновлена, в то время как другая половина – нет, что не оставит администратору никакой возможности разобраться, какие файлы изменялись, а какие остались старыми. Решение, которое предлагает Subversion, заключается в том, что все изменения в репозитарии выполняются «атомарно». Это означает, что все изменения вносятся как единая транзакция, исключающая «полуобновление» файлов и двойную фиксацию. Это, наряду с другими существенными добавлениями («дешевые» ветвления и тэггинг, отличная поддержка двоичных форматов), сделает обновление, вернее переход на Subversion почти обязательным для пользователей CVS уже в ближайшем будущем, если уже не сделала.

Subversion доступна для загрузки с сайта http://Subversion.tigris.org под лицензией CollabNet/Tigris.org, которая аналогична лицензии Apache; Как только вы установите эту программу, вам, скорее всего, захочется задействовать ее для использования в своем собственном проекте.

Самый простой способ запустить и настроить Subversion на отдельном ПК - это использование file:// - протокол доступа к файловой системе вашего ПК. Однако скорее всего вы хотите настроить SVN так,чтобы можно было обращаться к репозиториям по протоколу svnserve или по протоколу http:// используя вебсервер Apache и специальный модуль web-dav, позволяющий установить взаимодействие SVN и Apache.

Установка програмного обеспечения и настройка

Установка програмного обеспечения

Для настройки совместной работы Apache и Subversion вам понадобится следующий набор пакетов: apache2, apache2-doc, apache2-prefork, libapr1, libapr-util1, subversion, subversion-server .

Обновите /etc/sysconfig/apache2 для добавления dav и dav_svn модулей в $APACHE_MODULES, для этого в консоли из под супер пользователя выполните друг за другом две команды:

 (su) a2enmod dav
 (su) a2enmod dav_svn

выполнив эти команды модули будут загружаться в дальнейшем вместе при старте вебсервера.

Настройка установленного ПО, конфигурирование

Подробнее о конфигурировании читайте в документации вашей SUSE: /usr/share/doc/packages/subversion/README.SuSE В этом файле, довольно подробно, но на английском, поясняется как создавать множество отдельных хранилищ (репозиториев) для каждого отдельного проекта или каталога файлов. Но в таком случае каждый такой репозиторий требует отдельной секции настроек в конфигурационном файле: /etc/apache2/conf.d/subversion.conf, как вы наверное уже догадываетесь, это основной файл конфигурирования репозиториев, если мы связываем их с Апачем, чем собственно мы тут и занимаемся. Отредактировать его вручную, в том случае если у вас много репозиториев и ими пользуется большое количество пользователей, представляется не очень удобным процессом. Это похоже на конфигурирование виртуальных хостов для сайтов. В общем получается что то типа виртуальных хостов для репозиториев. ====Внимание!==== Подход к конфигурированию связки в этой статье не описывает конфигурирование "виртуальных" репозиториев. Вместо этого мы конфигурируем один основной репозиторий, в котором в последующем и будут развиваться все проекты, разработку которых вы ведете или планируете вести!(однако такой подход может представлять собой в будущем некоторые проблемы безопасности, связанные с тем как и кому вы предоставляете права на работу с вашим репозиторием. ведь права создаются для пользователя и этот пользователь имеет в итоге права на все репозитории в головном репозитории, надеюсь, я понятно выразился, т.е. в этом варианте настройка прав доступа не достаточно гибка как того может захотется)

Настройка родительского хранилища (репозитория)

С помощь текстового редактора, kerite в данном случае, выполните от root команду, чтобы отредактировать файл: /etc/apache2/conf.d/subversion.conf:

 (su) kwrite /etc/apache2/conf.d/subversion.conf

это откроет текстовый редактор с правами на изменения в указанном файле, приведите его к виду как показано ниже:

 # Пример конфигурации для subversion репозитория
  # смотрите /usr/share/doc/packages/subversion для прочтения полной документации
  <IfModule mod_dav_svn.c>
  # Установить единый каталог репозиториев  'repos'
  # При этой конфигурации доступ на чтение репозиториев есть у всех, но при этом есть ограничения на запись в репозиторий, только пользователи которым это разрешено смогут записывать в репозиторий (commit)
  <Location /repos>
    DAV svn
    SVNParentPath /srv/svn/repos
    # Разрешить index страницу 'repos', которая будет содержать список всех существующих репозиториев
    SVNListParentPath On
    # Ограничение записи в список действительных (валидных) пользователей.
    <LimitExcept GET PROPFIND OPTIONS REPORT>
      # Требовать SSL соединение для защиты паролем.
      # SSLRequireSSL
      AuthType Basic
      # Message to give to the committer
      AuthName "Write access requires a password/для доступа на редактирование (commit) репозитория требуется пароль"
      # Файл с хэшами паролей и именами пользователей имеющих права на запись (commit) в репозиторий:
      AuthUserFile /srv/svn/user_access/svn_passwdfile
      Require valid-user
      #требование проверять валидность пользователя
    </LimitExcept>
  </Location>
  # Создать жесткие условия для одного каталога в 'repos' директории:
  # 'Secret_repo' имеет ограниченный доступ на запись, а также ограниченный доступ для чтения.
  <Location /repos/secret_repo>
    Require valid-user
  </Location>
  </IfModule>

Без директивы SVNListParentPath вы не сможите зайти на главную страницу репозиториев (index), вместо этого вы получите примерно такой ответ:

 Access forbidden!
  You don't have permission to access the requested directory. There is either no index document or the directory is read-protected. 
  If you think this is a server error, please contact the webmaster. 
  Error 403

что означает, как вы наверняка догадываетесь примерно следующее:

 Доступ запрещен! 
   У вас нет разрешения на доступ к запрашиваемому каталогу. Существующий или нет индекс документа или каталог защищены от чтения.  
   Если вы считаете, что это ошибка сервера, пожалуйста, обращайтесь к веб-мастеру.  
   Ошибка 403.

Итак, создаем родительский каталог для хранилища:

 (su) mkdir -p /srv/svn/repos

Настройка пользовательского доступа к родительскому хранилищу.

Следует заметить, что мы используем только один пользовательский пароль занесенный в файл паролей. Однако, это может быть скорректировано написанием дополнительных параметров к отдельным каталогам в секции Secret_repo файла конфигурации, который приведен выше. И.. поехали... Создать файл паролей:

 (su) mkdir /srv/svn/user_access
 (su) touch /srv/svn/user_access/svn_passwdfile

Изменяем группы так, чтобы Апач смог получить доступ к нему (файлу паролей):

 (su) chown root:www /srv/svn/user_access/svn_passwdfile

Установка прав чтения-записи на файл:

 (su) chmod 640 /srv/svn/user_access/svn_passwdfile

Добавляем в файл паролей пользователя с именем "username":

 (su) htpasswd2 /srv/svn/user_access/svn_passwdfile username

В консоли вас попросят ввести пароль для этого пользователя, введите его дважды. Теперь перезапустите Apache:

 (su) rcapache2 restart

После того как Апач удачно перезагрузится, вы будите иметь доступ к вашему родительскому репозиторию по адресу: http://localhost/repos , но конешно в нем пока ни чего нет, кроме примерно этого: Collection of Repositories Powered by Subversion version 1.5.2 (r32768).., что и понятно, ведь мы еще ни чего не положили в репозиторий. Сейчас мы этим и займемся...

Создание репозитория для вашего проекта, например "proekt1"

Создадим директорию для нашего SVN репозитория под проект, например "proekt1" и изменим права:

 (su) svnadmin create /srv/svn/repos/proekt1

Следующий шаг зависит от того какой версии у вас Subversion. Если у вас версия Subversion >= 1,5, то выполните такие команды:

 chown -R wwwrun:www /srv/svn/repos/proekt1/{db,locks}
 chown wwwrun:www /srv/svn/repos/proekt1/

Если же у вас более старая версия, т.е. Subversion < 1,5, то выполните эту команду:

 chown -R wwwrun:www /srv/svn/kdrepos/meddaliadur/{dav,db,locks}

Теперь мы с вами создали репозиторий для первого проекта: http://localhost/repos/proekt1 и название у этого репозитория соответственное: "proekt1" Но в нашем только что созданном репозитории по прежнему ничего нет, как его заполнить написано чуть ниже.

Первичный импорт в репозиторий proekt1

Импорт нового проекта: Создадим каталог: /srv/svn/repos/proekt1/files и положим туда какой нибудь простой текстовый файлик... Теперь импортируем этот каталог с файлом в репозиторий выполнив команду:

 svn import /srv/svn/repos/proekt1/files http://localhost/repos/proekt1 -m "initial import"

Если вы попытаетесь импортировать в репозиторий каталог которого не существует, то вы получите сообщение примерно такого вида:

 svn: PROPFIND request failed on '/repos/proekt1'
 svn: Could not open the requested SVN filesystem

Поэтому, пожалуйста, будьте внимательны в этот момент. Теперь если вы посмотрите в родительский репозиторий по адресу: http://localhost/repos то вы там должны увидеть ссылку на только что импортированный репозиторий проекта "proekt1" щелкнув по ссылке на этот проект, вы перейдете в репозиторий, который только что импортировали и увидите в нем тот самый файлик, который положили в директорию files. Это означает, что на данном этапе все в порядке.

Проверка рабочей копии репозитория "proekt1"

И так, вы должны помнить что технология которая описывается тут основывается по принципу "клиент-сервер" Серверную часть мы уже настроили выше. Теперь надо настроить клиентскую часть, т.е. сделать у клиента каталог для рабочей копии в которой он будет делать изменения проекта, и потом эти изменения он будет заливать на сервер в репозиторий проекта. Начнем... Переходим в локальный каталог, в котором вы будите работать над локальной копией репозитория, ее еще называют рабочей копией. Возможно это будет каталог /public_html в случае если вы занимаетесь веб разработками, а может быть и любой другой удобный для вас. для этого выполняем команду:

 cd /home/USER_NAME/public_html
 svn checkout http://localhost/repos/proekt1

Выполнив последнюю команду вы говорите серверу: залей мне из репозитория на сервере рабочую копию для редактирования в эту директорию... и сервер должен послушно залить копию к вам в каталог. Таким образом у вас появилась актуальная копия репозитория proekt1 и будет она находится в ~/public_html/proekt1. Теперь переходим в каталог с новой рбочей копией и выполняем ряд команд:

 cd /home/USER_NAME/public_html/proekt1
 svn list --verbose  # Обзор какие файлы были проверены
 svn info  # Получить краткую информацию об этой рабочей копии
 cat > info.txt  # Попробуйте добавить новый файл info.txt к рабочей копии 
 Это новый файл - newfile # Нажмите Enter, а затем Ctrl-D, чтобы написать этот текст в файле info.txt 
 cat info.txt  # рассмотреть новый файл, или проще говоря, прочитать его из рабочей копии.
 svn add info.txt  # Сообщить Subversion что новый файл был создан.

Вы должны будите получить ответ такого вида:

 A         info.txt
 
 svn commit info.txt  # Добавлен (Commit) новый файл в репозиторий proekt1 на сервере.

В этот момент svn попросит прокомментировать изменения (см. ниже) и попросит ввести пароль, в итоге вы должны будите увидеть в консоли вот это:

 Adding         info.txt
  Transmitting file data .
  Committed revision 2.

По умолчанию для комментирования изменения репозитоия SVN пользуется консольным редактором VI однако, если вы не знаете как им пользоваться или вам удобнее пользоваться другой программой - редактором, то вы вполне можите изменить это откорректировав соответствующим образом файл конфигурации: /home/USER_NAME/.subversion/config раскомментировав строчку

 #editor-cmd = vi (что то тут) 

и приведя ее к виду:

 editor-cmd = kwrite

если вы предпочитает использовать графическую программу редактирования текстов Kwrite. В последующем в итоге для коментирования будет открываться ваш любимый редактор и вы сможите привычным для вас образом вписать в файл ваш комментарий.

А пока у нас стоит VI и если вы не знаете как им пользоваться то просто наберите:

 :wq! 

и выбирите вариант, я выбираю вариант

 a

Это позволяет отказаться от редактирования в VI. теперь вводим команды:

 svn commit info.txt -m "My first commit мой первый коммит (изминение репозитоия)"

Это теперь зальет вашу рабочую версию файла на сервер SVN и теперь этот фай станет доступным для других разработчиков проекта proekt1. Вот собственно и все. почти. Если вы хотите продолжить работу над проектом proekt1 и не уверены в актуаьности вашей рабочей копии, то обновите ее загрузив к себе на рабочее место актуальную версию проекта с репозитория, предварительно не забудьте в консоли перейти в какталог в котором находится рабочая копия проекта! Выполняется это простой командой:

 svn update

Вот теперь все. Если у вас все получилось, значит все настроено правильно и работает, однако если что то не получается это еще не значит, что установили и настроили не правильно, вполне может быть, что вы ошибаетесь с набором команд, как собственно было у меня, по началу.

Заключение

В этой статье описано как настроить сервер SVN и связать его с вебсервером Apache. Рассказано о том как создать репозиторий и как залить в него свой проект, так же описано как изменять фйлы проекта, все это описано с применением как инструмента консоли и редактора, либо консольного VI либо вашего лбимого.ю например Kwrite. Существует множество клиентов для доступа к SVN позволяющих выполнять все выше указанные и другие команды в более привычном, графическом режиме, без привличения консоли, однако описание таких клиентов и их работы это уже другая тема.

Актуальность

Статья написана и проверена на основе OpenSUSE11.1 с графической оболочкой KDE4.2 и Subversion 1.5.2

--Stasroot1 08:53, 7 мая 2009 (UTC)