아래와 같이 소스 commit 정보를 web hook으로 전송한다.
============================================
= svn_test (rev.53) <==repsitory name과 rev. #의 조합으로 만든 문자열
============================================
= Author : tester
= Date : 2016-05-18 10:38:27 +0900 (2016-05-18, 수)
= Comment :
test
============================================
= Changed Files : <== changed 정보에 의해 제공되는 변경 파일들
U aa
============================================
- 아래 python 프로그램을 카피해서 post-commit.py 라는 파일로 저장한다.
- chmod로 post-commit.py파일에 실행권한을 준다 chmod +x post-commit.py
- root 권한으로 /usr/bin에 카피한다. cp post-commit.py /usr/bin
- svn 계정으로 해당 repository/hooks 에 있는 post-commit파일을 열어서 아래 내용을 추가한다.
post-commit.py
#!/usr/bin/python
#-*- coding: utf-8 -*-
import sys
import os
import httplib, urllib, urllib2
from urllib import quote
# constant
LINE = "============================================"
LINE_LF = "============================================\n"
LF = "\n"
def format_mesg(repo, rev, info, changed) :
token = info.split("\n", 3)
modifier = token[0]
change_date = token[1]
# to prevent too long mesg, i will cut 10 files first and add file count
changed_cnt= changed.count("\n")
change_str=""
if ( changed_cnt > 10 ) :
change_files = changed.splitlines(1)
for index in range(10) :
change_str = change_str + change_files[index]
change_str = change_str + "... \n"
else :
change_str = changed
len = int(token[2])
if ( len > 0 ) :
desc = token[3]
ret_str = "%s\n= %s (rev.%s) \n%s\n= Author : %s\n= Date : %s\n= Comment :\n%s%s\n= Changed Files (total : %d):\n%s%s" % (LINE, repo, rev, LINE, modifier, change_date, desc, LINE, changed_cnt, change_str,LINE)
else :
ret_str = "%s\n= %s (rev.%s) \n%s\n= Author : %s\n= Date : %s\n%s\n= Changed Files (total : %d):\n%s%s" % (LINE, repo, rev, LINE, modifier, change_date, LINE, changed_cnt, change_str,LINE)
# print modifier, change_date, len
return ret_str
if (len(sys.argv) < 4) :
print "Usage : %s REPOSITORY_PATH REV URL(to send)" % sys.argv[0];
exit(0);
repos = sys.argv[1]; # repository
rev = sys.argv[2]; # revistion num
url = sys.argv[3]; # url to send
# repository ID extract
ri = repos.rfind("/")
length = len(repos)
repo = repos[ri+1:length]
# commit info at rev.
result = os.popen("svnlook -r " + rev + " info " + repos)
info = result.read()
# changed files at rev.
result = os.popen("svnlook -r " + rev + " changed " + repos)
changed = result.read()
mesg = format_mesg(repo, rev, info, changed)
# default is utf-8
# 만약 잘 동작하지 않는다면 실행환경의 LANG 변수를 잡아서 decode후 encode하도록 수정 필요
#mesg_enc = mesg.encode("UTF-8", "ignore")
params = urllib.urlencode({'content':mesg})
headers = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Host": "tree.nateon.nate.com"}
try :
req = urllib2.Request(url, params, headers)
result = urllib2.urlopen(req)
print result.read()
except urllib2.URLError as e :
print "url format error : ", e.args
except urllib2.HTTPError as ex:
print "http request error : ", ex.args
post-commit 에 추가할 내용
# env set - path는 시스템에서 확인하고 수정한다.
export PATH=/usr/lib64/qt-3.3/bin:/jdk/bin:/apache-ant/bin:/apache-maven/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
export LANG=ko_KR.UTF-8
REPOS="$1" # 이미 있다면 있는걸 사용한다.
REV="$2" # 이미 있다면 있는걸 사용한다.
EXE="post-commit.py"
$EXE $REPOS $REV [각 개발담당자가 요청한 url정보 추가, ex) https://tree.nateon.nate.com/api/webhook/123/123 ]