2011년 2월 20일 일요일

백업] 네이버 34

이런저런 이야기 날림 | 날림
http://blog.naver.com/chaosskyhoon/100003404310
Project managing with CVS .. part I


이 문서는 CVS를 이용한 project를 관리를 위해 CVS server 를 셋팅하는 법
에 대해서만 다룬다. CVS를 통한 managing 에 대한 방법은 7. project test
에 링크되어 있는 문서들을 참조하도록 한다.

[ 목차 ]
1. 설치
2. CVS 초기화 하기
3. 기본 설정 준비
4. cvs daemon 띄우기
5. project 초기화
6. login user 설정
7. project 테스트
8. FAQ
1. installation

설치는 redhat 기반에서 rpm으로 설치를 설명한다. 타 OS에서는
http://www.cvshome.org/downloads.html 에서 다운로드를 받아서 compile하
면 된다.

Redhat 에서는 cvs rpm file 을 설치를 하면 된다. 보통 배포본에서 기본으
로 제공 한다. 일단 rpm -q cvs 명령으로 설치가 되어 있는지 확인을 한다.
설치가 되어 있으면 버젼이 print 될 것이고 설치가 되어 있지 않으면 아무
런 정보도 나오지 않는다. 설치가 되어 있지 않을 경우에는 redhat cd에 있
는 RPMS directory에서 cvs-version.i386.rpm file을 설치하도록 한다.

rpm -Uhv cvs-version.i386.rpm

으로 하면 된다.
2. CVS 초기화 하기

일단 CVS data 를 놓아둘 디렉토리를 만든다. 보통 /home/cvs 로 많이들 한
다. mkdir /home/cvs 명령으로 /home/cvs directory 를 생성한 후에 다음의
명령을 실행 한다.

[root@bbowoo /home]$ cvs -d /home/cvs init

-d는 저장소의 위치를 나타내며 init는 cvs를 초기화 하라는 CVS 명령어 이
다. 이 명령을 실행하고 나면 /home/cvs/CVSROOT 라는 directory 가 생성이
된다. 이 디렉토리에는 각종 CVS의 설정들이 들어가 있다.
3. 기본 설정 준비

일단 cvs 를 운영하기 위해서는 cvs 를 이용할 계정을 생성해야 한다.
CVS는 일반 계정으로 로그인을 할수도 있지만 그것 보다는 CVS를 이용할 계정
을 하나 만들어 놓고선 CVS passwd file을 이용하여 alias user를 만들어서 사
용을 하는 것이 더욱 좋다.

[root@bbowoo /home]$ adduser cvs -d /home/cvs -s /bin/false

group file을 편집한 후에 다음의 명령을 실행하도록 한다.

[root@bbowoo /home]$ chgrp -R cvs /home/cvs
[root@bbowoo /home]$ chmod -R g+w /home/cvs
4. 원격에서 로그인 할수 있도록 cvs daemon 띄우기

이 부분은 3가지의 방법이 있으나 여기서는 direct access가 가능한 pserver
mode만을 다룬다. 이 외에도 rsh, ssh를 이용한 방법이 있다. pserver mode
를 이용하기 위해서는 inetd.conf 에서 셋팅을 해 줘야한다.
일단 /etc/service 에서 다음의 내용이 있는지 확인을 한다.
Hanterm - cat /etc/services

[root@bbuwoo /etc]$ cat /etc/services
.. 생략 ..
cvspserver 2401/tcp # CVS client/server operations
cvspserver 2401/udp # CVS client/server operations
.. 생략 ..
[root@bbuwoo /etc]$


없으면 추가해 주도록 한다. 그리고 나서 /etc/inetd.conf 에서 다음의
라인을 넣어 준다.

Hanterm - cat /etc/inetd.conf
[root@bbuwoo /etc]$ cat /etc/inetd.conf
.. 생략 ..
# CVS server setting
cvspserver stream tcp nowait root /usr/bin/cvs \
cvs -f --allow-root=/home/cvs pserver
[root@bbuwoo /etc]$


