SVN w Debianie bo ile można nosić kod ze sobą

Posiadanie własnego serwera daje szereg możliwości. Jedną z nich jest jedno miejsce ze wszystkimi usługami, do którego możemy dostać się zewsząd. W przypadku programisty to chyba jego kod jest najbardziej pożądanym dobrem – zatem jego dostępność jest sprawą nie do przecenienia.

By nie komplikować za bardzo postanowiłem postawić repozytorium SVN – bardzo popularnego systemu kontroli wersji, dobrze obsługiwanego zarówno pod Windowsem jak i linuxem. W związku z tym, iż pracuję na tych dwóch systemach możliwość łatwej obsługi jest dla mnie szczególnie istotna. Zatem w konsoli klepiemy:

sudo apt-get install subversion

I po chwili możemy cieszyć się naszym systemem kontroli wersji. Dostęp do niego zapewnimy sobie przez natywny protokół SVN. Teraz musimy umieścić gdzieś nowe zupełnie repozytorium, a także nadać prawa do korzystania z niego. W sumie jestem jedynym użytkownikiem serwera, zatem mógłbym zainstalować repozytorium w swoim katalogu domowym. Jednakże nie jest to dobre rozwiązanie – bezpieczniej byłoby stworzyć oddzielnego użytkownika tylko dla dostępu do repozytorium. Bezpieczniej i w sumie wygodniej. Lecimy zatem:

adduser svn

Automatycznie jest tworzony użytkownik oraz grupa o takiej samej nazwie. Repozytorium zainstalujemy w katalogu domowym usera svn, jednakże to za chwilkę. Należy zastanowić się nad dość istotną rzeczą. Otóż póki co zamierzamy wysłać do repozytorium kod źródłowy, który znajduje się na razie na moim dysku twardym. Czyli nie jest to plik WAR, ani nawet rozpakowane na serwerze pliki – muskmy wrzucić całość projektu Netbeans, który mamy u nas na serwerze. Zasadniczo byłoby najwygodniej po prostu przekopiować zawartość katalogu z projektem na serwer, ale trochę to takie… nieeleganckie 🙂 Zresztą jak się okazuje, nasze IDE z taką sytuacją upora się dość szybko i łatwo.

W katalogu usera svn tworzymy katalog, w którym będziemy trzymać nasz kod.


mkdir repos
cd repos
mkdir programbash
svnadmin create /home/svn/repos/programbash

Rzecz jasna najlepiej tego typu zabiegi dokonywać kiedy jesteśmy zalogowani jako użytkownik user. W przeciwnym razie czeka nas rekursywne nadanie uprawnień do katalogu repos/programbash właśnie temu użytkownikowi. Kiedy mamy katalog, który docelowo ma trzymać nasze (tutaj konkretne dla projektu) repozytorium należałoby je skonfigurować. Przechodzimy do naszego utworzonego repozytorium i zaglądamy do katalogu conf. Należy poddać edycji plik conf/svnserver.conf:

anon-access = none # tylko zalogowani userzy moga laczyc sie z repo
auth-access = write # userzy moga szalec
password-db = passwd # czyli dostep dla par user-haslo

Zgodnie z ostatnim zapisem w tym pliku poddajemy teraz edycji plik passwd w tym samym katalogu:

[svn] = [nasze_tajne_haslo]

I tyle konfiguracji. Należy omówić teraz budowę repozytorium – głównym jego katalogiem jest trunk, gdzie leży główna część naszego kodu. Do tego elementami repozytorium SVN są katalogi branches oraz tags. Przynajmniej taką strukturę zaleca nam dokumentacja SVNa i akurat tutaj zgódźmy się na takie rozwiązanie. Jednakże katalogi te nie są tworzone automatycznie przez SVNa zatem musimy dodać je sami. By to osiągnąć należy przejść do katalogu /tmp (wybrałem go tylko dlatego, że na pewno jest tam dostęp i potem będziemy mogli jego zawartość wyczyścić) i wydać takie polecenie:

svn co file:///home/svn/repos/programbash

I powinniśmy otrzymać następujący komunikat:

Checked out revision 0.

Konkretnie w tej chwili stworzyliśmy obraz repozytorium w wybranej przez nas lokalizacji. Dzięki temu na spokojnie dodamy wskazane katalogi:

mkdir trunk
mkdir tags
mkdir branches
svn add trunk
svn add tags
svn add branches

W ten sposób utworzone katalogi zostały wybrane do włączenia ich do systemu kontroli wersji. Teraz wypadałoby je do niego wysłać:

svn commit -m "Pierwszy commit - dodanie katalogow repozytorium"

I możemy sobie obejrzeć efekt:

Adding branches
Adding tags
Adding trunkCommitted revision 1.

