• Ubuntu 12.04 Precise Pangolin에서 Test 완료 (2012-05-21)
  • Ubuntu 11.10 Oneiric Ocelot에서 Test 완료 (2011-12-05)

Subversion은 CVS를 대체하기 위해 만들어진 형상관리 Tool(Version Control System)로 지금은 Apache Foundation에서 Project를 관리하고 있습니다.

간단하게 말하면, Subversion은 다수의 Programmer가 하나의 Project를 개발할 때 서로가 개발하는 부분에 대한 충돌이 없도록 Source를 관리하고 공유할 수 있게 도와주는 Software입니다.

물론 개인이 혼자 개발한다 하더라도, 현재 Source를 이전 Version으로 변경하고 싶을 때나 Backup을 위해서도 유용하게 사용됩니다.

이번 Post에서는 Ubuntu Natty Narwhal 11.04에서 Subversion Server를 구성하는 방법과 간단한 사용방법을 알아보도록 하겠습니다.

1. Subversion 설치

Ubuntu에서 Subversion을 설치하는 방법은 간단합니다. 아래와 같이 Terminal에서 입력합니다.

1
$ sudo apt-get install subversion

Subversion Server를 구성하기 위해서는 Subversion을 사용할 계정을 위한 Group을 생성하고, Group의 Default 계정을 설정해야 합니다. 다음과 같이 Terminal에서 입력합니다.

1
2
$ sudo groupadd subversion
$ sudo usermod -a -G subversion www-data

www-data는 기본적으로 System에 생성되어 있는 Login을 할 수 없는 User로 원래 Apache HTTP Server와 같은 Web Service를 위해 사용되는 계정입니다. 이 계정을 Default로 사용해서 Subversion 저장소를 생성하게 됩니다.

이제 Subversion 저장소(각 Project의 저장소가 저장될 최상위 Directory)를 아래와 같이 입력하여 생성합니다.

1
2
3
$ sudo mkdir /home/svn
$ sudo chown www-data:subversion /home/svn
$ sudo chmod g+rws /home/svn

Subversion 저장소의 위치는 취향에 따라 다른 곳에 설정해도 됩니다. 보통 /srv/svn, /usr/local/svn 등을 사용하는데 /home/svn을 대부분 많이 사용하는 것 같습니다.

이제 저장소의 위치도 지정했다면 Subversion을 사용해 봅시다. Subversion 저장소에 접근하는 Protocol에 따라 설정방법이 조금씩 차이가 있는데, 여기에서는 여러 Protocol 중 Subversion 고유 Protocol인 svn://와 SSH Tunneling을 이용하는 svn+ssh://일 경우에 대해서 알아보겠습니다.

2. svn:// Protocol을 사용할 경우

svn:// Protocol은 Subversion의 고유 Protocol로 이것을 사용하면 각 Project의 저장소에 Login하기 위해서 System의 계정이 아닌 따로 설정한 ID와 Password를 사용할 수 있습니다. 저장소에 접근하기 위해서 System 계정을 만들어 주지 않아도 되기 때문에 보안상 유리할 수 있습니다.

그리고 각 Project 저장소마다 따로 ID와 Password를 설정할 수 있기 때문에 각기 다른 사용자가 Subversion Server에 접근한다면 해당 사용자에게 원하는 Project 저장소에만 접근하도록 설정할 수 있습니다.

다만 svn:// Protocol을 사용하기 위해서는 Subversion의 Service Daemon인 svnserve가 항상 실행되어 있어야만 합니다.

2.1 Init Script 생성

앞서 언급한 대로 Subversion의 Service Daemon을 실행하기 위해서 Init Script를 만들어야 합니다. Init Script를 만들게 되면 나중에 Service를 실행하기 편리하며 System 시작 시에 자동으로 실행되도록 만들 수 있습니다.

Init Script를 따로 제공하지는 않으나 다른 Ubuntu User가 만들어 놓은 Script를 활용해서 설정해 봅시다. 아래와 같이 Terminal에서 입력합니다.

1
2
3
$ sudo wget http://odyniec.net/articles/ubuntu-subversion-server/svnserve -O /etc/init.d/svnserve
$ sudo chmod 755 /etc/init.d/svnserve
$ sudo vi /etc/init.d/svnserve

Download한 Script는 Subversion 저장소가 다르게 되어 있으니 현재 설정에 맞춰 봅시다. 아래와 같이 되어 있는 것을,

1
DAEMON_ARGS="-d -r /usr/local/svn/repos"

다음과 같이 바꾼 후 저장하면 됩니다.

1
DAEMON_ARGS="-d -r /home/svn"

이제 Subversion Server를 실행해 봅시다. 아래와 같이 입력합니다.

1
$ sudo service svnserve start

작성한 Subversion Init Script를 시작 시에 자동으로 실행하려면 다음과 같이 입력합니다.

1
$ sudo update-rc.d svnserve defaults

2.2 방화벽 설정

