9 июл. 2010 г.

Установка связки Subversion+Apache Ubuntu 9.10

Как говорится - по просьбам телезрителей статья в 2х словах как настроить SVN сервер на Ubuntu. Если интересно - вэлкам под кат...

Установка пакетов

Так как сейчас у большинства стоит бубунта её и возьмем за основу. Поставим для начала клиент для svn:

$sudo apt-get install subversion

Будем делать доступ к SVN через apache. Поставим еще пакет:

$sudo apt-get install libapache2-svn
$sudo /etc/init.d/apache2 restart

Создание репозитория

У нас есть поддержка SVN в apache2. Настроим какой нибудь репозиторий.
Попробуем создать каталог, который у нас будет являтся репозиторием.

$sudo mkdir -p /opt/svn/test1
затем нужно сделать его репозиторием командой "svnadmin create":
$sudo svnadmin create /opt/svn/test1/
теперь в каталоге /opt/svn/test1 находится наш репозиторий (чистый). По правильному этому каталогу и всему содержимому нужно присвоить владельца и группу от которых работает апач, но что б не морочить голову, сделаем проще:
$sudo chmod -R 777 /opt/svn/test1
(Для тех кто забыл: коммандой chmod -R 777 ... мы присваем каталогу и всем его файлам режим на чтение/запись/исполнение - для всех)

Прописываем репозиторий в apache2

Далее... нам нужно прописать этот репозиторий к нашему хосту, если у вас есть настроенные виртуальные хосты, выбираете нужный вам и правите, все остальные правят /etc/apache2/sites-available/default, добавляем в самом конце:

....
<Location /svn/test1>
  DAV svn
  AuthType Basic
  Require valid-user
  AuthUserFile /opt/svn/passwords

  AuthName         "svn::test1"
  SVNPath         /opt/svn/test1/
  AuthzSVNAccessFile    /opt/svn/test1/conf/authz
</Location>
</VirtualHost>

По порядку что мы сделали:
В тэге Location мы указываем на какой адрес будет отвечать наш svn репозиторий, в данном примере http://127.0.0.1/svn/test1.
AuthUserFile путь к файлу паролей (мы его чуть ниже создадим)
AuthName что пользователю выводить когда запрашиваем пароль, тут можно писать например "mega secret project"
SVNPath где находится репозиторий
AuthzSVNAccessFile правила доступа к репозиторию

Едем дальше... нам нужно создать файл паролей, можно конечно создавать для каждого репозитория отдельно, но как по мне это глупо. Лучше создать 1 файл для всех svn репозиториев (если у вас их предвидется много) и если кто-то из пользователей забыл пароль - изменить его в одном месте будет проще. Для создания пароля заходим в каталог /opt/svn и с помощью htpasswd создаем нужный файл.

$cd /opt/svn
$sudo htpasswd -cb passwords user1 qwerty
Естественно логин и пароль заменить на свои.
Если нужно еще кого либо добавить, пишем:
$sudo htpasswd -b passwords user2 asdf

файл паролей есть, переходим к правилам доступа:

$cd /opt/svn/test1/conf/
по умолчанию этот файл содержит уже пример конфигурации, но мы создадим такой:
[/]
user1=rw
user2=r
собственно тут мы указали что user1 - может и писать и читать, а пользователь user2 - может только читать. С помощью этого файла можно "гибко" разграничивать людей на группы, давать доступ только к части репозитория.

Небольшая ремарка

Представим себе ситуацию, есть проект, есть владелец проекта god и 2 подчиненных: user1 и user2. Задачи user1 и user2 в поддержке и внесении изменений в проект, но отвечает за все эти изменения god. Нужно сделать так, что бы в /trunk мог писать только god, а в ветки - сотрудники. Пишем файл доступа:

[/]
god=rw
user1=r
user2=r
[/branches]
user1=rw
user2=rw
Теперь предположим god дает задание:
user1 - сделать задание1, а user2 должен сделать задание2. Каждый из них создает себе ветку в /branches. При создании ветки, они полностью по сути копируют текущее состояние /trunk, например:
user1 -> /branches/1user_001
user2 -> /branches/2user_001
и ведут свою разработку, комитят скока угодно раз.
1. они не мешают друг другу
2. если зашли в тупик или как часто бывает "не знаю из-за чего не компилится" прибивается ветка и создается другая и вней ведется разработка задачи сначала - не трогая основной проект.

как только допустим user2 закончил работу, он сообщает god'у что работа сделана, god через IDE или консольными командами может сделать merge в /trunk из ветки /branches/2user_001, причем перед тем как вносить изменения в /trunk - он может просмотреть "все изменения" которые внес user2. Затем если все впорядке - делает коммит /trunk ветки, если нет может откатить эти изменения.
Допустим все хорошо, и в /trunk обновлены данные. Теперь user1'у говорят: "обновись из /trunk'а тут много изменений", он делает merge из /trunk в /branches/1user_001, после этого в его ветке будут изменения из /trunk и те которые он до этого написал. Когда он закончит работу - сценарий выше.
Возможна ситуация когда 2 и более программиста будут работать в одной ветке - это тоже никак не противоречит системе. Т.е. вариантов использования ОЧЕНЬ много.

Пробуем запускать.

$sudo /etc/init.d/apache2 restart
для проверки, открываем браузер и вводим:
http://127.0.0.1/svn/test1 вводим логин и пароль который создавали и должны увидеть что-то вроде:
test1 - Revision 0: /
Powered by Subversion version 1.6.5 (r38866).
если нет, смотрим ошибки апача.

Комментариев нет: