본문 바로가기

소프트웨어개발자의 삶/실전기록

Subversion 셋팅

아직 Subversion을 사용하는 이유

요즘 SVN을 왜 쓰냐 싶겠지만 아직 회사의 소스관리 툴은 SVN이다. 레드마인과 연계되어 이슈번호까지 관리되고 있다. Github로 전환을 해볼까 싶어서 Redmine과 연동 테스트를 했는데 실패했다. 휴일에 하루정도 시간을 들여서 이것저것 해보았는데 실패하여 회사 소스서버도 Github로 넘어가지 못 했다.

연동이 중요한 이유는 Redmine으로 관리된 이슈가 소스서버랑 연계가 되면 엄청난 파워를 자랑하기 때문이다. Redmine과 같은 툴을 이슈를 관리하는 용도로만 쓰고 소스는 소스대로 별개로 관리가 된다면 이슈관리하는 툴에서 소스의 변경을 알 수가 없다.

하지만 연계가 되는 순간 이슈에 의해서 소스가 변경된 것을 알 수 있으며, 소스의 변경작업은 이슈를 기본으로 할 수 있는 체계가 만들어질 수 있다.

이슈서버내역
개정판에서 바뀐 소스를 보여주는 링크

여튼 여러가지 이유로 아직 깃으로 옮겨가지 못하고 있다. 브랜치별로 모든 소스를 복제하는 것이 너무나 낭비이고 가슴이 아프지만 아직 Github로 저걸 대응하는 방법을 알아내지를 못했다. (정확하게는 SVN은 redmine에서 SVN 을 접근하면되지만 Github의 경우 인증방식이 조금 다르다. 인증까지는 성공했는데 프로젝트별로 인증을 성공하고 연계를 찾아내는 포인트를 아직 테스트 성공하지 못하였다.)

SVN 서버를 옮기는 작업을 하면서 SVN 서버에 대해서 조금 더 알게 되는 계기가 아니였을까 싶어서 기록을 남겨본다.

svnadmin 과 svnserve 와의 관계

svnadmin은 저장소를 관리하는 툴이다. 저장소를 생성하거나 백업을 생성하거나 여러가지 많은 작업을 한다. "svnadmin help" 명령어를 통해서 svnadmin이 할 수 있는 작업이 유추가 된다. svnserve는 저장소를 외부에 서비스 하는 툴이다. 어떤 디렉토리를 서비스를 할 것인지 어떤 포트에 서비스를 할 것인지를 결정할 수 있다.

대부분의 인터넷 교제나 예제는 저장소 1개를 생성하고 저장소를 서비스하는 것을 보여주고 있다. 하지만 실전에서는 저장소가 1개만 있을리는 없다. 수많은 프로젝트가 있기 때문에 저장소는 2개 이상을 만들게 된다. 그렇다면 svnserve로 어떻게 여러저장소를 외부에 오픈할 수 있을까?

답이 너무 쉬운데 원리를 몰라서 나는 엄청 해매었다. svnserve는 특정 디렉토리를 svn 클라이언트가 접근할 수 있도록 해주는 것까지가 역활이다. 그 후 역활은 'svnadmin create --fs-type fsfs 프로젝트디렉토리' 명령어로 생성된 파일들이 나머지 작업을 하는 것이다.

SVN기본 디렉토리 구조및 파일

아래와 같은 구조로 프로젝트를 만든다고 해보겠다. 모든 프로젝트의 기본 디렉토리는 /data/repositories/ 이고 그 하부에 projectA, projectB 가 있도록 한뒤 projectA와 projectB가 외부서비스 되도록 만드는 방법은 아래와 같다.

$ sudo mkdir -p /data/repositories/projectA
$ sudo mkdir -p /data/repositories/projectB

$ sudo svnadmin create --fs-type fsfs /data/repositories/projectA
$ sudo svnadmin create --fs-type fsfs /data/repositories/projectB

$ svnserve -d -r /data/repositories --listen-port 3690

이제부터 'svn://접속주소/projectA'로 접근이 가능하다 하지만 접속하려고 하면 접속이 되지 않는다. 이후 접속과정에 필요한 모든 정보는 'projectA' 디렉토리 하위에 있는 conf/authz, conf/passwd, conf/svnserve.conf 파일에 의해서 처리가 된다. 

conf 디렉토리의 파일

가장 중요한 것은 svnserve.conf 파일의 역활이다. 이 파일에서 아이디는 어떤 파일을 참조할지 그 아이디에 권한은 어떤 파일을 참조할지를 결정한다.

svnserve.conf 파일 내용

사용을 하기 위해서는 주석('#')을 제거해주면 적용이 된다.
익명사용자의 권한 anono-access = read #[none]으로 지정시 익명은 접근 못함.
인증사용자의 권한 auth-access =write
사용자아이디와 패스워드 파일 password-db = passwd
사용자인증의 범위 authz-db = authz

하나의 서버에 두개의 프로젝트가 저장소로 제공되지만 id와 접근권한은 한곳에서 관리되는 방식을 대부분 취할 것이다. 그렇다면 개별적으로 주어진 conf디렉토리의 passwd, authz를 사용하지말고 디렉토리 어딘가에서 passwd, authz 파일을 두고 권한을 주고 svnserve.conf 파일에서 password-db 와  authz-db 의 값 별도로 만든 파일의 위치를 가르키면 된다.

passwd 파일
authz 파일
projectA의 svnserve.conf 파일 내용

authz 파일의 경우 developer라는 그룹을 두고 그 안에 test1, test2 유저를 가진다. 그리고 '/' 경로에 대해서 developer그룹이 rw 권한을 가진다는 의미임

프로젝트를 생성할 때마다 생성되는 프로젝트의 svnserve.conf 파일은 공통된 authz, passwd 파일의 위치를 가르켜주면 된다.

파일기반의 접근권한 관리이기 때문에 상당히 불편하다. SVN 다중프로젝트 설정방법은 위와 같은 방법으로 하면 된다.

svn 설치나 svnserve 실행과 같은 내용은 다른 곳에서 쉽게 찾을 수 있어 별도 설명은 생략한다.