7장 Trac

이재홍 http://www.pyrasis.com 2007.10.27 ~ 2008.04.20

목차

설치 및 설정

지금까지 Subversion과 Apache를 연동하여 서버를 구축하였습니다. 이제 여기에 Trac을 설치해 보겠습니다. Trac은 Python으로 만들어져 있기 때문에 Python이 필요합니다. 그리고 Subversion Python Binding, Genshi, mod_python, pysqlite등이 필요합니다. enscript는 소스코드 문법강조(Highlighting)에 필요합니다.

Trac은 이 글을 쓰고 있는 지금 0.11b2가 출시된 상태입니다. 이 책에서는 최신 버전인 0.11b2를 이용할 것입니다.

설치에 필요한 파일들은 다음과 같습니다.

  • Trac-0.11b2.win32.exe : http://trac.edgewall.org/wiki/TracDownload 부록 CD 경로 : Application/Trac/
  • Genshi-0.4.4.win32.exe : http://genshi.edgewall.org/wiki/Download 부록 CD 경로 : Application/Trac/
  • python-2.5.1.msi : http://python.org/download/ 부록 CD 경로 : Application/Python/
  • svn-python-1.4.6.win32-py2.5.exe : http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&expandFolder=8100&folderID=0 부록 CD 경로 : Application/Subversion/Apache-2.2
  • ez_setup.py : http://peak.telecommunity.com/DevCenter/setuptools 부록 CD 경로 : Application/Trac/
  • mod_python-3.3.1.win32-py2.5-Apache2.2.exe : http://www.modpython.org/ 부록 CD 경로 : Application/Trac/
  • pysqlite-2.3.5.win32-py2.5.exe : http://initd.org/tracker/pysqlite/wiki/pysqlite 부록 CD 경로 : Application/Trac/
  • enscript-1.6.3-9-bin.exe : http://sourceforge.net/project/showfiles.php?group_id=23617&package_id=16960 부록 CD 경로 : Application/GNU Win32/
TIP
svn-python-1.4.6.win32-py2.5.exe는 두 가지가 있습니다. Apache 2.0용과 Apache 2.2용 인데, 파일 이름은 똑같지만 받는 곳이 다릅니다. 일반적인 Subversion을 받는 곳에 있는 파일은 Apache 2.0용입니다. 반드시 위의 URL에서 svn-python-1.4.6.win32-py2.5.exe를 다운로드해야 합니다. Windows Apache 2.2.x로 따로 분류되어 있습니다. Apache 버전이 맞지 않으면 이후 Subversion과 관련된 모든 부분이 정상적으로 동작하지 않습니다.

Python

Trac은 Python으로 작성되어 있습니다. 따라서 Trac을 동작시키기 위해서는 Python이 필요합니다.

  1. python-2.5.1.msi 파일로 Python을 설치합니다. Next를 눌러 넘어갑니다.


    그림 7-1 Python 사용자 지정 화면

  2. Python을 설치할 디렉터리를 지정하는 화면입니다. 기본 설정대로 설치합니다.


    그림 7-2 Python 설치 디렉터리 지정 화면

  3. 설치할 Python 구성 요소를 선택하는 화면입니다. 기본 설정대로 설치합니다.


    그림 7-3 Python 설치 구성 요소 선택 화면

  4. Finish를 눌러 설치를 완료합니다.


    그림 7-4 Python 설치 완료

svn-python

Subversion Python Binding(svn-python)은 Python으로 Subversion의 저장소의 내용을 읽어올 때 사용합니다. Trac이 Python으로 작성되어 있고 Subversion 저장소의 내용을 읽어와햐 하기 때문에 svn-python을 설치하는 것입니다.

  1. svn-python-1.4.6.win32-py2.5.exe 파일을 실행하여 Subversion Python Binding을 설치를 시작합니다. 다음을 눌러 넘어갑니다.


    그림 7-5 Subversion Python Bindings 설치 마법사

  2. Python이 정상적으로 설치가 되어있다면 설치된 Python이 표시될 것입니다. 다음을 눌러 넘어갑니다.


    그림 7-6 설치된 Python 선택 화면

  3. 다음을 누르면 설치가 시작됩니다.


    그림 7-7 Subversion Python Bindings 설치 준비

  4. 마침을 눌러 설치를 완료합니다.


    그림 7-8 Subversion Python Bindings 설치 완료

Genshi

Genshi는 템플릿 엔진입니다. Trac 0.10까지는 Clearsilver를 사용했지만 Trac 0.11부터는 Genshi를 사용합니다(템플릿 엔진은 웹 화면을 구성하는 HTML과 내부동작을 담당하는 Python 코드를 연결할 때 사용됩니다).

  1. Genshi-0.4.4.win32.exe 파일로 Genshi를 설치합니다. 다음을 눌러 넘어갑니다.


    그림 7-9 Genshi 설치 마법사

  2. Python이 정상적으로 설치되어 있다면 Python이 표시될 것입니다. 다음을 눌러 넘어갑니다.


    그림 7-10 설치된 Python 선택 화면

  3. 다음을 누르면 설치가 시작됩니다.


    그림 7-11 Genshi 설치 준비

  4. 마침을 눌러 설치를 완료합니다.


    그림 7-12 Genshi 설치 완료

setuptools

setuptools는 Python으로 만들어진 각종 프로그램을 웹에서 다운로드하여 손쉽게 설치해주는 도구입니다. 이 setuptools는 Trac을 실행할 때 꼭 필요하므로 반드시 설치해야 합니다. 뿐만 아니라 Trac의 플러그인을 설치할 때에도 필요합니다. setuptools는 ez_setup.py를 실행해주면 설치됩니다. 명령 프롬프트에서 다음과 같이 입력합니다(ez_setup.py 파일을 더블클릭 해도 됩니다).

C:\Python25\python.exe ez_setup.py


그림 7-13 ez_setup.py를 사용하여 setuptools를 설치하는 화면

웹에서 setuptools 파일을 받아서 자동으로 설치해줍니다.

mod_python

mod_python은 Apache에서 Python 코드를 빠르게 실행하기 위해 사용합니다. mod_python 없이 CGI 방식으로 Trac을 실행할 수 있지만 속도가 상당히 느립니다.

  1. mod_python-3.3.1.win32-py2.5-Apache2.2.exe 파일로 mod_python을 설치합니다. 다음을 눌러 넘어갑니다.


    그림 7-14 mod_python 설치 마법사

  2. Python이 정상적으로 설치되어 있다면 설치된 Python이 표시될 것입니다. 다음을 눌러 넘어갑니다.


    그림 7-15 설치된 Python 선택 화면

  3. 다음을 누르면 설치가 시작됩니다.


    그림 7-16 설치된 mod_python 설치 준비

  4. 파일을 몇 개 복사하면 Apache가 설치된 디렉터리를 설정하는 화면이 나옵니다. Apache가 설치된 디렉터리인 C:\Program Files\Apache Software Foundation\Apache2.2를 선택합니다.


    그림 7-17 Apache 설치 디렉터리 지정 화면

  5. 마침을 눌러 설치를 완료합니다.


    그림 7-18 mod_python 설치 완료

C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 파일을 열고 모듈 설정 부분에 다음과 같이 mod_python.so를 추가합니다.

LoadModule python_module modules/mod_python.so

httpd.conf

#LoadModule speling_module modules/mod_speling.so
#LoadModule status_module modules/mod_status.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule userdir_module modules/mod_userdir.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule python_module modules/mod_python.so

pysqlite

pysqlite는 Python에서 sqlite 데이터베이스에 접근할 수 있게 해주는 라이브러리입니다. Trac은 Python으로 작성되어 있고, sqlite 데이터베이스로 자료를 저장하기 때문에 pysqlite가 꼭 필요합니다.

  1. pysqlite-2.3.5.win32-py2.5.exe 파일로 pysqlite를 설치합니다. 다음을 눌러 넘어갑니다.


    그림 7-19 pysqlite 설치 마법사

  2. Python이 정상적으로 설치되어 있다면 설치된 Python이 표시될 것입니다. 다음을 눌러 넘어갑니다.


    그림 7-20 설치된 Python 선택 화면

  3. 다음을 눌러 설치를 시작합니다.


    그림 7-21 pysqlite 설치 준비

  4. 마침을 눌러 설치를 완료합니다.


    그림 7-22 pysqlite 설치 완료

enscript

enscript는 소스 코드 컬러로 표시할 수 있도록 해주는 프로그램입니다. Trac의 Browse Source 메뉴에서 소스 코드를 볼 수 있는데, 이 때 소스 코드를 각 문법에 따라 컬러로 표시해줍니다.

enscript-1.6.3-9-bin.exe 파일로 enscript를 설치합니다. enscript의 설치 방법은 특별한 것이 없습니다. 기본 설정대로 설치하면 됩니다.

Trac

