SVN 클라이언트에서 남긴 커밋 로그를 Mantis의 이슈 노트로 자동 등록하는 방법에 관하여 설명합니다.
대상 장비: DS-209+II (일반 윈도우, 리눅스 머신에도 적용 가능함)
결과부터 보도록 하죠..
아래와 같이 SVN 클라이언트에서 커밋 로그를 입력하여 커밋하면
Mantis의 이슈 노트와 히스토리에 그 내용이 자동으로 기록됩니다.
보통 mantis와 svn 클라이언트와의 연동을 위해서 mantis 설치 디렉토리의 하위 디렉토리인 core에 있는 checkin.php를 사용합니다.
그러나 DS-209+II에서는 checkin.php를 이용하기가 쉽지 않습니다.
checkin.php 소스 코드의 첫 줄이 다음과 같이 시작됩니다.
#!/usr/local/bin/php -q
즉, CLI(Command Line Interface) 모드에서 동작되도록 되어 있는 것이죠..
DS-209+II에는 php 실행 파일이 존재하지 않고, mysql 관련 라이브러리가 없기 때문에 checkin.php를 이용하려면 직접 컴파일 해서 해당 파일들을 구해야 됩니다. 일반 리눅스 서버가 아니라서 쉽지 않은 일이죠..
그래서 다른 방법을 찾아보았습니다.
checkincurl.php이라는 걸 이용하는 것입니다.
이것을 이용하기 위해서는 curl이 필요합니다.
curl을 이용한 방법의 장점으로는 svn서버와 웹서버가 물리적으로 같은 서버에 있지 않을 경우에도 커밋 로그를 mantis로 전송할 수 있다는 것입니다.
아래 명령을 이용하여 curl을 먼저 설치합니다.(NAS 사용자의 경우 당연히 아래 명령을 이용하기 위해서는 bootstrap이 설치 되어 있어야 겠죠. https://isulnara.com/wp/archives/237 참조)
[root@fs:~]# ipkg install libcurl
이제 svn 클라이언트에서 커밋할 경우 svn 서버에서 mantis로 checkincurl.php로 커밋 로그를 넘겨주도록 설정해야 됩니다.
svn 서버의 저장소에 hooks라는 디렉토리가 존재합니다.
이 디렉토리 내의 post-commit.tmpl를 post-commit으로 복사하고, 실행 권한을 줍니다.
[root@fs:~]# chmod 705 post-commit
그리고, 그 내용은 다음과 같이 설정합니다.
REPOS=”$1″
REV=”$2″
auth=$(/opt/bin/svnlook author -r $REV $REPOS)
dt=$(/opt/bin/svnlook date -r $REV $REPOS)
changed=$(/opt/bin/svnlook changed -r $REV $REPOS)
log=$(/opt/bin/svnlook log -r $REV $REPOS)
n='<br>’
/opt/bin/curl -d “user=$auth&log=Changeset [${REV}] $n$log$n$changed” http://서버주소/mantis경로/core/checkincurl.php
– 위 내용에서 서버주소와 mantis가 설치된 경로를 설정합니다.
이제 mantis 설정이 남았습니다.
mantis 설정은 기본 설정 파일 수정과 한글 지원을 위한 처리, core 디렉토리에 접근을 위한 설정 이렇게 세 가지가 필요합니다.
먼저 mantis 설치 디렉토리의 config_inc.php를 아래와 수정합니다.
# svn
$g_source_control_server = array(‘192.168.0.4′);
$g_source_control_account = ‘isul‘;
$g_source_control_regexp = ‘/\b(?:bug|issue)\s*[#]{0,1}(\d+)\b/i’;
$g_source_control_notes_view_status = VS_PRIVATE;
$g_source_control_set_status_to = RESOLVED;
$g_source_control_set_resolution_to = FIXED;
$g_source_control_fixed_regexp = ‘/\bfix(?:ed|es)\s+(?:bug|issue)?\s*[#]{0,1}(\d+)\b/i’;
– 위 내용에서 $g_source_control_server는 접속을 허용할 svn 서버의 ip 주소를 설정합니다.
– $g_source_control_account는 mantis에 있는 사용자 계정을 입력합니다.
– $g_source_control_regexp로 설정된 bug, issue는 커밋 로그 입력 시 “bug #이슈번호” 또는 “issue #이슈번호“라는 단어가 있을 경우에만 mantis의 이슈 노트로 등록되게 한다는 의미입니다.
– $g_source_control_set_status_to는 이슈 노트의 공개/비공개 설정으로 VS_PRIVATE는 비공개, VS_PUBLIC는 공개를 의미함
– $g_source_control_set_status_to는 이슈 상태를 의미(RESOLVED, CLOSED 등)
– $g_source_control_set_resolution_to는 이슈 노트의 해결 상태를 의미
다음은 한글 처리를 위한 부분으로 DS-209+II와 같이 LANG 환경변수를 사용할 수 없는 시스템에서만 필요합니다.
DS-209+II의 경우 post-commit에 “export LANG=ko_KR.UTF-8“을 설정해봐야 인식되지 않습니다.
이 문제를 해결하기 위해 mantis 설치 경로의 core 디렉토리에 checkincurl.php를 아래와 같이 수정합니다.
이 부분 설정하지 않으면 한글이 아래와 같이 표시됩니다.
?\\236?\\158?\\152
붉은 색으로 된 부분을 추가하면 됩니다.( 붉은 색 이전의 문자를 검색하여 해당 위치를 찾으면 됩니다.)
# ——————————————————–
# $Id: checkin.php,v 1.5.2.1 2007-10-13 22:35:16 giallu Exp $
# ——————————————————–
global $g_bypass_headers;
$g_bypass_headers = 1;
require_once( dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR . ‘core.php’ );
//————————————————————————————–
// 한국어 변환
// by isul ( https://isulnara.com )
//————————————————————————————–
function convertToKorean($str)
{
$DELIMITER = “?\\\\”;
$pos = strpos($str, $DELIMITER);
while ($pos !== false)
{
$pos = strpos($str, $DELIMITER);
$dec = substr($str, $pos + 3, 3);
if ($pos !== false)
$str = str_replace($DELIMITER . $dec, ‘%’ . dechex($dec), $str);
}
return urldecode($str);
}
//————————————————————————————–
… 중략 ….
$t_line = isset($_POST[‘log’]) ? $_POST[‘log’] : ”;
$t_line = convertToKorean($t_line);
#var_dump(“$t_line”);
마지막으로 curl이 core 디렉토리의 checkincurl.php에 접근할 수 있도록 core 디렉토리에 있는 .htaccess의 파일명을 변경하거나 삭제합니다.
이제 모든 설정이 완료되었습니다.
TortoiseSVN, 이클립스 등의 SVN 클라이언트에서 커밋 로그를 입력할 때
issue #10 또는 bug #10과 같은 내용만 포함되면 svn 서버에서 자동으로 mantis로 그 내용을 전송하여 이슈 노트로 등록합니다.
커밋 로그 입력 시 매번 issue #10와 같은 것을 입력하기 싫다면 속성 설정으로 자동 입력되게 할 수도 있습니다.
TortoiseSVN의 경우는 http://newbie.kr/52를 참고하시면 자동 입력되게 할 수 있습니다.
몇 시간에 걸쳐 고생해서 연동을 하긴 했는데 얼마나 사용할지는 모르겠습니다.
svn 클라이언트에서 커밋 시 mantis에 기록된 이슈 번호를 알아야 하기 때문이죠.. 그냥 커밋 후 mantis에 다시 한 번 기록하는 것는 더 편할 수도…
참고
http://www.mantisbt.org/bugs/view.php?id=8847
http://newbie.kr/52
안녕하세요? 이 글을 통해 상당히 공부하게 되었고 도움을 받은 mk라 합니다.
잘 썼지만 한 가지 문제가 발생해서 확인 좀 부탁드릴까.. 해서 덧글을 남깁니다!
한국어 변환하는 함수 중에서
$pos = strpos( $str, $DELIMITER ); 가 있고
while ( $pos ), if ( $pos ) 에서 사용을 하는 데
$pos = 0 이 되는 경우엔 값을 찾았음에도 불구하고 루프를 돌지 않는 경우가 생기더라구요.
그래서 while ( !($pos === false) ), if ( !($pos === false ) )
로 고치는 게 맞지 않을까.. 하여 덧글을 올립니다.
(나머지는 잘 됩니다. ㅠㅠ )
안녕하세요..
지적해주신 내용이 맞습니다.
처음부터 한글로 시작되면 제가 올렸던 코드는 문제가 있습니다.
알려주신 코드를 조금 수정하여 본문을 수정하였습니다.
while ( !($pos === false) ), if ( !($pos === false ) )
—->
while ($pos !== false), if ($pos !== false)
고맙습니다^^