S/W 개발 기반 시스템 구성 – 3. Mercurial 설치

이 글은 S/W 개발에 가장 기본이 되는 이슈 추적(Issue Tracker), 버전 관리(Version Control), 빌드(Build), 지속적인 통합(CI) 시스템을 구성하는 방법에 대한 일련의 글 중 세 번째이다. 이번에는 버전 관리 시스템으로 사용할 Mercurial을 설치하고 웹 환경에서 사용할 수 있도록 구성한다.

1. 미리 준비해야 하는 것들

  • 인증은 OpenLDAP을 사용하며 설치 과정은 첫 번째 글을 참조한다.
  • Apache 웹  서버를 통해 웹 기반으로 사용한다. 설치 과정은 두 번째 글을 참조한다.
  • Mercurial을 웹 서버에서 구동하기 위해 파이썬(Python) 2.6.6 윈도용 패키지를 여기에서 받는다. 현재 Mercurial 파이썬 패키지가 2.6용만 있으므로 2.7.1은 받지 않는다.
  • Mercurial을 여기에서 파이썬(Python) x86 패키지로 받는다.
  • 파이썬 프로그램을 Apache 웹 서버에서 구동할 때 성능을 높이기 위한 모듈인 mod_wsgi를 여기에서 파이썬 2.6용으로 받는다.
  • Mercurial 저장소를 웹으로 공유할 때 필요한 설정 정보인 hgweb.cgi를 여기에서 받는다.

2. 설치

먼저 파이썬 2.6.6을 설치한다. 설치 과정은 특별한 게 없으므로 기본 설정으로 설치하면 된다. 환경 변수 Path에 경로 정보가 자동으로 설정되지 않으면  다음 경로를 시스템 환경 변수에 추가한다.

C:Python26;C:Python26Scripts

파이썬 다음으로 Mercurial 파이썬 패키지를 설치한다. 이 역시 기본 설정으로 설치하면 된다. 파이썬 경로 정보를 설정해 뒀으면 명령 행에서 hg로 실행되는 것을 확인할 수 있다.

이제 웹 서버에서 mod_wsgi를 사용하도록 설정한다. 받아 둔 mod_wsgi-win32-ap22py26-3.3.so 파일을 Apache 설치 디렉터리 아래 modules에 복사하고 다음 내용을 confhttpd.conf 파일 모듈 설정 부분에 추가한다.

LoadModule wsgi_module modules/mod_wsgi-win32-ap22py26-3.3.so

3. Mercurial 설정

Mercurial 기본 정보를 설정하도록 명령 행에서 다음 내용을 입력해 .hgrc 파일을 만든다.

cd %userprofile%
copy con .hgrc
[ctrl+z]
[enter]

방금 만든 .hgrc 파일에 username 정보를 다음 형식으로 적는다.

[ui]
username = Hg Admin <hg.admin@plab.net>

명령 행에서 다음처럼 입력하고 결과가 No problems detected라고 나오면 정상이다.

hg debuginstall

Hg Debuginstall

저장소를 웹으로 접근하는데 필요한 cgi 스크립트와 설정 정보를 저장할 디렉터리를 만든다. 여기서는  D:hgweb이라고 만들었다. 이 디렉터리에 hgweb.cgi 파일을 두고 다음처럼 바꾼다.

#!C:/Python26/python.exe
#
# An example hgweb CGI script, edit as necessary
# See also http://mercurial.selenic.com/wiki/PublishingRepositories

# Path to repo or hgweb config to serve (see 'hg help hgweb')
config = "D:/hgweb/hgweb.config"

# Uncomment and adjust if Mercurial is not installed system-wide:
#import sys; sys.path.insert(0, "/path/to/python/lib")

# Uncomment to send python tracebacks to the browser if an error occurs:
import cgitb; cgitb.enable()

from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb(config)
wsgicgi.launch(application)