이제 Trac을 설치할 차례입니다. Trac은 앞에서 설치한 프로그램들과 마찬가지로 Python 패키지 형태로 되어 있습니다.

  1. Trac-0.11b2.win32.exe 파일로 Trac을 설치합니다. 다음을 눌러 넘어갑니다.


    그림 7-23 Trac 설치 마법사

  2. Python이 정상적으로 설치되어 있다면 설치된 Python이 표시될 것입니다. 다음을 눌러 넘어갑니다.


    그림 7-24 설치된 Python 선택 화면

  3. 다음을 눌러 설치를 시작합니다.


    그림 7-25 Trac 설치 준비

  4. 마침을 눌러 설치를 완료합니다.


    그림 7-26 Trac 설치 완료

TIP
이 책에서 설치한 Trac의 버전은 0.11b2입니다. 개발 버전의 Trac을 설치하려면 다음과 같이 하면 됩니다(Trac을 처음 설치하시는 분들에게는 추천하지 않습니다). Trac-0.11b1.win32.exe 파일로 이미 Trac을 설치했다면 이 부분은 넘어갑니다. 명령 프롬프트를 실행하고 아래와 같이 입력합니다.
C:\Python25\Scripts\easy_install.exe http://svn.edgewall.com/repos/trac/trunk

그림 7-27 easy_install.exe를 이용하여 개발 버전 Trac 설치
Trac과 필요한 파일들을 웹에서 받아서 설치해줍니다.

Trac은 trac-admin.exe로 새로운 프로젝트를 만들거나 각종 관리를 할 수 있습니다. 여기서는 “Subversion Symbol Indexing 사용”에서 실습한 example 프로젝트에 대해 Trac을 설정해보겠습니다.

C:\trac 디렉터리를 생성합니다. 그리고 명령 프롬프트에서 다음과 같이 입력하여 예제 프로젝트를 생성합니다. initenv 명령은 Trac 프로젝트를 생성하고 설정하는 역할을 합니다.

C:\Python25\Scripts\trac-admin.exe c:\trac\example initenv


그림 7-28 trac-admin.exe로 새 프로젝트 생성

Project Name [My Project]>에는 프로젝트 이름으로 example을 지정합니다. Database connection string [sqlite:db/trac.db]>에는 엔터를 눌러 기본 설정대로 합니다. Repository type [svn]>에서는 저장소 형식을 지정합니다. 엔터를 눌러 기본 설정대로 Subversion을 사용합니다.


그림 7-29 Subversion 저장소 경로 설정

Path to repository [/path/to/repos]>에는 example 저장소의 경로인 c:\repos\example를 입력합니다. 저장소 경로 입력 후 조금 기다리면 Trac 프로젝트가 생성됩니다.

Apache에서 Trac을 실행하기 위해 httpd.conf를 열고 아래와 같이 설정합니다. http 프로토콜과 https 프로토콜 두가지 설정 방법이 있는데 둘 중 한가지만 선택하여 설정합니다.

TIP
http 프로토콜은 기본적으로 사용되는 프로토콜이라 설정 방법이 간단하지만 보안성이 떨어집니다. 특히 서버와 클라이언트 사이에 오고가는 패킷을 분석하여 정보를 얻어내는 패킷 스니핑에 취약합니다. https 프로토콜은 모든 정보를 암호화 하여 전송하기 때문에 패킷 스니핑에 안전합니다. 하지만 설정하기가 복잡한 것이 단점입니다.

http 프로토콜을 사용하려고 할 경우

Apache와 Subversion을 연동할 때 아래 내용에서 <Location /svn> ... </Location> 부분을 설정했을 것입니다. 따라서 <Location /svn> ... </Location> 부분은 그대로 두고 <Location /trac> ... </Location><LocationMatch "/trac/[^/]+/login"> ... </LocationMatch> 부분을 추가합니다.

NameVirtualHost *:80
<VirtualHost *:80>
    <Location /svn>
        DAV svn
        SVNParentPath "C:\Repos"

        AuthzSVNAccessFile "C:\Repos\authz"

        AuthType Basic
        AuthName "Subversion Repository"
        AuthUserFile "C:\Repos\htpasswd"
        Require valid-user
    </Location>

    <Location /trac>
        SetHandler mod_python
        PythonHandler trac.web.modpython_frontend 
        PythonOption TracEnvParentDir C:\trac
        PythonOption TracUriRoot /trac
    </Location>

    <LocationMatch "/trac/[^/]+/login">
        AuthType Basic
        AuthName "Trac"
        AuthUserFile C:\Repos\htpasswd
        Require valid-user
    </LocationMatch>
</VirtualHost>

https 프로토콜을 사용하려고 할 경우

Apache와 Subversion을 연동할 때 아래 내용에서 1<Location /svn> … </Location>1 부분을 설정했을 것입니다. 따라서 1<Location /svn> … </Location>1 부분은 그대로 두고 1<Location /trac> … </Location>1과 1<LocationMatch “/trac/[^/]+/login”> … </LocationMatch>1 부분을 추가합니다.

NameVirtualHost *:443
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile "C:\Program Files\Apache Software Foundation\Apache2.2\conf\example.crt"
    SSLCertificateKeyFile "C:\Program Files\Apache Software Foundation\Apache2.2\conf\example.key"
    SSLProtocol all
    SSLCipherSuite HIGH:MEDIUM
    
    <Location /svn>
        DAV svn
        SVNParentPath "C:\Repos"

        AuthzSVNAccessFile "C:\Repos\authz"

        AuthType Basic
        AuthName "Subversion Repository"
        AuthUserFile "C:\Repos\htpasswd"
        Require valid-user
    </Location>

    <Location /trac>
        SetHandler mod_python
        PythonHandler trac.web.modpython_frontend 
        PythonOption TracEnvParentDir C:\trac
        PythonOption TracUriRoot /trac
    </Location>

    <LocationMatch "/trac/[^/]+/login">
        AuthType Basic
        AuthName "Trac"
        AuthUserFile C:\Repos\htpasswd
        Require valid-user
    </LocationMatch>
</VirtualHost>

설정을 저장 한 후 Apache를 재시작합니다. 이제 http://localhost/trac(https의 경우 https://localhost/trac)에 접속합니다. 아래 화면과 같이 나온다면 정상적으로 설치와 설정이 된 것입니다. 각 프로젝트의 Trac 사이트로 연결되는 링크를 표시해주고 있습니다. 프로젝트를 여러 개 만들면 여러 개가 표시됩니다.


그림 7-30 Trac 인덱스 페이지

http://localhost/trac/example과 같이 URL에 프로젝트 이름을 지정해 주면 해당 프로젝트의 Trac 사이트로 접속 할 수 있습니다.


그림 7-31 example 프로젝트의 Trac 사이트에 접속한 화면

Trac을 관리할 관리자 계정을 만들어야 합니다. htpasswd.exe를 이용하여 ID를 추가합니다. 아래 명령에서는 admin은 계정 이름입니다.

"C:\Program Files\Apache Software Foundation\Apache 2.2\bin\htpasswd.exe" C:\Repos\htpasswd admin

example 프로젝트에 admin을 관리자로 등록합니다. 아래 명령에서 admin은 계정 이름입니다. TRAC_ADMIN은 Trac에서 관리자 권한을 뜻합니다.

C:\Python25\Scripts\trac-admin.exe C:\trac\example permission add admin TRAC_ADMIN
TIP
일반 사용자를 Trac 관리자로 설정하기
일반 사용자도 관리자 권한을 설정하면 Trac 관리자가 될 수 있습니다. 아래는 sampleuser를 관리자로 설정하는 예제입니다.
C:\Python25\Scripts\trac-admin.exe C:\trac\example permission add sampleuser TRAC_ADMIN

플러그인 설치 및 설정

Trac은 기본적으로 설치한 상태에서는 사용하기가 조금 불편합니다. 그래서 Trac을 편리하게 사용할 수 있도록 많은 플러그인들이 나와 있습니다. Trac 사용에 필수적인 플러그인을 설치해보도록 하겠습니다.

Ini Admin Plugin

Trac의 설정 파일은 각 프로젝트의 conf 디렉터리 아래에 있는 trac.ini 파일입니다. 예를 들어 원래는 C:\trac\example\conf\trac.ini 파일을 에디터로 열어 일일이 편집을 해줘야 하지만, Ini Admin Plugin을 사용하면 Trac의 Admin 페이지에서 trac.ini 파일을 편집할 수 있습니다. iniadminplugin_0.11.zip 파일은 다음 URL에서 다운로드 할 수 있습니다.

먼저 iniadminplugin_0.11.zip 파일의 압축을 해제 하면 iniadmin 디렉터리와 setup.py 파일이 나옵니다. python.exe로 setup.py를 다음과 같이 실행해주면 됩니다.

C:\Python25\python.exe setup.py install


그림 7-32 Ini Admin Plugin 설치

