본문 바로가기
프로그램개발/Linux(Apache.vim)

[펌]SVN 을 사용하여 개발한거 날려먹지 않기

by 크레도스 2011. 7. 14.

aaa.domain.com 사이트를 운영중이고, 해당 사이트 소스를 버젼관리하기 위해 SVN 을 설정했습니다. 이 문서는 그 과정을 설명하고 현재 사용중인 개발서버 및 운영서버 환경을 소개합니다. 서버 도메인의 2차 도메인명과 동일한 계정을 사용중이며, $_SERVER['DOCUMENT_ROOT'] 는 /home/aaa/public_html 입니다.

주의1) 현재 사용중인 계정이 aaa 이므로 aaa 홈디렉토리에 저장소를 생성했습니다. 신규 프로젝트이거나 기존프로젝트일때는 aaa 를 해당 계정명으로 변경해주시기 바랍니다.
주의2) 해당문서로 인한 어떤한 문제도 책임지지 않습니다.

1. 패키지 확인 및 설치

[root@aaa.domain.com /home/aaa]# rpm -qa | grep subversion
[root@aaa.domain.com /home/aaa]# yum install subversion

2. 저장소 생성

[root@aaa.domain.com /home/aaa]# cd /home/aaa
[root@aaa.domain.com /home/aaa]# svnadmin create --fs-type fsfs cvs

3. 환경설정

[root@aaa.domain.com /home/aaa]# cd /home/aaa/cvs/conf/
[root@aaa.domain.com /home/aaa/cvs/conf]# vi svnserve.conf

아래 내용에 주석을 풀고 아래처럼 설정한다.

anon-access = none
auth-access = write
password-db = passwd

[root@aaa.domain.com /home/aaa/cvs/conf]# vi passwd

접근할수 있는 계정명과 패스워드를 작성한다. 아래 내용은 5개의 계정을 셋팅하는 예

dev1 = 1234
dev2 = 1234
dev3 = 1234
dev4 = 1234
admin = 1234

[root@aaa.domain.com /home/aaa/cvs/conf]# vi authz

아래 내용 추가

[cvs:/]
* = rw

4. 서비스 시작

[root@aaa.domain.com /home/aaa/cvs/conf]# killall svnserve
[root@aaa.domain.com /home/aaa/cvs/conf]# svnserve -d -r /home/aaa/cvs
[root@aaa.domain.com /home/aaa/cvs/conf]# ps -ef | grep svnserve
root 3693 1 0 Jan13 ? 00:00:00 svnserve -d -r /home/erp/cvs
root 12411 7719 0 10:01 pts/1 00:00:00 grep svnserve

4. 서브 도메인 생성 및 개발 영역 지정

/home/aaa/public_html 은 운영중인 사이트 소스가 있는곳이고, 모두 같은 리눅스 계정을 사용하기에 아래와 같이 디렉토리로 개발환경을 구분지었습니다. 네임서버 설정에서 dev1_aaa ~ dev4_aaa 도메인을 추가해줘야 합니다.

A 개발자가 사용할 도메인 : dev1_aaa.domain.com
A 개발자가 사용할 Document Root : /home/aaa/dev1/

B 개발자가 사용할 도메인 dev2_aaa.domain.com
B 개발자가 사용할 Document Root : /home/aaa/dev2/

C 개발자가 사용할 도메인 dev3_aaa.domain.com
C 개발자가 사용할 Document Root : /home/aaa/dev3/

D 개발자가 사용할 도메인 dev4_aaa.domain.com
D 개발자가 사용할 Document Root : /home/aaa/dev4/

디렉토리 생성을 아래와 같이 하고, 소유권 설정을 합니다.

[root@aaa.domain.com /home/aaa/cvs/conf]# cd /home/aaa
[root@aaa.domain.com /home/aaa]# mkdir dev1 dev2 dev3 dev4
[root@aaa.domain.com /home/aaa]# chown aaa.aaa -R dev1 dev2 dev3 dev4

일반 계정으로 변경한후에 실제 운영중인 사이트 소스를 import 합니다.

[root@aaa.domain.com /home/aaa]# su aaa
[aaa@aaa.domain.com ~]$ svn import --username admin /home/aaa/public_html/ svn://localhost/ -m 'start'

import 시에 현재 접속하는 계정명 패스워드와 authz 에서 설정한 계정 정보를 물어봅니다. 해당하는 내용을 입력하면 아래와 같은 화면을 볼수 있습니다.

Adding /home/aaa/public_html/index.php
.
.
.
Adding /home/aaa/public_html/lib/common.php

저장소에 데이터를 저장했으니 이제 개발자들에게 이 소스를 동기화 시켜주어야 합니다. 아래와 같이 진행합니다.