위의 설정중 /usr/bin/cvs \ 에서의 \는 한줄로 쓰라는것을 의미한다. 공백
문자들은 모두 tab으로 띄워준다. 다음 inetd를 재시작 하도록 한다.

[root@bbowoo /home]$ killall -HUP inetd



5. project 초기화

cvs service 를 이용한 project 의 이름을 project 라고 하자. 해당 소스가
들어 있는 디렉토리로 일단 이동을 한다음 해당 소스들을 CVS 에 넣도록 한
다.

[root@bbowoo /home]$ cd project
[root@bbowoo project]$ cvs -d /home/cvs import -m "프로젝트 멘트" \
proj_title vender_tag release_tag

명령을 실행한다. "프로젝트 멘트" 뒤의 \ 역시 한줄로 붙여 쓰라는 표시이
다. 두번째 명령의 "프로젝트 멘트"는 말그대로 주석이라고 생각을 하면 될
것이고 proj_title은 CVS에 들어갈 proj_title을 적어 준다. 이 proj_title
로 /home/cvs 에 디렉토리가 생성이 되고 그 안에 해당 소스들이 위치 하게
된다. vender_tag 는 project 관리자의 id정도만 넣어 줘도 되며,
release_tag는 최초로 하는 것이니 start정도를 대입해 주면 된다. 위의 명
령을 실행하면


Hanterm - cvs -d /home/cvs import -m "내 프로젝트" project oops start
[root@bbuwoo project]$ cvs -d /home/cvs import -m "내 프로젝트" project oops start
N project/a.c
N project/b.c
N project/c.c
N project/README
...

No conflicts created by this import
[root@bbuwoo project]$

와 같은 결과가 나올것이다. 이 명령으로 인하여 /home/cvs/project라는 디
렉토리를 생성하여 project directory 에 있던 소스들을 /home/cvs/project
에 넣는 작업을 보여주게 된다. 제일 앞의 N 은 새로운 파일이 추가 되었음
을 나타낸다.

마지막 No conflicts created by this import 메세지는 저장소에 아무 file
도 없어서 아무런 충돌(comflict) 가 발생하지 않았다는 메세지 이다. 그러
니 잘 된것이라는 말이다.

일단 import로 cvs project 초기화를 한후에는 기존의 project directory에
있는 소스 들은 필요가 없어진다. (/home/cvs/project 를 말하는 것이 아니
다.) 그러므로 project directory 는 삭제를 해도 무방하다.
(/home/cvs/project 를 말하는 것이 아니다.)

다음 /home/cvs 로 이동을 하자. 일단 project 를 import를 하면 import 를
한 유저의 권한으로 등록이 되어 있을것이다. 여기서 약간의 퍼미션 조정을
해 줘야 한다.

일단 cvs 에 로그인을 한후에 cvs에 있는 소스들을 받아 가려면 cvs server
의 cvs group에 속해 있어야지만 이를 받아 갈수가 있다. 여기서 중요한 것
이 file들의 소유권은 누가 가지고 있다고 해도 cvs 그룹에 속해 있는 유저
들은 소유권에 상관없이 변경을 할수가 있다. (이는 cvs group에 속해 있고
쓰기 권한이 있는 유저들에 한한다. cvs의 read-only 권한 설정에 대해서는
아래에 설명을 할 것이다.) 다만 directory 만은 775의 권한과 group이 cvs
로 지정이 되어 있어야 한다는 것을 명심해야 한다.

즉 import 명령을 실행한 다음

[root@bbowoo /home]$ chgrp -R cvs /home/CVS/project

명령을 실행해 줘야 한다. 다시 정리하면 project 의 초기화 작업은 다음의
프로세스를 따른다.

[root@bbowoo /home]$ tar xvfpz project.tar.gz
[root@bbowoo /home]$ cd preject
[root@bbowoo /home]$ cvs -d /home/cvs import -m "내 프로젝트" project oops start
[root@bbowoo /home]$ chgrp -R cvs /home/CVS/project
6. login user 설정하기