설치가 끝난 뒤 Apache를 재시작합니다.

TIP
Ini Admin Plugin은 trac-hacks 저장소에서 직접 받아서 설치할 수도 있습니다.
C:\Python25\Scripts\easy_install.exe http://trac-hacks.org/svn/iniadminplugin/0.11/

이제 example 프로젝트 페이지로 접속합니다. Login 링크를 눌러 admin 계정으로 로그인하면 메뉴바의 가장 오른쪽에 Admin 메뉴가 생깁니다.


그림 7-33 Trac의 Admin 메뉴

Admin 메뉴를 클릭한 후 Plugin 항목을 클릭하면 설치한 플러그인의 목록이 표시됩니다. iniadmin 0.2를 클릭하고 Enabled에 체크한 뒤 Apply changes를 눌러 설정을 적용하면 iniadmin 플러그인을 사용할 수 있게 됩니다.


그림 7-34 Ini Admin Plugin 사용 설정

Account Manager Plugin

htpasswd.exe로 일일이 계정을 만드는 것은 상당히 귀찮은 작업입니다. 이런 작업을 Trac의 Admin 메뉴에서 할 수 있도록 해주는 플러그인이 Account Manager Plugin입니다. accountmanagerplugin_0.11.zip 파일은 다음 URL에서 다운로드 할 수 있습니다.

먼저 accountmanagerplugin_0.11.zip 파일의 압축을 해제 하면 acct_mgr 디렉터리와 setup.py 파일이 나옵니다. python.exe로 setup.py를 다음과 같이 실행해주면 됩니다.

C:\Python25\python.exe setup.py install


그림 7-35 Account Manager Plugin 설치

설치가 끝난 뒤 Apache를 재시작합니다.

TIP
Account Manager Plugin은 trac-hacks 저장소에서 직접 받아서 설치할 수도 있습니다.
C:\Python25\Scripts\easy_install.exe http://trac-hacks.org/svn/accountmanagerplugin/trunk

Admin 메뉴의 Plugin 항목에서 tracaccountmanager 0.2dev를 클릭하면 아래와 같이 기능을 선택할 수 있습니다.


그림 7-36 Account Manager Plugin 기능 선택

기본적으로 AccountManagerAdminPage, AccountManager, HtpasswdStore, AccountModule을 선택합니다. 각자 상황에 맞게 선택적으로 사용하면 됩니다.

  • LoginModule은 로그인 창을 따로 띄우지 않고 Trac 사이트 안에 로그인 페이지가 나오도록 합니다.
  • RegistrationModule을 사용하면 Register 링크가 생기는데, 여기서 사용자 각자가 ID 등록을 할 수 있습니다.

Admin 메뉴의 Accounts → Configuration 항목에서 다음과 같이 htpasswd 파일의 위치를 지정해줍니다. 앞에서 만들어두었던 C:\Repos\htpasswd를 사용하겠습니다.


그림 7-37 htpasswd 파일의 경로 설정

다음은 Users 항목을 클릭한 화면입니다. 이 화면에서 ID를 추가하거나 삭제할 수 있습니다.


그림 7-38 사용자 계정 관리 페이지

Trac 사용 전 기본 설정

IniAdmin 플러그인을 설치했으니, Trac을 사용하기 위한 기본 설정을 해보겠습니다. http://localhost/trac/example에 접속한 후 admin 계정으로 로그인합니다. 그리고 Admin 메뉴를 클릭합니다.

  • 1. trac.ini의 각 항목에서 기본적인 설정을 할 수 있습니다.


    그림 7-39 trac.ini의 항목

  • 2. trac.ini의 trac 항목을 클릭합니다. 여기서는 authz 설정 및 인코딩 설정을 합니다.


    그림 7-40 authz 파일 경로 설정과 저장소 이름 설정

authz_file은 Subversion의 권한 설정 파일인 authz 파일의 경로를 설정하는 부분입니다. C:\Repos\authz로 지정합니다.

authz_module_name에는 현재 저장소의 이름을 지정합니다. 우리는 example이라는 저장소를 만들었으므로 example로 설정합니다. authz 파일에서 설정한 것과 이 부분이 맞아야 Trac의 Browse Source 메뉴에서도 사용자 ID에 따라 소스 및 디렉터리의 표시 여부가 결정됩니다.


그림 7-41 소스 코드의 인코딩 설정

default_charset은 소스 코드의 인코딩을 설정하는 부분입니다. cp949로 지정합니다. 이 부분을 cp949로 설정하지 않으면 소스코드의 한글이 깨져서 표시되게 됩니다. 만약 소스 코드를 UTF-8로 저장하고 있다면 utf-8로 설정합니다.

TIP
cp949는 한글 윈도우의 기본 인코딩 명칭입니다.

trac.ini의 mimeviewer 항목을 클릭합니다. 여기서는 소스 코드의 문법 강조(Syntax Highlighting) 설정을 합니다.


그림 7-42 enscript 경로 설정

enscript_path는 enscript.exe의 경로를 설정하는 부분입니다. C:/progra~1/GnuWin32/bin/enscript.exe로 지정합니다. 이 부분을 설정하고 나면 Browse Source 메뉴에서 소스 코드가 컬러로 나옵니다.

TIP
enscript를 기본 설치했을 경우 C:\Program Files\GnuWin32\bin에 설치됩니다. 하지만, C:/progra~1/GnuWin32/bin/enscript.exe 처럼 \는 /로 해주고 Program Files는 progra~1로 설정해줘야 정상적으로 동작합니다.

trac.ini의 header_logo 항목을 클릭합니다. 여기서는 왼쪽 상단의 로고 이미지를 설정합니다.


그림 7-43 로고 이미지 설정

src는 로고 이미지 파일의 이름을 설정하는 부분입니다. 여기서는 기본 로고 이미지 파일인 trac_banner.png를 설정합니다. 사용자 고유의 이미지 파일을 사용하려면 C:\trac\example\htdocs에 이미지 파일을 넣고, src에 해당 이미지 파일의 이름을 설정하면 됩니다.

Subversion Hook Script 활용

이번에는 Subversion의 강력한 기능 중의 하나인 Hook 스크립트에 대해 알아본 후 이 Hook 스크립트와 Trac을 연동해보겠습니다.

Hook 스크립트는 저장소에 커밋, 속성 변경, 잠금 등을 하기 전과 한 후, 또 다른 작업을 실행할 수 있도록 해주는 스크립트입니다. 이 스크립트들은 저장소가 있는 서버 측에서 실행이 되며, 주로 메일 전송, 권한 관리, 로그 메시지 입력 여부 판단, Trac과의 연동 등에 사용됩니다. Hook 스크립트는 저장소의 hooks 디렉터리에 들어있습니다.

저장소를 처음 생성하면 Hook 스크립트들은 start-commit.tmpl, post-commit.tmpl 등과 같이 .tmpl 이라는 확장자를 붙이고 있습니다. 윈도우에서 실제로 사용하려면 이 tmpl 대신에 bat나 cmd 확장자를 사용해야 합니다. Hook 스크립트의 내용도 기본적으로 유닉스 쉘 스크립트 형식으로 되어있지만 윈도우에서 사용하려면 배치 파일(Windows 명령어 스크립트) 형식으로 만들어줘야 합니다.

Hook 스크립트의 종류

  • start-commit : 커밋 트랜잭션이 생성되기 전에 실행됩니다. 보통 사용자 ID를 판별하여 커밋 권한을 지정하는데 사용합니다(권한 관리를 authz 파일로 하지 않는 경우).
  • pre-commit : 커밋 트랜잭션이 생성된 후에 실행됩니다. 커밋 메시지를 입력하지 않으면 커밋을 할 수 없도록 하는데 사용됩니다.
  • post-commit : 커밋이 완전히 끝난 후에 실행됩니다. 커밋 로그 메일을 전송하거나, 이슈 트래커(Trac)에 커밋 로그를 전송하는데 사용합니다.
  • pre-revprop-change : 속성을 수정하기 전에 실행됩니다. 로그 메시지를 수정하려면 이 Hook 스크립트를 사용할 수 있도록 설정해줘야 합니다.
  • post-revprop-change : 속성 수정이 끝난 후에 실행됩니다. 속성 수정 결과를 메일로 전송할 때 사용합니다.
  • pre-lock : 잠금이 실행되기 전에 실행됩니다. 사용자 ID를 판별하여 잠금을 획득할 수 있는 권한을 지정하는데 사용합니다.
  • post-lock : 잠금이 실행 된 후에 실행됩니다. 잠금의 결과를 메일 등으로 전송할 때 사용합니다.
  • pre-unlock : 잠금이 해제되기 전에 실행됩니다. 사용자 ID를 판별하여 잠금 해제를 할 수 있는 권한을 지정하는데 사용합니다.
  • post-unlock : 잠금이 해제된 후 실행됩니다. 잠금 해제의 결과를 메일 등으로 전송할 때 사용합니다.