Nasz pierwszy commit zakończył się powodzeniem (katalog w /tmp możemy usunąć). W naszym repozytorium istnieje już odpowiednia struktura katalogów i czeka na wypełnienie treścią. By to osiągnąć musimy udostępnić nasze repozytorium na zewnątrz. Istnieje kilka możliwości – udostępnianie poprzez protokół HTTP (do tego potrzebne jest dokonfigurowanie serwera WWW), posługiwanie się protokołem SSH (również konfiguracja), albo też natywnym protokołem dla SVN i to rozwiązanie zastosujemy. Za komunikację po ww. protokole odpowiada demon (program może być uruchomiony jako demon) o nazwie svnserve. Jest on automatycznie instalowany wraz z SVN, zatem nie trzeba instalować nic dodatkowego. Demon ten nasłuchuje domyślnie na porcie 3690. Uruchamiamy go w ten sposób:

svnserve -d -r /home/svn/repos

Wskazujemy, że działamy jako demon (-d), a także wskazujemy na roboczy katalog. Dzięki wskazaniu na repos nasz demon obsłuży wszystkie repozytoria jakie kiedykolwiek przyjdzie nam do głowy dodać. Rzecz jasna przydałoby się dodać uruchamianie tego demona przy starcie systemu poprzez edycję skryptów startowych. Na razie jednakże skupmy się na zaimportowaniu plików do repozytorium. Uruchamiamy Netbeans (zakładam, że pluginy do obsługi SVN zostały zainstalowane) i klikamy prawym przyciskiem myszy na projekcie, który zamierzamy wysłać do repozytorium, po czym wybieramy Versioning -> Import into Subversion repository tak jak poniżej:

W pojawiąjacym się okienku wpisujemy:

svn://chlebik.pl/programbash/trunk

Wpisujemy też rzecz jasna użytkownika i hasło po czym klikamy na Next i następuje (powinno 🙂 połączenie z serwerem. Przy naszej strukturze repozytorium (każdy projekt będzie posiadał oddzielny katalog) katalog trunk jest głównym, zatem to właśnie jego wskazujemy jako cel importu. Musimy również wpisać komunikat związany z tym importem i klikamy Next.

Po chwili powinniśmy zobaczyć taki ekran:

I ostatecznie nacisnąć na przycisk Finish. Akurat Programbash trochę waży, zatem w zależności od szybkości łącza internetowego wysłanie wszystkich plików na serwer może trochę potrwać. Ostatecznie w zakładce Output otrzymałem taki komunikat:

Transmitting file data ...
Committed revision 2.
update D:/Java/programbash2 -r HEAD --depth=files --force
At revision 2.
==[IDE]== 2010-02-15 01:14:21 Committing... finished.

Czyli zasadniczo wszystko OK. Sprawdźmy czy wszystko jest na pewno w porządku. Użyłem do tego Eclipse, aby nie mieszać w Netbeans. Odpalamy IDE, tworzymy nowy projekt, wybieramy jako typ SVN -> Checkout project , dodajemy nową lokację repozytorium, podajemy stosowne dane i Eclipse uruchamia kreatora projektu. Zakładam rzecz jasna, że nasz Eclipse posiada plugin do obsługi SVNa – polecam Subclipse. U mnie projekt zaimportował się bez najmniejszych przeszkód i tym samym dowiodłem, że repozytorium działa 🙂

Rzecz na koniec dość istotna – do repozytorium dodałem z premedytacją pliki projektu Netbeans. Standardowo nie robi się tego w ten sposób – jakiekolwiek szczegóły deploymentu aplikacji powinny zostać pominięte w repozytorium. Dzięki temu nie śmiecimy w nim plikami potencjalnie różnymi u każdego programisty. Jednakże zasady tutaj panujące powinny być uzgodnione przez użytkowników repozytorium. W tym przypadku ja będę jedynym, zatem pozwoliłem sobie na taką małą frywolność 🙂

Advertisements

6 thoughts on “SVN w Debianie bo ile można nosić kod ze sobą

  1. Bartek

    Dzięki za pomocny artykuł. Po nim korzystam z svn w NetBeansie dzięki demonowi svn. Wcześniej próbowałem odpalić svn przy użyciu svn zintegrowanego z Apachem. Nie wiem tylko czemu wszyscy piszą o tej integracji jeśli ona jest trudniejsza, a dwa to, że nie każdy używa Apache.
    Co do łatwości korzystania z artykułu to muszę ocenić ją wysoko. Wszystko na tacy. Zamotałem się tylko przy “mkdir trunk
    mkdir tags
    mkdir branches
    svn add trunk
    svn add tags
    svn add branches” Jakiś czas to nie działało, bo wszedłem do katalogu, który wcześniej pobrałem.

  2. Łukasz

    Świetny artykuł – bez kitu – wszystko przydatne, a jak!. Proponuję żebyś dodał jak wrzucić w autostart uruchamianie demona svn’a.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s