메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

BSD 환경에서 각종 부가 기능을 수행하는 Subversion(SVN)

한빛미디어

|

2007-11-30

|

by HANBIT

12,132

제공 : 한빛 네트워크
저자 : Jeff Palmer
역자 : 정원우
원문 : Subversion for BSD With All the Bells and Whistles

최근에 저는 새로운 고객과 일을 하게 되었습니다. 첫 과제들 중 하나는 각종 부가 기능을 포함해서 Subversion 서버를 세팅하는 일이었죠. Subversion에 대한 경험이 부족했던 저에게는 이 일이 난감해 보였습니다. 다행히도 우연히 접한 Dru Lavigne의 글 덕분에 비교적 빨리 이 일을 끝낼 수 있었죠. 고객이 각종 부가 기능을 원했던 관계로, 이 글에서는 제가 했던 일의 기본적인 부분만을 다루겠습니다.

제 고객은 Subversion으로 여러 개의 프로젝트를 운영합니다. 이 중에는 비공개 소스도 있었고 공개 소스도 있었죠. Subversion은 리비전(revision) 관리 툴로, 프로젝트 팀원들이 다른 사람이 한 작업을 손상시키지 않으면서 공동작업 할 수 있게 해줍니다. 추가적으로 이번 과제에서는 암호화된 인증이 필요했고, 각 프로젝트마다 Trac을 셋업해 주어야 했습니다. Trac은 web 기반의 장애 보고서(trouble ticket) 및 저장소(repository) 뷰어입니다. 버그 트래킹, 기능 향상 요청(feature/enhancement requests)을 비롯해 이런 류의 기능들이 그런대로 유용하며, 공동 작업에 있어서 상당히 편리하죠.

여기에 더해, Trac이 mod_python을 사용하는 Apache-2.2.x에서 돌아야 하고, postgreSQL 데이터베이스를 벡엔드로 사용해야 했으므로, 일은 더욱 복잡해졌습니다. 마지막으로 제 스스로 만들어낸 요구사항들도 몇 개 있었는데, 저는 FreeBSD 포트 트리에 확실하게 포함되어 있는 소프트웨어들만을 사용하고 싶었습니다. 쉬운 관리를 위해서죠. 또 이 회사는 IRC(Internet Relay Chat)를 통해 많은 양의 커뮤니케이션이 이루어지고 있었습니다. 그래서 저는 이것을 이용해서 개발자들에게 공지를 보내는 방법을 구성해보고 싶었습니다. 살펴본 바와 같이 많은 요구사항들이 빠르게 형성되었는데, 이와 관련된 FreeBSD 문서를 찾는 일이 쉽지 않았습니다.

Trac을 사용하기 위해 Apache와 mod_python을 이용해야 했기 때문에, 저는 mod_dav_SVN을 사용하면서 SVN 인증을 포함한 모든 것을 Apache로 통제하기로 결정했습니다. 우선 Apache 인스톨을 시작했습니다.
# cd /usr/ports/www/apache22
# make WITH_BERKELEYDB=db42 WITH_MPM=worker install
서브버전은 벡엔드로 Berkeley DB를 사용하는데, 이를 지원하도록 Apache를 컴파일 합니다. 시행착오를 거치면서, 저는 다음과 같은 사실을 알게 되었습니다. 즉, 특정 시간 경과 후 "prefork MPM"은 httpd의 동작이 둔감해지다가 결국 멈춰버린다는 사실이죠. "worker MPM"에서는 이러한 문제가 개선된 것으로 보입니다. 다음 단계는 Subversion 인스톨입니다.
# cd /usr/ports/devel/subversion
# make WITH_PYTHON=yes WITH_MOD_DAV_SVN=yes WITH_APACHE2_APR=yes install
make의 첫 옵션은 python을 Trac에 바인딩하도록 하는 것이고, 뒤의 두 옵션들은 DAV 모듈을 컴파일하고, Apache의 ARP를 사용하도록 하는 것입니다. 제각각 동작하지 않고 말이죠.

당연히 아파치 인스톨과 함께 mod_python도 인스톨 해주어야 합니다!
# cd /usr/ports/www/mod_python3
# make all install clean               
부가적인 WITH_* 타켓들은 필요 없습니다. 그냥 컴파일되고 인스톨되도록 놔두시면 됩니다.