Hook 스크립트로 메일 전송하기

Hook 스크립트는 주로 각 동작의 실행 결과를 메일로 전송하는데 사용합니다. 윈도우에서 메일을 전송하는 방법은 크게 두 가지가 있습니다. 윈도우의 IIS 서버를 이용하여 메일을 보내는 방법과, 외부 SMTP 서버를 이용하여 메일을 보내는 방법이 있습니다. 이 책에서 외부 SMTP 서버는 Gmail을 이용하도록 하겠습니다.

IIS SMTP 서버로 메일 보내기

이번 예제에서 사용할 메일 전송용 스크립트(commit-email.pl)는 Perl로 작성되어 있습니다. 따라서 ActivePerl을 설치해야 하며 ActivePerl 설치 방법은 앞장의 ‘Subversion과 Symbol 연동하기’ 부분에 설명되어 있습니다.

commit-email.pl 스크립트는 부록 CD의 Subversion Hook 디렉터리에 포함되어 있으며 아래 URL에서도 받을 수 있습니다. 이 파일은 Subversion 소스의 tools/hook-scripts에 있는 파일이며, 한글 로그 메시지, 소스를 처리할 수 있도록 수정한 것입니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/Subversion%20Hooks/commit-email.pl
  • 부록 CD 경로 : Scripts/Subversion Hooks/

Windows XP에 SMTP 서버 설치하기

  1. 시작 → 제어판 → 프로그램 추가/제거 → Windows 구성 요소 추가/제거를 실행합니다. 인터넷 정보 서비스(IIS)를 더블클릭 합니다.


    그림 7-44 Windows 구성 요소 마법사에서 인터넷 정보 서비스(IIS) 선택

  2. SMTP Service를 체크하고 확인을 눌러 SMTP 서버를 설치합니다. Windows XP CD가 필요합니다.


    그림 7-45 SMTP Service 선택

Windows Server 2003에 SMTP 서버 설치하기

  1. 시작 → 관리 도구 → 서버 구성 마법사를 실행합니다. 다음을 눌러 넘어갑니다.


    그림 7-46 서버 구성 마법사 시작

  2. 다음을 눌러 넘어갑니다.


    그림 7-47 서버 구성 마법사 준비 단계

  3. 사용자 지정 구성을 선택하고 다음을 누릅니다.


    그림 7-48 서버 구성 마법사 구성 옵션

  4. 메일 서버(POP3, SMTP)를 선택하고 다음을 누릅니다.


    그림 7-49 서버 역할 선택

  5. 인증 방법(A):에는 로컬 Windows 계정, 전제 메일 도메인 이름(E):에는 example.com을 설정합니다. 만약, 서버가 도멩인 컨트롤러이거나 그에 속한 서버이면 Active Directory 통합 영역을 선택합니다. 도메인이 있는 서버이면 example.com이 아닌 서버의 도메인 이름을 입력합니다.


    그림 7-50 POP3 서비스 구성

  6. 다음을 누르면 설치를 시작합니다. Windows Server 2003 CD가 필요합니다.


    그림 7-51 서버 구성 마법사 선택 사항 요약

IIS SMTP 서버 설정

  1. Windows XP와 Windows Server 2003 모두 설정 방법은 똑같습니다. 제어판 → 관리 도구→ 인터넷 정보 서비스 → 기본 SMTP 가상 서버 → 속성을 선택합니다.


    그림 7-52 인터넷 정보 서비스의 기본 SMTP 가상 서버

  2. 액세스 탭으로 이동하여 릴레이(E)… 버튼을 누릅니다.


    그림 7-53 기본 SMTP 가상 서버 등록 정보

  3. 추가(A)… 버튼을 누릅니다.


    그림 7-54 릴레이 제한

  4. 단일 컴퓨터(S)의 IP 주소(A):에 127.0.0.1을 입력하고 확인을 누릅니다.


    그림 7-55 컴퓨터 IP 및 도메인 설정

  5. 이제 컴퓨터(C):에 127.0.0.1이 허가된 것을 확인할 수 있습니다. 확인을 눌러 창을 닫습니다.


    그림 7-56 릴레이 제한

C:\tools라는 디렉터리를 만들고 이 디렉터리 안에 commit-email.pl 파일을 복사합니다. 그리고 commit-email.pl 파일을 열고 $svnlook 부분을 다음과 같이 수정합니다.

# Svnlook path.
my $svnlook = "C:\\Program Files\\Subversion\\bin\\svnlook.exe";

저장소는 이전에 만들어두었던 example 저장소를 사용하도록 하겠습니다. example 저장소의 hooks 디렉터리 아래에 post-commit.cmd 파일을 아래의 내용으로 만듭니다. 커밋이 완료 된 후 커밋 로그를 메일로 전송해보도록 하겠습니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/Subversion%20Hooks/post-commit.cmd
  • 부록 CD 경로 : Scripts/Subversion Hooks/

post-commit.cmd

@ECHO OFF
REM POST-COMMIT HOOK

SET REPOS=%1
SET REV=%2

SET PROJECT=example
SET HOSTNAME=example.com
SET EMAIL=source-changes@sample-mail.com
SET ENC=euc-kr

SET TOOLS_DIR="C:\tools"

%TOOLS_DIR%\commit-email.pl %REPOS% %REV% -e %ENC% -h %HOSTNAME% -s %PROJECT% %EMAIL%
  • PROJECT에는 현재 프로젝트의 이름을 지정합니다.
  • HOSTNAME에는 저장소 서버의 이름(도메인 네임)을 지정합니다.
  • EMAIL에는 커밋 메일을 받을 메일이나 메일링 리스트의 주소를 지정합니다.
  • ENC에는 소스코드가 인코딩된 방식입니다. 소스코드가 UTF-8로 인코딩 되어 있다면 ENC=으로 지정합니다(ENC 설정이 올바르지 않을 경우 메일에 포함되는 Diff에서 한글이 정상적으로 출력되지 않을 수 있습니다).
  • TOOLS_DIR은 commit-email.pl 파일이 있는 디렉터리입니다.

이제 설정이 끝났으니 메일이 정상적으로 전송되는지 테스트를 해야 합니다. 메일 테스트는 명령 프롬프트에서 다음과 같이 실행합니다.

C:\Repos\example\hooks\post-commit.cmd c:\repos\example 3

C:\Repos\example은 저장소의 경로이며 3은 커밋 로그 메시지를 보내고자 하는 특정 리비전입니다. Subversion에서는 소스를 리비전 단위로 관리하므로 메일은 리비전 단위로 보내야 합니다.

커밋 메일을 받는 주소가 GMail이면 개인 PC에서 IIS SMTP 서버로 메일을 보낼 경우 스팸으로 처리되어 메일이 도착하지 않을 수도 있습니다.

Gmail 계정 연동

이번에는 mailer.py 스크립트와, mailer.conf.example를 사용하도록 하겠습니다. 이 스크립트는 Subversion 소스의 tools/hook-scripts에 있는 파일이며, Diff 결과에서 한글을 처리할 수 있도록 하고 윈도우에 맞게 수정한 것입니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/Subversion%20Hooks/mailer.py https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/Subversion%20Hooks/mailer.conf.example
  • 부록 CD 경로 : Scripts/Subversion Hooks/

mailer.py는 diff.exe가 필요합니다. diffutils-2.8.7-1.exe를 사용하겠습니다.

  • 다운로드 주소 : http://sourceforge.net/project/showfiles.php?group_id=23617&package_id=16423
  • 부록 CD 경로 : Applications/GNU Win32/

diffutils-2.8.7-1.exe 설치는 특별한 것이 없으므로 기본 설정대로 설치합니다.

C:\tools라는 디렉터리를 만들고 이 디렉터리에 mailer.py, mailer.conf.example 파일을 복사합니다. mailer.conf.example는 mailer.conf로 이름을 변경합니다.

mailer.py는 Gmail 계정뿐만 아니라 IIS SMTP 서버도 사용 가능합니다. 자신의 상황에 맞게 IIS SMTP 서버와 Gmail 계정 중 하나를 선택하여 사용하면 됩니다.

IIS SMTP 서버

mailer.conf에서 smtp_hostname를 설정합니다. Subversion 저장소가 있는 컴퓨터에 IIS SMTP 서버를 설치했다면 localhost(127.0.0.1)입니다. 다른 서버에 설치했다면 해당 서버의 IP 주소나 도메인을 지정합니다.

# This option specifies the hostname for delivery via SMTP.
smtp_hostname = localhost

Gmail 계정

GMail 계정을 이용하여 커밋 메일을 보낼 수 있습니다. mailer.conf에서 SMTP 서버와, GMail ID, 암호를 설정합니다.

# This option specifies the hostname for delivery via SMTP. 
smtp_hostname = smtp.gmail.com:587