위 내용 중 config에 지정한 것처럼 D:hgweb에 hgweb.config 파일을 만들고 다음처럼 설정한다. 각 항목에 대한 자세한 내용은 여기를 참조한다. 참고로 encoding은 웹브라우저에서 사용할 인코딩이다. UTF-8로 사용하면 좋겠지만 diff에서 보여주는 소스 코드 내용에 한글이 포함되어 있으면 깨지는 단점이 있다. 소스 코드 파일 인코딩이 UTF-8이면 이 설정 역시 UTF-8로 하면 된다.

[web]
logourl = http://plab.net/hg/
baseurl = http://plab.net/hg/
encoding = EUC-KR
allow_push = *
push_ssl = false
style = default
allow_archive = bz2 gz zip

[paths]
/ = D:/Repos/hg/*

위 내용에 따라 저장소는 D:Reposhg에 두고 웹으로 접근할 때는 주소에 /hg를 붙이면 된다.

이제 시험용으로 D:Reposhgsandbox 저장소를 만든다. 이 저장소에만 적용할 설정은 D:Reposhgsandbox.hghgrc 파일에 하면 된다.

4. Apache 웹 서버 설정

다음 내용을 httpd-vhosts.conf 파일에 추가한다.

ScriptAlias /hg "D:/hgweb/hgweb.cgi"
<Directory "D:/hgweb">
  Order allow,deny
  Allow from all
  AllowOverride All
  Options ExecCGI
  AddHandler cgi-script .cgi
</Directory>

Apache 웹 서버를 중지했다 다시 실행한 후 http://plab.net/hg로 접속한다. 아래처럼 저장소 화면이 나오면 정상이다.

Mercurial Repositories on Web

현재는 아무런 인증을 하지 않으므로 누구나 접속해 내용을 볼 수 있고 커밋할 수도 있다. 이제 OpenLDAP을 사용해 인증하도록 바꿀 차례다.

httpd.conf에서 다음 내용에 대한 주석을 해제한다. 만약 없으면 추가한다.

LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so

그리고 httpd-vhosts.conf 파일에 인증 설정을 추가한다. 위에서 추가한 내용을 포함해 전체 내용은 다음과 같다.

<VirtualHost *:80>
  ScriptAlias /hg "D:/hgweb/hgweb.cgi"
  <Directory "D:/hgweb">
    Order allow,deny
    Allow from all
    AllowOverride All
    Options ExecCGI
    AddHandler cgi-script .cgi
  </Directory>

  <Location "/hg">
    AuthName "PLAB Hg Repositories"
    AuthType Basic
    AuthBasicProvider ldap
    AuthzLDAPAuthoritative off
    AuthLDAPURL "ldap://localhost/ou=People,dc=plab,dc=net?uid?sub?(objectClass=*)"
    Require valid-user
  </Location>
</VirtualHost>

이제 http://plab.net/hg에 접속하면 계정과 암호를 요청하는 창이 뜨는데 여기에는 OpenLDAP 계정(UserName)과 암호를 사용하면 된다.

Mercurial OpenLDAP Authentication

로그인 했을 때 위처럼 저장소 화면이 나오면 된다.

You may also like...

  • Hyon Lim

    Redmine + Mercurial 을 이용해서 개발서버를 구축중입니다.
    이 강좌와 거의 비슷하게 진행하고 있는데, 다만, hg repository를 개별 사용자것만
    보이게 하고 싶습니다. 좋은 방법이 있을까요?

    • http://surpreem.com Surpreem

      간단하면서도 번거로운 방법은 사용자별로 접근 주소를 다르게 하고, 접근 주소마다 위 설정을 따로 하는 겁니다. 설정만 추가하고 바꾸면 되니까 간편하긴 한데 사용자마다 계속 그렇게 해야 하니 번거롭죠.

      더 나은 방법은 SSH를 사용하고 Shared SSH 내용처럼 접근 제한을 하는 겁니다. 일단 SSH를 사용하면 웹처럼 저장소를 볼 수 없고 주소를 알더라도 키와 접근 제한 설정이 맞아야 접근 할 수 있습니다.