[aaa@aaa.domain.com ~]$ cd dev1/
[aaa@aaa.domain.com ~/dev1]$ svn checkout --username dev1 svn://localhost/ .
[aaa@aaa.domain.com ~/dev1]$ cd ../dev2/
[aaa@aaa.domain.com ~/dev2]$ svn checkout --username dev2 svn://localhost/ .
[aaa@aaa.domain.com ~/dev2]$ cd ../dev3/
[aaa@aaa.domain.com ~/dev3]$ svn checkout --username dev3 svn://localhost/ .
[aaa@aaa.domain.com ~/dev3]$ cd ../dev4/
[aaa@aaa.domain.com ~/dev4]$ svn checkout --username dev4 svn://localhost/ .

이제 라이브 서버(실제 운영되는 폴더 /home/aaa/public_html)와 동기화 시키는 방법이 남았습니다. 첫번째는 Rsync 를 이용한 방법이고, 두번째는 svn 을 이용하는 방법입니다. 전 후자를 선택했습니다. 그러므로 import 했던 폴더에서 checkout 을 받습니다.

[aaa@aaa.domain.com ~/dev4]$ ../public_html/
[aaa@aaa.domain.com ~/public_html]$ svn checkout --username admin svn://localhost/ .

위와 같이 import 한 폴더에서 checkout 하게 되면 svn: Failed to add file 'index.php': object of the same name already exists 이런 에러를 만나게 됩니다. 해당 파일을 삭제후에 다시 checkout 하면 되긴 합니다만 일일이 지우고 checkout 받는것도 귀찮고, 실제로 운영되는 소스라서 일단 나두고 새로운 폴더에 checkout 받아 virtualhost 를 수정하기로 했습니다.

[aaa@aaa.domain.com ~/public_html]$ cd ..
[aaa@aaa.domain.com ~]$ mkdir www
[aaa@aaa.domain.com ~]$ cd www
[aaa@aaa.domain.com ~/www]$ svn checkout --username admin svn://localhost/ .
[aaa@aaa.domain.com ~/www]$ vi /usr/local/apache/conf/extra/httpd-vhosts.conf

기존에 있는것을 주석처리하고 새로 생성

#<VirtualHost *:80>
# ServerAdmin webmaster@domain.com
# DocumentRoot "/home/aaa/public_html"
# ServerName aaa.domain.com
# ServerAlias aaa.domain.com
#</VirtualHost>

<VirtualHost *:80>
ServerAdmin webmaster@domain.com
DocumentRoot "/home/aaa/www"
ServerName aaa.domain.com
ServerAlias aaa.domain.com
</VirtualHost>

아파치 재시작을 해주면 모든 설정은 끝났습니다. A 개발자의 컴퓨터에서 ftp 로 /home/aaa/dev1 을 연결한후에 index.php 파일을 수정후 쉘에서 변경사항을 체크해보겠습니다.

[aaa@aaa.domain.com ~/dev1]$ svn status
M index.php
[aaa@aaa.domain.com ~/dev1]$

index.php 파일을 변경하였으므로 변경되었다는 내용이 출력됩니다. 변경된 파일을 저장소에 올려서 다른 개발자들이 update 받을수 있도록 하겠습니다.

[aaa@aaa.domain.com ~/dev1]$ svn commit --username dev1 -m 'index.php modify'
[aaa@aaa.domain.com ~/dev1]$ svn update

이렇게 커밋을 하고나면 저장소 버젼과 저와 동일한 버젼을 가지고 있을줄 알았는데, 그렇지 않더군요. 제 설정문제인지 원래 그런건지 알수 없지만 아무튼 버전이 다르더군요. 그래서 commit 후에 update 를 바로 해서 버전을 동기화 합니다. 이제 B 개발자 계정으로 가서 변경사항을 체크해보겠습니다.

[aaa@aaa.domain.com ~/dev2]$ svn status -u
* 1 index.php
[aaa@aaa.domain.com ~/dev2]$

업데이트 받아야 하는 파일은 앞에 * 붙습니다. 그리고 그 뒤에 자신이 가지고 있는 파일의 버젼이 나오게 됩니다. 이상태에서 lib/common.php 파일을 수정한후에 commit 업데이트 해보겠습니다.

[aaa@aaa.domain.com ~/dev2]$ svn status -u
* 1 index.php
M lib/common.php
[aaa@aaa.domain.com ~/dev2]$

보시는 바와 같이 제가 Commit 해야될 파일과 Update 받아야 하는 파일이 출력됩니다. 저장소와 B 개발자 작업폴더와 동기화 시킨후 라이브 서버에 패치하겠습니다.

[aaa@aaa.domain.com ~/dev2]$ svn commit --username dev2 svn://localhost/ -m 'lib/common.php update'
[aaa@aaa.domain.com ~/dev2]$ svn update
[aaa@aaa.domain.com ~/dev2]$ cd ../www/
[aaa@aaa.domain.com ~/www]$ svn update

svn 명령어에 대해 궁금하신점은 아래 url 참고하시면 될듯합니다. 그럼 즐프하세요 ~

http://artis.imag.fr/~Xavier.Decoret/resources/svn/

라이센스는 없습니다. !

마지막으로 이클립스에서 원격파일 Open 시 30초이상 걸리는 현상에 대해 아시는분 ? ㅡ.ㅡ