다음은 postgreSQL 셋업입니다. 중앙집중적인 데이터베이스 서버(central database server)를 운영할 것이므로, 클라이언트만 인스톨할 겁니다. 동일한 하드웨어에서 postgreSQL 서버를 운영하셔도 됩니다.
# cd /usr/ports/databases/postgresql82-server/                 
# make install /* 옵션 메뉴에서 libc_r 옵션을 선택하세요 */
혹은
# cd /usr/ports/databases/postgresql82-client                     
# make install   /* 옵션 메뉴에서 libc_r 옵션을 선택하세요 */
libc_r은 plpython이 사용합니다. Trac을 사용할 것이기 때문에 이렇게 하는 것이 바람직하죠.

마지막으로 Trac 인스톨입니다.
# cd /usr/ports/www/trac                                                         
# make install  /* 옵션 메뉴에서 PGSQL support를 선택하세요 */
소프트웨어 인스톨은 끝났습니다. 이제 설정을 해야 합니다.

각 포트들이 Apache 설정을 변경했기 때문에, 몇 가지를 수정해야 합니다.

가장 좋아하시는 에디터로 /usr/local/etc/apache22/httpd.conf를 열어서, 다음 라인을 지우세요:
LoadModule dav_module libexec/apache22/mod_dav.so
(위에서 인스톨한 방법으로 2개의 개별적인 엔트리가 만들어집니다. 따라서 하나를 지우셔야 합니다.)

그리고 나서 다음을 추가하시면 Trac이 이용할 python 모듈이 동작합니다.
LoadModule python_module libexec/apache22/mod_python.so
이제 시스템이 부팅될 때, Apache가 시작되도록 세팅해야 합니다. /etc/rc.conf에 다음을 추가하세요.
apache22_enable="YES"
postgreSQL 서버를 인스톨한 상태라면, 이것도 시작하게 합시다. /etc/rc.conf에 다음을 추가하세요.
postgresql_enable="YES"
다음의 두 명령을 실행시킵니다. postgerSQL 데이터베이스를 초기화하고 시작하게 하는 명령들입니다.
# sh /usr/local/etc/rc.d/postgresql initdb
# sh /usr/local/etc/rc.d/postgresql start
상세설정

우선 Subversion 저장소를 생성하고 Trac 환경을 설정해야 합니다.
# svanadmin create /home/svn/projectname
# trac-admin /home/trac/projectname initenv
svnadmin 명령은 Subversion 저장소를 초기화하고, 새로운 프로젝트의 코드를 저장할 수 있게 준비하도록 합니다. trac-admin은 Trac 환경을 초기화하고 웹브라우저를 통한 접근을 허용해 줍니다. 이 과정 이전에 PostgreSQL 데이터베이스를 먼저 생성해야 합니다. 위에서 생성한 두 서브디렉토리의 usr:group 권한이 잘못되어 있습니다. 다음 명령을 통해 바로잡도록 합시다.
# chown -R www:www /home/svn/projectname
# chown -R www:www /home/trac/projectname 
이렇게 하면 Apache 프로세스가 위 디렉토리들을 변경할 수 있습니다.

다음은 Trac 환경에 관리자 권한을 부여해야 합니다. 가장 쉬운 방법은 plugin을 사용하는 것입니다.
# cd /usr/ports/www/trac-webadmin
# make all install clean
plugin을 사용하기 위해 사용자 자신의 trac_admin 권한도 설정해야 합니다. 다음의 명령을 실행하고 나서, 로그아웃 한 후 다시 로그인 해보면, Track 네비게이션 메뉴에 "Admin" 탭이 생긴 것을 확인할 수 있습니다.
# trac-admin /home/trac/projectname permission add yourusername TRAC-ADMIN
다음 단계는 일반적인 인스톨 시나리오를 조작하기 위해 Apache와 Trac을 셋업하는 것입니다. 이 설정은 오픈 소스 프로젝트에 알맞습니다. 다시 말해서, 누구든지 저장소에 접근하여 checkout 하고, Trac에 장애 보고서를 생성하는 것은 가능하지만, SVN의 쓰기 기능과 Trac의 로깅 기능은 SSL 상에서 수행되는 프로젝트에 적당합니다.

/usr/local/etc/apache22/extra/httpd-vhosts.conf에서:

ServerName svn.projectname.org
ServerAlias projectname.org
ServerAdmin webmaster@projectname.org
ErrorLog /var/log/apache/projectname.org/svn/httpd-error.log
TransferLog /var/log/apache/projectname.org/svn/httpd-access.log

SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /home/trac/projectname
PythonOption TracUriRoot /


Redirect permanent /login https://svn.projectname.org/projectname/login/


DAV svn
SVNPath /home/svn/projectname
AuthzSVNAccessFile /home/svn/ro_access


/usr/local/etc/apache22/extra/httpd-ssl.conf에서:

SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /home/trac
PythonOption TracUriRoot /


AuthType Digest
AuthName "svn"
AuthDigestDomain /
AuthDigestProvider file
AuthUserFile /home/svn/htdigest
Require valid-user
order allow,deny
allow from 127.0.0.4
Satisfy any



DAV svn
SVNParentPath /home/svn
AuthzSVNAccessFile /home/svn/access
AuthType Digest
AuthName "svn"
AuthDigestDomain /
AuthDigestProvider file
AuthUserFile /home/svn/htdigest
Require valid-user

위 코드를 Apache SSL 설정 파일의 적절한 위치에 추가하시면 됩니다. 127.0.0.4는 IRC를 통한 공지가 가능하도록 나중에 수정할 부분이니까, 잘 보아두세요.

보시다시피, SVN 저장소 checkout과 장애 보고서 발행 및 확인은 암호화되지 않은 링크를 통해 가능합니다. 반면 Trac과 Subversion에 로깅(logging)하는 것은 SSL 암호화를 통해 처리됩니다. 물론 모두 암호화된 링크를 통해 처리되도록 위의 설정들을 수정하셔도 됩니다.

사용자를 생성하고 read-only 접근 권한을 설정합시다.
htdigest /home/svn/htdigest svn yourusername
/home/svn/access에서:
[/] yourusername = rw
rw는 yourusername라는 사용자가 저장소의 모든 것을 읽고 쓸 수 있도록 허용합니다.

/home/svn/ro_access에서 다음을 추가하세요:
[/]
* = r
*는 모든 사용자를 의미하며, 이들 모두를 read-only 모드로 설정하는 것입니다.

이제 Apache를 설정, 사용자도 등록, anonymous 접근 설정이 끝났습니다. 이제 설정한 것들을 한 번 사용해보고 싶으실 겁니다!

Trac은 http://svn.yourprojectname.org에서 사용 가능합니다. Subversion 저장소는 svn co http://svn.yourprojectname.org/svn/projectname에서 사용 가능합니다.

인증 기능을 원하신다면, http를 https로 바꿔주세요.

일이 거의 끝나갑니다. 이제 비공개 프로젝트를 설정해봅시다. 비공개 프로젝트에서는 인증된 사용자들만 저장소를 브라우징하고, 코드를 checkout하며, 장애 보고서를 생성/확인/편집하도록 허용됩니다. 또 모든 것들이 SSL을 통해 암호화됩니다. 이 설정은 http/https 혹은 read-only 사용자에 대해 고려하지 않아도 되기 때문에 앞의 과정보다 훨씬 쉽습니다.

/usr/local/etc/apache22/extra/httpd-ssl.conf 내용:

SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /home/trac
PythonOption TracUriRoot /
AuthType Digest
AuthName "prometheus"
AuthDigestDomain /
AuthDigestProvider file
AuthUserFile /home/svn/htdigest
Require valid-user
order allow,deny
allow from 127.0.0.4
Satisfy any

IRC 공지에 사용될 127.0.0.4에 다시 한번 주목합시다. 이제 Trac과 SVN은 오직 인증된 사용자들만 사용할 수 있습니다.

마지막으로, 특정 그룹을 저장소의 특정 부분에 허용해주려면 이 글을 참고하세요. (예를 들자면, web 개발자들이 www 디렉토리에만 접근하게 하는 것이죠. 이 사람들은 소스 코드를 커밋할 필요가 없습니다.)

IRC를 통한 커밋 메시지 및 새로운 장애 보고 공지