cvs의 로그인은 real 계정을 가지고 있는 사람들은 cvs gropu에 속해있기만
하면 누구나 가능하다. 하지만 기본적인 CVS계정을 이용하여 CVS 계정을 따
로 이용을 하는 것이 더욱 낳을 것이다.

CVS 계정을 만들기 위해서는 cvs passwd file을 이용한다. cvs passwd file
은 처음에는 존재하지 않으며 별도로 생성을 해줘야 한다. cvs passwd file
의 포맷은

ID:encrypt_passwd:REAL_ACCOUNT

의 형식을 이루며 암호화 되어진 password 는 apache의 htpasswd 명령을 이
용하여 생성할수 있으며 cvs passwd file의 위치는 $CVSHOME/CVSROOT/passwd
가 된다. (위의 예에서는 /home/cvs/CVSROOT/passwd 이다)

일단 우리는 앞에서 CVS를 관리할 계정 이름을 cvs로 정했던 것을 기억할 것
이다. 이제 여기에 oops 라는 CVS 계정을 만들어 보도록 하겠다. ( 패스워드
파일을 만들지 않고 단순히 출력을 할 경우에는 -n option을 사용한다. )
Hanterm - htpasswd -c passwd oops

[root@bbuwoo /etc]$ cd /home/cvs/CVSROOT
[root@bbuwoo CVSROOT]$ htpasswd -n oops
New password:
Re-type new password:
oops:3YnscZqDZxEA.
[root@bbuwoo CVSROOT]$



위와 같이 하면 암호화 되어진 passwd 가 생성이 되고 아래와 같이 passwd
file 의 2번째 field 에 넣어주면 된다.
Hanterm - cat /home/cvs/CVSROOT/passwd

[root@bbuwoo etc]$ cd /home/cvs/CVSROOT
[root@bbuwoo CVSROOT]$ cat /home/cvs/CVSROOT/passwd
test:QDrxN2gWIKsM6:cvs
oops:3YnscZqDZxEA.:cvs
[root@bbuwoo CVSROOT]$



다시 한번 요약을 하자면 CVS가 사용할 계정들은 $CVSHOME/CVSROOT/passwd
에서 정의를 하며 passwd file의 format은

CVS_ACCOUNT:CRYPT_PASSWD:REAL_ACCOUNT

을 이루며 제일 처음 CVS_ACCOUNT 는 CVS 에서 로그인 할때 필요한 계정 이
름을 의미하며, 두번째 필드 CRYPT_PASSWD 는 UNIX crypt 암호화 되어진 암
호화된 문자열로 위의 htpasswd -n 명령으로 만들수가 있다. 그리고 마지막
REAL_ACCOUNT 는 처음의 CVS_ACCOUNT 가 시스템의 어떤 USER의 권한으로 작
동을 할지를 지정해 주는 것이다. 제일 마지막을 지정하지 않으면 CVS 로그
인을 성공해도 chechout 을 하지 못하는 경우가 발생을 한다.

다음에는 read-only user를 처리하는 과정을 설명하도록 해 보도록 하겠다.
일단 /home/cvs/CVSROOT/passwd 에 익명 사용자로 사용할 유저를 등록 하도
록 한다. 이미 되어 있다면 아래의 과정은 넘어 가도 상관없겠다.
Hanterm - htpasswd passwd oops

[root@bbuwoo CVSROOT]$ htpasswd -n cvs
New password: cvs
Re-type new password: cvs
cvs:3YnscZqDZxEA.
[root@bbuwoo CVSROOT]$ echo cvs:3YnscZqDZxEA.:cvs >> /home/cvs/CVSROOT/passwd
[root@bbuwoo CVSROOT]$



패스워드 역시 모두 cvs로 주었다. 다음 /home/cvs/CVSROOT/readers라는 파
일을 생성하도록 한다. 그리고 여기에 cvs를 넣어 주도록 한다. 주의 할 것
은 마지막 라인이 공백라인이면 절대 안된다. 물론 유저이름 뒤에 공백문자
가 존재 해도 안된다. 이런 식으로 /home/cvs/CVSROOT/readers 라는 파일에
등록된 유저는 read-only mode로만 접근이 가능하다.
7. project 테스트