# Username and password for SMTP servers requiring authorisation. 
smtp_username = example@gmail.com
smtp_password = (이메일 암호)

mailer.py의 SMTPOutput 클래스 finish 함수를 아래와 같이 수정합니다.

def finish(self):
  server = smtplib.SMTP(self.cfg.general.smtp_hostname)
  if self.cfg.is_set('general.smtp_username'):
    server.ehlo()         # for GMail
    server.starttls()     # for GMail
    server.ehlo()         # for GMail
    server.login(self.cfg.general.smtp_username,
                 self.cfg.general.smtp_password)
  server.sendmail(self.from_addr, self.to_addrs, self.buffer.getvalue())
  server.close()          # server.quit() to server.close()

이번에는 Diff와 받는 메일 주소를 설정하겠습니다. Diff 설정을 해주어야 커밋 로그 메일에서 소스 코드의 수정 내용을 표시해 줄 수 있습니다. 환경 변수에서 시스템 변수(S)의 Path에 C:\Program Files\GnuWin32\bin를 추가합니다.


그림 7-57 환경 변수에 시스템 변수의 Path에 경로 추가

TIP
환경 변수에 추가한 뒤 재부팅을 해야 정상적으로 실행됩니다.

계속해서 mailer.conf에 Diff 설정과 보내는 메일 주소 받는 주소를 설정합니다. 받는 메일 주소는 공백으로 구분하여 여러 개를 지정할 수 있습니다.

C:\tools\mailer.conf

# This is not passed to the shell, so do not use shell metacharacters.
# The command is split around whitespace, so if you want to include
# whitespace in the command, then ### something ###.
diff = diff.exe -u -L %(label_from)s -L %(label_to)s %(from)s %(to)s

# The default From: address for messages.  If the from_addr is not
# specified or it is specified but there is no text after the `=',
# then the revision's author is used as the from address.  If the
# revision author is not specified, such as when a commit is done
# without requiring authentication and authorization, then the string
# 'no_author' is used.  You can specify a default from_addr here and
# if you want to have a particular for_repos group use the author as
# the from address, you can use "from_addr =".
from_addr = mailer@sample.com

# The default To: addresses for message.  One or more addresses,
# separated by whitespace (no commas):
to_addr = source-changes@sample-mail.com

diff에는 diff.exe로 설정하고, from_addr은 커밋 로그 메일을 보낼 때 여기에 지정한 메일 주소로 메일이 전송됩니다. to_addr은 커밋 로그 메일을 받을 주소나 메일링 리스트입니다.

example 저장소의 hooks 디렉터리에 post-commit.cmd 파일을 아래의 내용으로 만듭니다.

post-commit.cmd

@ECHO OFF
REM POST-COMMIT HOOK

SET REPOS=%1
SET REV=%2

SET TOOLS_DIR="C:\tools"

%TOOLS_DIR%\mailer.py commit %REPOS% %REV% %TOOLS_DIR%\mailer.conf

TOOLS_DIR은 mailer.py, mailer.conf 파일이 있는 디렉터리 입니다.

이제 설정이 끝났으니 메일이 정상적으로 전송 되는지 테스트를 해야 합니다. 메일 테스트는 명령 프롬프트에서 다음과 같이 실행합니다.

C:\Repos\example\hooks\post-commit.cmd c:\repos\example 3

C:\Repos\example은 저장소의 경로이며 3은 커밋 로그 메시지를 보내고자 하는 특정 리비전입니다. Subversion에서는 소스를 리비전 단위로 관리하므로 메일은 리비전 단위로 보내야 합니다.

TIP
커밋 메일을 받는 주소가 GMail이면 개인 PC에서 IIS SMTP 서버로 메일을 보낼 경우 스팸으로 처리되어 메일이 도착하지 않을 수도 있습니다.

로그 수정 사항을 메일로 보내기

커밋 로그 메일 뿐만 아니라 로그 메시지를 수정했을 때도 수정된 내용을 메일로 보낼 수도 있습니다. 이번 예제에서는 sed.exe가 필요합니다. sed-4.1.5-setup.exe를 사용하겠습니다.

  • 다운로드 주소 : http://sourceforge.net/project/showfiles.php?group_id=23617&package_id=16429
  • 부록 CD 경로 : Application/GNU Win32/

sed-4.1.5-setup.exe 설치는 특별한 것이 없으므로 기본 설정대로 설치합니다.

환경 변수에서 시스템 변수(S)에 Path에 C:\Program Files\GnuWin32\bin이 설정되어 있는지 확인합니다. 없다면 추가합니다.


그림 7-58 환경 변수에 시스템 변수의 Path에 경로 추가

example 저장소의 hooks 디렉터리에 pre-revprop-change.cmd 파일을 아래의 내용으로 만듭니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/Subversion%20Hooks/pre-revprop-change.cmd
  • 부록 CD 경로 : Scripts/Subversion Hooks/

pre-revprop-change.cmd

@ECHO OFF
REM PRE-REVPROP-CHANGE HOOK

SET REPOS=%1
SET REV=%2
SET USER=%3
SET PROPNAME=%4
SET ACTION=%5

SET SVN_DIR=C:\Program Files\Subversion

SET SVNLOOK="%SVN_DIR%\bin\svnlook.exe"

if not "%PROPNAME%" == "svn:log" goto error
%SVNLOOK% propget --revprop -r %REV% %REPOS% %PROPNAME% > %TEMP%\oldrevprop.tmp
goto end

:error
echo Changing revision properties other than svn:log is prohibited >&2

:end

같은 위치에 post-revprop-change.cmd 파일을 아래와 같은 내용으로 만듭니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/Subversion%20Hooks/post-revprop-change.cmd
  • 부록 CD 경로 : Scripts/Subversion Hooks/

post-revprop-change.cmd

@ECHO OFF
REM POST-REVPROP-CHANGE HOOK

SET REPOS=%1
SET REV=%2
SET USER=%3
SET PROPNAME=%4
SET ACTION=%5

SET PROJECT=example
SET HOSTNAME=example.com
SET EMAIL=source-changes@sample-mail.com

SET TOOLS_DIR="C:\tools"
SET SVN_DIR="C:\Program Files\Subversion"

SET SVNLOOK="%SVN_DIR%\bin\svnlook.exe"

%SVNLOOK% propget --revprop -r %REV% %REPOS% %PROPNAME% > %TEMP%\newrevprop.tmp
diff -u %TEMP%\oldrevprop.tmp %TEMP%\newrevprop.tmp | sed -e "s/^---.*$/--- old property value/" -e "s/^+++.*$/+++ new property value/" -e "/^\\.*$/d" > %TEMP%\revprop.diff

%TOOLS_DIR%\commit-email.pl --revprop-change -d %TEMP%\revprop.diff %REPOS% %REV% %USER% %PROPNAME% -h %HOSTNAME% -s %PROJECT% %EMAIL%
REM %TOOLS_DIR%\mailer.py propchange %REPOS% %REV% %USER% %PROPNAME% %TOOLS_DIR%\mailer.conf

DEL %TEMP%\oldrevprop.tmp
DEL %TEMP%\newrevprop.tmp
DEL %TEMP%\revprop.diff

기본적으로 commit-email.pl을 사용하도록 설정되어 있으며, mailer.py를 사용하려면 %TOOLS_DIR%\mailer.py 앞에 REM을 삭제하고 %TOOLS_DIR%\commit-email.pl 앞에 REM을 붙여 주면 됩니다. REM은 주석이며, 같은 일을 하는 commit-email.pl, mailer.py를 동시에 사용할 필요는 없기 때문입니다.

커밋 로그와 티켓 연동

Trac은 커밋 로그와 티켓을 연동할 수 있도록 Hook 스크립트를 제공해주고 있습니다. 커밋 로그에 티켓 번호를 지정하면 해당 티켓에 커밋 로그 메시지가 답글로 달리게 됩니다. 또한 로그 메시지에 티켓 번호를 지정하지 않거나, 티켓이 닫혀 있으면 커밋이 되지 않도록 할 수도 있습니다.

  • 다운로드 주소 : http://trac.edgewall.org/export/6697/tags/trac-0.11b2/contrib/trac-pre-commit-hook http://trac.edgewall.org/export/6697/tags/trac-0.11b2/contrib/trac-post-commit-hook
  • 부록 CD 경로 : Scripts/Subversion Hooks/

trac-pre-commit-hook 파일은 커밋 전에 로그 메시지를 분석하여 티켓 번호가 지정되어 있지 않거나, 티켓이 닫혀 있으면 커밋을 중단하는 기능을 하는 스크립트입니다.

trac-post-commit-hook 파일은 커밋이 끝난 후 로그 메시지를 지정한 티켓에 답글로 다는 기능을 하는 스크립트입니다.