저는 IRC를 주요 커뮤니케이션 수단으로 사용하는 이 회사의 개발자들과 분석가들을 위한, 쉬운 공지 수단을 한참 동안 찾아보았습니다. 그러던 중, 이런 기능이 가능하도록 해주는 몇 개의 소프트웨어 프로젝트를 찾았고, 최종적으로 Supybot을 사용하기로 결정했습니다. Supybot은 다수의 plugin과 기능을 가지고 있는 IRC bot입니다. 이러한 plugin과 기능은 특정 목적으로 Supybot을 쉽게 사용할 수 있게 해주죠. 이게 다가 아닙니다! Supybot은 RSS feed를 읽을 수 있도록 해주는 plugin을 사용할 수 있죠. Trac에는 RSS feed 기능이 있습니다. Trac 인스톨에서 Python을 사용했다는 사실을 상기해보면, Supybot이 Python으로 작성되었다는 사실은 더욱 좋은 일이죠. 더 바라시는 게 있으십니까?
# cd /usr/ports/irc/py-supybot-plugins/
# make all install clean
이렇게 하시면, Supybot과 RSS plugin을 포함해서 추가적인 plugin 팩이 컴파일 됩니다.

Supybot이 실행되기 원하는 곳으로 디렉토리를 변경하세요. 어디를 선택하셔도 상관없습니다. 이것은 개인적인 선호 문제입니다. 저는 Supybot이라는 새 사용자를 생성하고, 이 사용자로 su 했습니다.
# supybot-wizard
등장하는 질문들에 답을 하시다가, plugin에 대한 질문이 나오면 RSS plugin을 활성화하도록 하세요. 이 RSS plugin이 우리의 주요 관심 대상입니다. 하지만 앞서 언급한 바와 같이, Supybot은 기능 향상을 위한 많은 plugin들을 가지고 있습니다. 시간을 좀 들이셔서 관심이 가는 것을 한 번 찾아보세요. 이제 다 하셨습니다. 실행시켜 볼 차례입니다.
nohup supybot YourBotName.conf &
잠시 후에 여러분의 IRC 채널에 공지 bot(announcement bot)이 나타날 것입니다. 동작하지 않으면 log를 확인하시고 문제를 고치세요. bot이 여러분의 채널에 나타나면, 조금 전 선택하신 사용자명과 암호를 통해 여러분이 누구인지 알려주어야 합니다.
/msg YourBotName identify YourUsername YourPassword
이렇게 하시면 bot은 "The operation succeeded"나 비슷한 메시지로 응답할 것입니다.

이제 실제 공지 용 plugin을 설정할 차롑니다. 공지 bot에게 다음의 명령들을 /msg로 알려주세요.
config plugins.rss.announcementprefix ""
config plugins.rss.waitperiod 60
config plugins.rss.announce.showlinks true
rss add projectname http://svn.yourproject.org/projectname/timeline?
ticket=on&ticket_details=on&milestone=on&changeset=on&wiki=on&max=5&daysback=1&format=rss
rss announce #channel projectname
각 라인들은 다음과 같은 기능을 합니다.
  1. 공지 머릿말 비활성화.
  2. 60초마다 RSS feed 체크하기.
  3. 공지될 장애 보고 및 changeset의 link 보여주기.
  4. Trac RSS feed가 있는 URL 추가.
  5. #channel로 공지할 bot 실행.
이번 일을 통해 저는 많은 것을 배울 수 있었습니다. 저는 Python이나 Subversion, Trac을 이전에 사용해 본적이 없었습니다. 이 글이 비슷한 환경을 구성하시고 싶어하시는 분들에게 도움이 되기를 바랍니다.


저자 Jeff Palmer는 윈도우 및 유닉스 환경의 시스템 관리자로 15년 이상 일해왔습니다. 사설 ISP 업체와 인터넷 업체들에서 근무하다가, 현재는 다양한 클라이언트들을 위한 FreeBSD 관리 용역을 하고 있으며, FreeBSD 커뮤니티에서 활동 중이기도 합니다. Jeff의 취미는 모터사이클(경주용 코스의 트랙에서!), 제트 스키, 독서, 임베디드 컴퓨터, 그 밖에 컴퓨터와 연관된 거의 대부분의 일들입니다.


역자 정원우님은 연세대학교 컴퓨터과학과에서 학부와 석사 과정을 마치고, LIG넥스원㈜에 근무하며 각종 군무기들을 만들고 있습니다. K-21 차기 장갑차의 무선 데이터 통신 프로토콜(MIL-STD-188-220)을 구현하였고, 현재는 철매-II(MSAM)의 사격통제 소프트웨어를 개발 중입니다. 석사 시절에는 센서네트워크용 네트워크 프로토콜을 개발하였으며, 현재 이 프로토콜은 RETOS라는 OS에 적용되어 있습니다. 컴퓨터보다는 책과 음악을 더 사랑하는 비운의 프로그래머입니다.
TAG :
댓글 입력
자료실