System에 UFW 방화벽이 동작하고 있다면 방화벽 설정을 해 주어야 외부에서 Server로 접속할 수가 있습니다. 방화벽을 사용하지 않는다면 이 부분은 넘겨도 됩니다.

Gufw를 사용하여 UFW 방화벽을 설정해 봅시다. 설치되어 있지 않다면 다음과 같이 입력합니다.

1
$ sudo apt-get install gufw
Gufw in Dash

Gufw in Dash

Dash에서 시스템을 선택하고 방화벽 설정을 Click합니다.

Gufw

Gufw

Gufw가 실행되면 새로운 Rule을 추가하기 위해서 추가 Button을 누릅니다.

Gufw - Add Rule (Subversion)

Gufw - Add Rule (Subversion)

간단하게 Tab에서 Allow, In, Both를 선택하고 Subversion의 Service Port인 3690을 입력한 후, 추가를 누르면 외부에서 Server로 svn://을 사용해서 접근할 수 있게 됩니다.

2.3 Project 저장소 생성

이제 Project Source를 Import (저장소에 Source Code를 등록)하기 위해서 Project 저장소를 생성해 봅시다.

예를 들어, hello라는 Project에 대한 저장소를 만들기 원한다면 아래와 같이 Terminal에서 입력합니다.

1
2
3
$ sudo svnadmin create /home/svn/hello
$ sudo chown www-data:subversion /home/svn/hello -R
$ sudo chmod g+rws /home/svn/hello -R

위의 명령을 통해서 hello Project에 대한 저장소를 생성하고 적당한 권한을 부여했습니다. 그 다음, 저장소에 접근할 수 있는 ID와 Password를 설정하기 위해서 저장소의 설정을 변경해야 합니다. 아래와 같이 입력하여 수정합시다.

1
$ sudo vi /home/svn/hello/conf/svnserve.conf

svnserve.conf의 중간쯤에 아래와 같이 되어 있는 부분을,

1
# password-db = passwd

#을 제거하여 다음과 같이 변경하고 저장합니다.

1
password-db = passwd

마지막으로 ID와 Password를 설정할 차례입니다. 아래와 같이 입력하여 설정합시다. (ID가 foo이고 Password가 bar인 경우의 예)

1
2
3
4
$ sudo vi /home/svn/hello/conf/passwd

[users]
foo = bar

2.4 Import

Project 저장소를 생성했으니 Source Code를 Import해 봅시다.

예를 들기 위해서 hello라는 Project를 만들어 봅시다. Subversion Project 저장소에 Import하기 위한 Directory 구조인 branches, tags, trunk를 생성하고 trunk에 hello.c를 간단하게 작성합시다. 아래와 같이 입력합니다.

1
2
3
4
5
$ mkdir hello
$ cd hello
hello$ mkdir branches tags trunk
hello$ cd trunk
trunk$ vi hello.c
1
2
3
4
5
6
7
#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
    return 0;
}

Source가 완성되었으니 Import를 해봅시다. import를 하기 위해서는 다음과 같이 입력해야 합니다.

1
$ svn import <Import할 Directory> svn://<passwd에 설정한 ID>@<Server Name 또는 Address>/<생성한 Project 저장소 이름>

hello Project를 이전에 생성한 hello Project 저장소로 Import하는 경우를 예로 들면 다음과 같습니다.

1
2
trunk$ cd ../..
$ svn import hello svn://foo@localhost/hello

위와 같이 입력하면 vi가 표시되면서 Import에 대한 Log Message를 입력할 수 있습니다. Log Message를 적고 저장한 후 vi를 종료하면 ID에 대한 암호를 묻고, 제대로 입력했다면 저장소에 Source Code가 Import 됩니다.

2.5 Checkout

제대로 Project 저장소에 Import가 되었는지 확인하기 위해서 Checkout(저장소에 존재하는 최신의 Source를 Download)을 받아봅시다.

Checkout을 위한 명령어 구문은 다음과 같습니다.

1
$ svn co svn://<passwd에 설정한 ID>@<Server Name 또는 Address>/<생성한 Project 저장소 이름>

위에서 예를 든 hello Project를 Checkout 받는 경우라면 다음과 같이 입력해야 합니다.

1
$ svn co svn://foo@localhost/hello

제대로 Checkout 받았다면 hello Directory가 생기면서 그 안에 branches, tags, trunk Directory와 trunk/hello.c가 존재할 것입니다.

3. svn+ssh:// Protocol을 사용할 경우

svn+ssh:// Protocol은 Subversion Service Daemon을 실행하지 않고도 SSH protocol을 사용하여 Tunneling을 통해 Subversion Project 저장소에 접근할 수 있습니다.

보통의 경우 SSH Server를 구성하여 System을 관리하는 경우가 많기 때문에 특별한 설정없이 간단하게 Subversion Server를 구성할 수 있습니다. 또한 SSH의 Tunneling을 사용하기 때문에 암호화되어 Data가 전송되므로 안전합니다.