먼저 커밋 로그 메시지를 티켓에 답글을 달 수 있도록 설정을 해보겠습니다. trac-post-commit-hook 파일을 C:\tools 디렉터리로 복사합니다. 그리고 example 저장소의 post-commit.cmd 파일을 아래와 같이 수정합니다(post-commit.cmd은 커밋 로그 메일 설정된 것에 이어서 설정하겠습니다). 이 파일은 부록 CD에 post-commit_trac.cmd라는 이름으로 포함되어 있습니다. 단 파일 이름은 post-commit.cmd로 바꾸어 주어야 정상적으로 동작합니다.

post-commit.cmd

@ECHO OFF
REM POST-COMMIT HOOK

SET REPOS=%1
SET REV=%2

SET PROJECT=example
SET HOSTNAME=example.com
SET EMAIL=source-changes@sample-mail.com
SET ENC=euc-kr

SET TOOLS_DIR=C:\tools
SET PYTHON_DIR=C:\Python25
SET TRAC_ENV=C:\trac\%PROJECT%

SET PYTHON="%PYTHON_DIR%\python.exe"

%PYTHON% "%TOOLS_DIR%\trac-post-commit-hook" -p "%TRAC_ENV%" -r "%REV%"

%TOOLS_DIR%\commit-email.pl %REPOS% %REV% -e %ENC% -h %HOSTNAME% -s %PROJECT% %EMAIL%

PYTHON_DIR은 Python이 설치된 디렉터리이며, PYTHON에는 python.exe 실행파일을 지정합니다. TRAC_ENV는 C:\trac에 프로젝트 이름을 붙인 것입니다.