local machine 에서는 아래와 같이 명령을 실행해 본다.

[root@bbuwoo CVSROOT]$ cvs -d /home/cvs checkout project

그러면 현재 디렉토리 안에 project 라는 디렉토리가 생성 되면서 안에 CVS
의 소스들이 다운로드 되어 질것이다. 이렇게 되면 셋팅이 잘 된것이다.

원격에서 pserver로 접근하는 것을 테스르 하려면 아래와 같이 해 본다.
Hanterm - cvs -d :pserver:ID@servername.com:/home/cvs login

[root@other oops]$ cvs -d :pserver:ID@servername.com:/home/cvs login
CVS passwd : input password

cvs -d :pserver:ID@servername.com:/home/cvs checkout project
...
...
[root@other oops]$



를 하여 현재 디렉토리에 project 가 생성이 된다면 제대로 설정이 된것이다.
이후의 cvs를 이용한 작업에 대해서는 다음의 문서들을 참조하도록 한다.

http://webdox.co.kr/docs/application/cvs.jsp 김민식
http://network.uos.ac.kr/~blhole/linux/cvs.html 김영민
http://kldp.org/KoreanDoc/html/CVS-KLDP/ 장우현
8. FAQ

[ Question ]
로그인 후에 checkout을 하려 하는데 다음과 같은 메세지가 나옵니다.
[oops@work CVS]$ cvs -d :pserver:cvs@servername.com:/home/cvs checkout project
Sorry, you don't have read/write access to the history file
/home/cvs/CVSROOT/history Permission denied

[ Answer ]
위의 에러 메세지는 $CVSHOME/CVSROOT 디렉토리와 그 이하의 디렉토리및 파
일들의 권한 문제이다.

[root@bbuwoo cvs]$ chgrp -R cvs /home/cvs/CVSROOT
[root@bbuwoo cvs]$ chmod -R g+w /home/cvs/CVSROOT

명령을 실행해 주면 된다.


[ Question ]
로그인까지는 잘 되었는데 checkout을 할때 다음의 에러 메세지가 나옵니다.
[oops@work CVS]$ cvs -d :pserver:cvs@servername.com:/home/cvs checkout project
cvs server: Updating project
cvs server: failed to create lock directory in repository
`/home/cvs/project': Permission denied
cvs server: failed to obtain dir lock in repository `/home/cvs/project
cvs [server aborted]: read lock failed - giving up

[ Answer ]
이 에러 메세지는 5. project 초기화에서 설명한 부분을 제대로 설정하지 않아서 발생한
문제이다. 보통 project를 초기화 하면 CVS 저장소에 초기화를 한 유저의 소유권으로 디
렉토리가 생성이 된다. 그런데 cvs에서 file의 소유권은 상관을 안하지만 directory의
그룹 소유권은 cvs group이 가지고 있어야 한다. 그리고 또한 cvs group에 대한 쓰기 권
한이 존재해야 한다. 그러므로 이는

[root@bbuwoo cvs]$ chgrp -R cvs /home/cvs/project

명령으로 해결이 가능하다. 다시 말하면 project directory 이하의 모든 directory들은

drwxrwxr-x user cvs directoryname

의 퍼미션과 소유권을 가져야 한다는 말이 된다.


[ Question ]
저장소(Reposity) 를 여러개 만들어 각각의 유저로 관리하고 싶습니다.

[ Answer ]
저장소는 각각 cvs -d $PATH init 로 만드시면 됩니다. 그리고 inetd 나 xinetd 에서
CVS 의 명령줄에 --allow-root 옵션으로 각각의 저장소 위치를 지정해 주시면 됩니다.

cvspserver stream tcp nowait.400 root /usr/bin/tcpd /usr/bin/cvs -f \
--allow-root=/home/cvs/test --allow-root=/home/cvs/test1 pserver

정도로 하시면 됩니다.

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...