다만 각 Project 저장소마다 ID와 Password를 따로 만들어 줄 수 있는 svn:// Protocol과는 달리 System에 생성된 계정으로 접근하기 때문에 계정만 있다면 모든 Project 저장소에 접근할 수 있는 단점이 존재합니다. (굳이 구분하려 한다면 Project 저장소 Directory에 권한 설정으로 가능할 것 같네요.)

3.1 OpenSSH Server 설치

svn+ssh:// Protocol을 사용하기 위해서 OpenSSH Server를 설치합시다. 설치방법은 간단합니다. 다음과 같이 Terminal에서 입력합니다.

1
$ sudo apt-get install openssh-server

설치된 SSH Server가 System 시작 시에 자동으로 실행되게 하려면 다음과 같이 입력합니다.

1
$ sudo update-rc.d ssh defaults

3.2 방화벽 설정

UFW 방화벽이 활성화 되어 있다면 SSH Server를 위해서 방화벽 설정을 해 주어야 합니다. 방화벽을 사용하지 않을 경우에는 이 부분을 건너뛰어도 좋습니다.

Gufw를 사용하여 UFW 방화벽을 설정해 봅시다. 설치되어 있지 않다면 다음과 같이 입력합니다.

1
$ sudo apt-get install gufw
Gufw in Dash

Gufw in Dash

Dash에서 시스템을 선택하고 방화벽 설정을 누릅니다.

Gufw

Gufw

Gufw를 실행되면, Unlock을 눌러 Superuser 권한을 얻은 후, 추가 Button을 누릅니다.

Gufw - Add Rule (SSH)

Gufw - Add Rule (SSH)

편리하게 Tab에서 Allow, In, Service, SSH를 선택하고 추가 Button을 누르면 외부에서도 Server의 SSH Service에 접근할 수 있게 됩니다.

3.3 Project 저장소 생성

이제 Project 저장소를 생성해 봅시다. 위에서 만든 hello Project를 위한 저장소를 만들기 위해서는 다음과 같이 입력하면 됩니다.

1
2
3
$ sudo svnadmin create /home/svn/hello
$ sudo chown www-data:subversion /home/svn/hello -R
$ sudo chmod g+rws /home/svn/hello -R

Project 저장소를 만든 다음에 접근할 수 있는 계정을 생성해야 합니다. 예를 들어 foo라는 계정을 Subversion Project 저장소에 접근할 수 있도록 하려면 다음과 같이 입력합니다.

1
2
$ sudo useradd -g subversion foo
$ sudo passwd foo

또는 기존에 System에 존재하는 계정을 Subversion Project 저장소에 접근하게 하려면 아래와 같이 입력하면 됩니다.

1
$ sudo usermod -a -G subversion <subversion을 사용할 계정>

3.4 Import

svn+ssh:// Protocol을 사용하기 위한 준비가 끝났습니다. 이제 Project Source를 Import해 봅시다. import 시에 명령 구문은 아래와 같습니다.

1
$ svn import <Import할 Directory> svn+ssh://<Server에 Login 가능한 ID>@<Server Name 또는 Address>/<Subversion 저장소 Directory>/<생성한 Project 저장소 이름>

svn:// Protocol을 사용할 때와 다른 점은 Server Name과 Project 저장소 이름 사이에 Subversion 저장소의 System 경로를 적어야 한다는 것입니다.

예를 들어 위에 설정한 것 처럼 Subversion 저장소가 /home/svn이고, 생성한 Project 저장소 이름이 hello인 경우 다음과 같이 Terminal에서 입력해야 합니다.

1
$ svn import hello svn+ssh://foo@localhost/home/svn/hello

위의 명령을 입력하면 처음으로 SSH Server에 접속할 경우 계속 접속할 것인지 여부를 묻는데 yes라고 입력한 후 접속할 계정의 비밀번호를 입력합니다. 이후 나머지 과정은 svn:// Protocol을 사용하여 Import할 때와 동일합니다.

3.5 Checkout

이번에는 Import한 Project Source를 Checkout 해 봅시다. 명령구문은 다음과 같습니다.

1
$ svn co svn+ssh://<Server에 Login 가능한 ID>@<Server Name 또는 Address>/<Subversion 저장소 Directory>/<생성한 Project 저장소 이름>

Import의 경우와 마찬가지로 여기서도 Server Name과 Project 저장소 이름 사이에 Subversion 저장소 Directory 경로가 포함되어야 합니다. 위에서 예로 Import한 hello Project를 Checkout하려면 아래와 같이 입력합니다.

1
$ svn co svn+ssh://foo@localhost/home/svn/hello

4. 마치면서…

이상으로 Ubuntu Natty Narwhal 11.04에서 Subversion Server를 구성하는 방법을 알아봤습니다. 마지막으로 Subversion에 대한 자세한 정보를 얻기 원한다면 다음 Link를 방문해 보기 바랍니다.