이제 example 프로젝트 페이지(http://localhost/trac/example)에 접속 한 뒤 티켓을 새 티켓을 작성합니다. 먼저 New Ticket 메뉴를 클릭합니다. 그리고 Summery와 Description에 간단하게 내용을 입력하고 Create ticket 버튼을 눌러 티켓을 생성합니다.


그림 7-59 예제 티켓 생성

현재 #1 티켓에는 아무 답글이 없는 상태입니다.


그림 7-60 Ticket #1

example 저장소를 체크아웃한 뒤(http://localhost/svn/example/trunk) 아무 파일이나 수정을 하고 커밋을 합니다. 이 때 커밋 메시지는 아래와 같이 작성합니다.

TIP
체크아웃이 되지 않을 경우 C:\Repos\authz 파일에 다음을 추가합니다.
[example:/]
* = rw


그림 7-61 커밋 로그 메시지 입력

티켓 번호는 앞에 #을 붙여 표시합니다. 그리고 수정사항에 대해 세부적으로 기록합니다. re는 refs, see, references, addresses와 같습니다. 이와 같은 것들이 티켓에 답글을 다는 명령입니다. 이 명령어들이 로그 메시지 내에 있어야만 답글이 달립니다. close, closed, closes, fix, fixed, fixes 명령어는 커밋이 완료되면 티켓에 답글을 달고 티켓을 닫습니다. 물론 이 명령어들도 로그 메시지 내에 있어야 작동합니다. 커밋이 정상적으로 완료되면 아래와 같이 #1 티켓에 커밋 로그 메시지가 답글로 달립니다.


그림 7-62 답글로 달린 커밋 로그 메시지

이번에는 커밋 로그 메시지의 내용에 티켓 번호와 명령어가 포함되어 있는지, 해당 티켓 번호가 열려 있는지 검사하여, 티켓 번호와 명령어가 없거나, 티켓이 닫혀있다면 커밋이 되지 않도록 설정해보겠습니다. 이 동작은 trac-pre-commit-hook 스크립트를 사용합니다.

trac-pre-commit-hook 스크립트를 사용하려면 내용을 조금 수정해야 합니다(부록 CD에 포함된 trac-pre-commit-hook 파일은 아래 내용이 적용되어 있습니다).

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/Subversion%20Hooks/trac-pre-commit-hook
  • 부록 CD 경로 : Scripts/Subversion Hooks/

trac-pre-commit-hook 파일을 열고 main 함수를 찾은 뒤 env_path = sys.argv[1] 부분 아래를 다음과 같이 수정합니다.

trac-pre-commit-hook

def main:
    if len(sys.argv) != 3:
        print >> sys.stderr, 'Usage: %s <trac_project> <log_message>' % sys.argv[0]
        sys.exit(1)
    env_path = sys.argv[1]
    if not os.path.exists(sys.argv[2]):
        print >> sys.stderr , ' Log file not found.'
        sys.exit(1)
    f = open(sys.argv[2], 'r')
    log = f.read()
    f.close()

매개변수로 로그 메시지 문자열을 받지 않고, 로그 메시지가 저장된 파일의 경로를 받은 뒤 파일의 내용을 읽어오도록 수정한 것입니다. 윈도우 배치 파일에서는 문자열 자체를 매개변수로 처리하는 것이 정상적으로 동작하지 않을 때가 많습니다.

TIP
Python에서는 들여쓰기는 범위(Scope)를 나타내는 문법 요소입니다. 따라서 들여쓰기에 따라 동작이 달라지므로 들여쓰기에 주의해야 합니다.

수정한 trac-pre-commit-hook 파일을 C:\tools 디렉터리로 복사합니다.

example 저장소의 hooks 디렉터리(C:\Repos\example\hooks) 아래에 pre-commit.cmd 파일을 아래의 내용으로 만듭니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/Subversion%20Hooks/pre-commit.cmd
  • 부록 CD 경로 : Scripts/Subversion Hooks/

pre-commit.cmd

@ECHO OFF
REM PRE-COMMIT HOOK

SET REPOS=%1
SET TXN=%2

SET PROJECT=example

SET TOOLS_DIR=C:\tools
SET SVN_DIR=C:\Program Files\Subversion
SET PYTHON_DIR=C:\Python25
SET TRAC_ENV=C:\trac\%PROJECT%

SET PYTHON="%PYTHON_DIR%\python.exe"
SET SVNLOOK="%SVN_DIR%\bin\svnlook.exe"
SET LOG_FILE=%TEMP%\svnlog-%TXN%

%SVNLOOK% log -t %TXN% %REPOS% > %LOG_FILE%

%PYTHON% %TOOLS_DIR%\trac-pre-commit-hook %TRAC_ENV% "file:%LOG_FILE%"

IF ERRORLEVEL 1 SET TRAC_CANCEL=YES
DEL %LOG_FILE%
IF DEFINED TRAC_CANCEL GOTO :ERROR
::
::-----------------------------

:SUCCESS
EXIT 0

:ERROR
EXIT 1

이제 커밋을 할 때 티켓 번호와 명령어를 꼭 입력해야 하고, 티켓이 열려 있어야 커밋을 할 수 있습니다.

위 요건이 충족되지 않았을 때 커밋했다면 아래 화면과 같이 표시됩니다.


그림 7-63 티켓 번호를 지정하지 않을 때

티켓 변경 사항을 이메일로 통보받기

티켓에 답글이 달리고, 닫힘, 속성 변경 등이 있을 때 해당 사항을 메일로 받아 볼 수 있습니다. 앞서 커밋 로그 메일 설정을 할 때 IIS SMTP 서버와 Gmail 계정을 사용하였습니다. 마찬가지로 티켓 통지 메일도 IIS SMTP 서버와 Gmail을 모두 사용할 수 있습니다.

IIS SMTP 서버를 사용할 때

example 프로젝트의 Trac 사이트(http://localhost/trac/example)로 접속한 후 admin 계정으로 로그인합니다. 그리고 Admin 메뉴를 클릭합니다.

trac.ini의 notification 항목에서 다음과 같이 설정합니다(실제 notification 항목에서는 설정하는 곳이 매우 많습니다. 지면 관계상 설정에 꼭 필요한 부분만 그림에 표시했습니다).


그림 7-64 IIS SMTP 서버 설정

  • smtp_enabled : SMTP 메일 전송 기능의 사용 여부입니다. true로 설정합니다.
  • smtp_server : SMTP 서버의 주소를 설정하는 부분입니다. localhost로 설정합니다.
  • smtp_port : SMTP 서버의 포트를 설정하는 부분입니다. 25로 설정합니다.
  • smtp_always_cc : 메일을 받을 주소를 설정하는 부분입니다. 독자들은 티켓 변경 사항을 받을 메일 계정을 만든 후 그 메일 주소를 설정합니다(해당 프로젝트 티켓의 모든 변경 사항이 수신됩니다).

Gmail 계정을 사용할 때

example 프로젝트의 Trac 사이트(http://localhost/trac/example)로 접속한 후 admin 계정으로 로그인합니다. 그리고 Admin 메뉴를 클릭합니다.

trac.ini의 notification 항목에서 다음과 같이 설정합니다(실제 notification 항목에서는 설정하는 곳이 매우 많습니다. 지면 관계상 설정에 꼭 필요한 부분만 그림에 표시했습니다).


그림 7-65 Gmail 계정 설정

  • smtp_enabled : SMTP 메일 전송 기능의 사용 여부입니다. true로 설정합니다.
  • smtp_server : SMTP 서버의 주소를 설정하는 부분입니다. smtp.gmail.com로 설정합니다.
  • smtp_port : SMTP 서버의 포트를 설정하는 부분입니다. 25로 설정합니다(일반적으로 Gmail은 465번 포트를 사용하는데 여기서는 25번으로 합니다)
  • smtp_user : 메일 서버를 사용할 계정을 설정하는 부분입니다. 독자들의 Gmail 주소를 입력합니다(Gmail ID와 gmail.com 도메인을 함께 지정합니다. 즉 E-mail 주소 전체를 입력합니다).
  • smtp_password : 메일 계정의 비밀번호를 설정하는 부분입니다. 독자들의 Gmail 계정 비밀번호를 입력합니다.
  • smtp_always_cc : 메일을 받을 주소를 설정하는 부분입니다. 독자들은 티켓 변경 사항을 받을 메일 계정을 만든 후 그 메일 주소를 설정합니다(해당 프로젝트 티켓의 모든 변경 사항이 수신됩니다).
  • use_tls : SSL/TLS를 사용 여부를 설정하는 부분입니다. true로 설정합니다(Gmail은 tls 설정이 되어 있어야 메일이 전송됩니다).
TIP
smtp_enabled를 true로 해 놓으면 티켓을 올렸을 때 해당 티켓의 owner(담당자) ID의 메일 주소가 설정되어 있는 경우, 그 메일 주소로 티켓의 변경 사항을 보냅니다.

Trac 관리 스크립트

Trac에서 프로젝트 공간을 하나 만들 때 마다 지금까지 해왔던 설정을 똑같이 반복해야합니다. 상당히 귀찮은 작업이며 설정할 부분이 많기 때문에 설정 한두 개 정도 빠뜨릴 수도 있습니다. 이제 PowerShell을 활용할 때가 왔습니다. 지금까지 만들어 왔던 example 프로젝트의 Trac 설정과 저장소 Hook 스크립트를 그대로 사용하여 새로운 프로젝트를 만드는 스크립트를 소개하겠습니다. 다음 스크립트들은 부록 CD의 Scripts 디렉터리 아래에 있습니다.

일단 스크립트를 실행하려면 C:\Python25를 환경 변수에서 시스템 변수(S)의 Path 추가합니다. C:\Program Files\Subversion\bin도 환경 변수에서 시스템 변수(S)의 Path에 잘 설정되어 있는지 확인합니다.

아래 스크립트들을 C:\tools 디렉터리에 복사한 뒤 사용합니다.

  • 다운로드 주소 : https://github.com/pyrasis/windowsprojectbook/blob/master/Scripts/PowerShell/create-project.ps1
  • 부록 CD 경로 : Scripts/Subversion Hooks/

프로젝트 생성 스크립트

create-project.ps1

$tracenv_dir = "C:\trac"
$repos_dir = "C:\Repos"
$repos_svnpath = "file:///c:/repos"
$trac_admin = "C:\Python25\Scripts\trac-admin-script.py"

if ($args.count -eq 0)
{
    "Usage: create-project.ps1 <ProjectName>"
    exit
}

$project = $args[0]

# Subversion 저장소 생성
svnadmin create $repos_dir\$project

# trunk, branches, tags 디렉터리 생성
svn mkdir -m "Default Directories" $repos_svnpath/$project/trunk $repos_svnpath/$project/branches $repos_svnpath/$project/tags

# trac 프로젝트 생성
python $trac_admin $tracenv_dir\$project initenv $project sqlite:db/trac.db svn $repos_dir\$project

# example 프로젝트의 trac.ini 파일을 새로 만드는 프로젝트로 복사. trac.ini 내용을 새 프로젝트 이름으로 변경
$tracini = get-content $tracenv_dir\example\conf\trac.ini
$tracini = $tracini -replace "example", $project
$tracini = $tracini -replace "My example project", ""
$tracini | out-file -encoding oem $tracenv_dir\$project\conf\trac.ini

# Hook 스크립트를 새로 만드는 프로젝트로 복사. 스크립트의 내용을 새 프로젝트 이름으로 변경
$pre_commit = get-content $repos_dir\example\hooks\pre-commit.cmd
$pre_commit = $pre_commit -replace "example", $project
$pre_commit | out-file -encoding oem $repos_dir\$project\hooks\pre-commit.cmd
$post_commit = get-content $repos_dir\example\hooks\post-commit.cmd
$post_commit = $post_commit -replace "example", $project
$post_commit | out-file -encoding oem $repos_dir\$project\hooks\post-commit.cmd
$post_revprop_change = get-content $repos_dir\example\hooks\post-revprop-change.cmd
$post_revprop_change = $post_revprop_change -replace "example", $project
$post_revprop_change | out-file -encoding oem $repos_dir\$project\hooks\post-revprop-change.cmd
copy $repos_dir\example\hooks\pre-revprop-change.cmd $repos_dir\$project\hooks\

# trac 프로젝트를 최신 상태로 갱신, admin 계정에 TRAC_ADMIN 권한 부여
python $trac_admin $tracenv_dir\$project upgrade
python $trac_admin $tracenv_dir\$project resync
python $trac_admin $tracenv_dir\$project permission add admin TRAC_ADMIN

“create-project.ps1 프로젝트명” 형식으로 실행을 하면 됩니다. 이 스크립트는 Subversion 저장소를 만들고 trunk, branches, tags 기본 디렉터리를 추가합니다. 그리고 Trac 프로젝트 공간을 만들고 example 프로젝트에서 trac.ini 파일을 복사해옵니다. trac.ini 안에 example이라고 되어 있는 것은 우리가 지정한 프로젝트명으로 바꿉니다. 마찬가지로 example 저장소에서 pre-commit.cmd, post-commit.cmd, pre-revprop-change.cmd , post-revprop-change.cmd 파일을 복사해오고, 파일 내용에서 project 부분을 우리가 지정한 프로젝트 명으로 바꿉니다. 마지막으로 trac-admin으로 upgrade, resync 명령을 실행하고, admin 계정을 관리자(TRAC_ADIMN)로 지정합니다.

TIP
프로젝트를 만들고 나면 꼭 C:\Repos\authz 파일을 열어 새로 만든 프로젝트의 권한을 지정해줍니다.
[newproject:/]
* = rw

권한 설정 스크립트

permission.ps1

$tracenv_dir = "C:\trac"
$trac_admin = "C:\Python25\Scripts\trac-admin-script.py"
$item = $args[0]

python $trac_admin $tracenv_dir\$item permission add hellouser developer
python $trac_admin $tracenv_dir\$item permission add worlduser developer

python $trac_admin $tracenv_dir\$item permission add developer TICKET_CREATE
python $trac_admin $tracenv_dir\$item permission add developer TICKET_MODIFY
python $trac_admin $tracenv_dir\$item permission add developer WIKI_CREATE
python $trac_admin $tracenv_dir\$item permission add developer WIKI_MODIFY
python $trac_admin $tracenv_dir\$item permission add developer BROWSER_VIEW
python $trac_admin $tracenv_dir\$item permission add developer FILE_VIEW

python $trac_admin $tracenv_dir\$item permission remove anonymous BROWSER_VIEW
python $trac_admin $tracenv_dir\$item permission remove anonymous FILE_VIEW
python $trac_admin $tracenv_dir\$item permission remove anonymous TICKET_CREATE
python $trac_admin $tracenv_dir\$item permission remove anonymous TICKET_MODIFY
python $trac_admin $tracenv_dir\$item permission remove anonymous WIKI_CREATE
python $trac_admin $tracenv_dir\$item permission remove anonymous WIKI_MODIFY

“permission.ps1 프로젝트명” 형식으로 실행합니다. 미리 정해진 정책을 프로젝트 하나에 적용하고자 할 때 사용합니다. 위의 정책은 필자가 임의로 정한 것이고, 여러분들의 환경에 맞게 고쳐서 사용하면 됩니다. 내용은 간단합니다. hellouser, worlduser를 developer 그룹에 추가하고 developer 그룹에 각 권한을 지정합니다. 그리고 익명 사용자는 BROWSER_VIEW, FILE_VIEW, TICKET_CREATE 등의 권한을 제거합니다.

전체 프로젝트 권한 설정 스크립트

permission-all.ps1

$tracenv_dir = "C:\trac"
$trac_admin = "C:\Python25\Scripts\trac-admin-script.py"

foreach ($item in get-childitem $tracenv_dir)
{
    if (test-path "$tracenv_dir\$item" -pathtype container)
    {
        python $trac_admin $tracenv_dir\$item permission add exampleuser developer
        python $trac_admin $tracenv_dir\$item permission remove anonymous WIKI_MODIFY
    }
}

이 스크립트는 매개변수 없이 permission-all.ps1 그대로 실행합니다. 프로젝트가 한두 개라면 permission.ps1 스크립트로 권한을 설정하면 되지만, 10개가 넘어가면 상당히 귀찮아집니다. 그래서 만든 것이 permission-all.ps1 스크립트입니다. C:\trac 아래에 위치한 모든 Trac 프로젝트에 지정한 명령을 실행합니다. permission-all.ps1 스크립트에서는 모든 Trac 프로젝트에 대해 exampleuser를 developer 그룹에 추가하고, 익명 사용자의 위키 페이지 편집 권한을 제거합니다. 이 스크립트도 여러분들의 환경에 맞게 고쳐서 사용하면 됩니다.

Subversion 저장소 - Trac 동기화 스크립트

trac-resync.ps1

$tracenv_dir = "C:\trac"
$trac_admin = "C:\Python25\Scripts\trac-admin-script.py"

foreach ($item in get-childitem $tracenv_dir)
{
    if (test-path "$tracenv_dir\$item" -pathtype container)
    {
        python $trac_admin $tracenv_dir\$item resync   
    }
}

이 스크립트는 사용자가 직접 실행하는 것이 아닌 윈도우의 예약된 작업을 통해서 실행합니다. 모든 Trac 프로젝트에 대해 resync 명령을 실행합니다. resync 명령을 실행하는 이유는, 사용자가 Subversion 로그 메시지를 수정하였을 때 수정된 로그가 Trac에 표시될 수 있도록 하기 위해서 입니다. 로그 메시지를 수정하고 resync 명령을 실행해주지 않으면 Trac에는 수정하기 전의 로그가 계속 표시됩니다.

trac-resync.ps1 스크립트를 예약된 작업으로 자동화 하려면 아래와 같이 설정합니다.

  1. 예약된 작업으로 1시간에 한번씩 실행되도록 설정하겠습니다. 제어판 → 예약된 작업 → 예약 작업 추가를 선택한 다음 작업 예약 마법사가 나타나면 다음을 눌러 넘어갑니다.


    그림 7-66 작업 예약 마법사

  2. Windows PowerShell을 선택합니다.


    그림 7-67 실행할 프로그램 선택

  3. 작업 이름은 trac resync로 지정하고 작업 실행은 매일(D)를 선택합니다.


    그림 7-68 작업 이름 설정, 작업 실행 시기 설정

  4. 시작시간, 작업 실행, 시작날짜는 기본 설정 그대로 사용합니다.


    그림 7-69 작업을 시작할 시간과 날짜 선택

  5. 작업을 실행할 사용자의 암호를 입력합니다.


    그림 7-70 작업을 실행할 사용자 및 암호 입력

  6. [마침]을 클릭하면 이 작업의 고급 속성 열기(A)를 체크하고 마침을 누릅니다.


    그림 7-71 작업 예약 완료

  7. 실행(R) 부분의 맨 마지막에 c:\tools\trac-resync.ps1을 추가합니다.


    그림 7-72 trac-resync.ps1 설정

  8. 일정 탭을 선택한 후 고급(V)… 버튼을 누릅니다.


    그림 7-73 일정 탭

  9. 작업 반복(R)에 체크하고 매 1시간으로 설정합니다. 기간(D)은 24시간으로 설정합니다.


    그림 7-74 일정 고급 옵션

RSS Reader 활용

메일이라는 것이 편리하긴 하지만, 스팸 메일이라는 존재 때문에 많은 사람들이 메일을 기피하는 경향이 있습니다. 이럴 때는 Trac의 RSS 기능을 이용해 보면 편리합니다. 티켓, 저장소의 변경 사항을 RSS로 출력해주기 때문에 RSS 리더로 편리하게 받아 볼 수 있습니다.

RSS 리더는 무료로 사용할 수 있는 SharpReader를 사용하겠습니다. SharpReader0970_Setup.exe 파일을 기본 설정대로 설치합니다. 이 파일은 아래 URL에서 받을 수 있으며 부록 CD에도 포함되어 있습니다.

Trac에서는 RSS를 받아 볼 수 있는 곳이 크게 2군데가 있습니다. Timeline 메뉴와 Browse Source 메뉴의 Revision Log 부분입니다. Timeline에서는 티켓 변동 사항, 커밋 로그(저장소 변경 사항) 등을 모두 볼 수 있으며, Browse Source 메뉴의 Revision Log 부분은 커밋 로그(저장소 변경 사항)을 볼 수 있습니다.


그림 7-75 Trac의 Timeline

Timeline 메뉴는 티켓 변동 사항, 커밋 로그, 마일스톤, 위키 변동 사항등을 선택적으로 확인할 수 있습니다. RSS 리더에 등록 할 때 이 부분을 먼저 설정한 다음 RSS 주소를 RSS 리더에 등록합니다. 이 부분을 설정하는 것에 따라 RSS의 세부 주소가 달라지게 됩니다.

모든 체크박스에 체크 : http://localhost/trac/example/timeline?ticket=on&changeset=on&milestone=on&wiki=on&max=50&daysback=90&format=rss

커밋 로그(Repository checkins)만 체크 해제 : http://localhost/trac/example/timeline?ticket=on&milestone=on&wiki=on&max=50&daysback=90&format=rss


그림 7-76 Trac의 Browse Source

RSS 주소는 Timeline의 맨 아래 RSS Feed 링크의 주소를 사용하면 됩니다. Revision Log도 마찬가지로 맨 아래 RSS Reed 링크의 주소를 사용합니다.


그림 7-77 Timeline과 Revision Log의 RSS Feed 링크

  1. Address: 부분에 RSS 주소를 붙여넣기 하고 엔터를 누르면 내용이 표시됩니다. 그리고 Subscribe 버튼을 누릅니다.


    그림 7-78 SharpReader에 주소 추가

  2. Subscribe 버튼을 누르면 아래와 같이 왼쪽 구독 목록에 해당 RSS 주소가 등록됩니다.


    그림 7-79 Subscribe 버튼으로 해당 주소를 구독

  3. 새로운 변경 사항이 있다면 메신저와 같이 작업 표시줄 위로 팝업창을 보여줍니다.


    그림 7-80 SharpReader가 표시해주는 작업 표시줄 위의 팝업창

https 프로토콜을 사용한다면 hosts 파일을 수정해주고 인증서를 설치해야 합니다. 현재 사설 인증서를 사용하고 있기 때문에 보안 경고가 계속 뜰 것입니다. https 서버를 만들 때 도메인을 example.com으로 하였습니다. C:\WINDOWS\system32\drivers\etc\hosts 파일을 열고 아래와 같이 추가합니다. DNS 서버를 구축하고 도메인을 연결하였다면 hosts 파일을 수정할 필요는 없습니다. 인증서를 만들 때 도메인만 똑같이 맞춰주면 됩니다.

C:\WINDOWS\system32\drivers\etc\hosts

# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

127.0.0.1       localhost
192.168.1.100   example.com

인터넷 익스플로러에서 https://example.com/trac/example로 접속합니다. DNS 서버를 구축하고 도메인을 연결하였다 하더라도 공인인증기관에서 발급받은 공인인증서가 아닌, 이 책의 예제를 통하여 만들었다면 인증서 설치를 해주어야 합니다.

  1. hosts 파일을 설정하거나 DNS 서버를 구축하고 도메인을 연결하였다면 다음과 같이 나올 것입니다. 두 번째와 세 번째 항목이 초록색 체크 표시가 되어 있어야 합니다. 이 두 항목이 체크되어 있지 않다면 인증서를 설치하더라도 계속 보안경고가 나타날 것입니다. 인증서 보기를 누릅니다.


    그림 7-81 Internet Explorer 6에서 인증서 보안 경고

  2. 인터넷 익스플로러 7의 경우 인증서 오류를 클릭하면 인증서 보기 메뉴가 나옵니다.


    그림 7-82 Internet Explorer 7에서 인증서 보안 경고

  3. 인증서 설치를 누릅니다.


    그림 7-83 인증서 등록 정보

  4. 다음을 눌러 넘어갑니다.


    그림 7-84 인증서 가져오기 마법사

  5. 모든 인증서를 다음 저장소에 저장(P)를 선택하고 찾아보기를 누릅니다.


    그림 7-85 인증서 저장소

  6. 신뢰된 루트 인증 기관을 선택합니다.


    그림 7-86 인증서 저장소 선택

  7. 다음을 눌러 넘어갑니다.


    그림 7-87 인증서 저장소

  8. 마침을 눌러 인증서 가져오기를 완료합니다.


    그림 7-88 인증서 가져오기 마법사 완료

  9. 보안경고가 나오면 예(Y)를 눌러 인증서를 설치합니다. 이제부터 https://example.com/trac/에 접속할 때 보안 경고 창이 나타나지 않을 것입니다.


    그림 7-89 보안 경고


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.