说明:为了集成bugfree和svn,在bugfree官网找到部署的方法,过程虽然简单,但有一些细节还是必须要注意的。测试了一个星期,期间把钩子脚本测试了几遍,PHP脚本测试了N遍,debug工具都装上了,终于搞清楚了这几个脚本到底是怎么回事,并分析清楚了它的工作原理。拿出来和大家分享一下。


一 安装准备:


二 安装php5

说明:在svn的钩子脚本中用到了php的-r选项,该选项只有5以上的版本支持,如果你的PHP的版本是4,那么将无法运行该脚本。

tar xvjf php-5.5.6.tar.bz2
cd php-5.5.6
./configure --prefix=/usr/local/php5 --with-mysql \
--with-apxs2=/usr/local/apache2/bin/apxs
make && make install



三 将svn_ci.php和class.http.php放在同一个目录下

linux:/tmp/BugFreeforSVN% tar xvzf BugFreeforSVN.tar.gz

解压后有4个文件:class.http.php svn_ci.php post-commit post-commit.bat(这个是windows下的钩子脚本,我这里不需要,可以删除)

将下面2个文件放在同一目录下,否则无法调用

linux:/tmp/BugFreeforSVN% ls
class.http.php svn_ci.php


四 修改post-commit钩子脚本

linux:/home1/subversion/project/data/hooks%more post-commit
#!/bin/bash
REPOS="$1"
REV="$2"
PHP_EXE='/usr/local/php5/bin/php'
CHECK_IN_PHP='/tmp/BugFreeforSVN/svn_ci.php'
SVN_LOOK_EXE='/usr/local/subversion/bin/svnlook'
AUTHOR=$($SVN_LOOK_EXE author -r $REV$REPOS)
DATE=$($SVN_LOOK_EXE date -r $REV $REPOS)
CHANGED=$($SVN_LOOK_EXE changed -r $REV$REPOS)
LOG=$($SVN_LOOK_EXE log -r $REV $REPOS)
N=$($PHP_EXE -r 'echo chr(0x04);')          #这里的-r选项只有PHP5才支持,所以要装5
$PHP_EXE $CHECK_IN_PHP  "Changeset [${REV}] by $AUTHOR,$DATE$N$LOG$N$REV$N$CHANGED"


五 修改svn_ci.php

define('API_NEWLINE', chr(0x03));
define('API_DEVIDER', chr(0x04));
define('API_KEY', 'YOUR_KEY');
define('API',"http://10.10.10.1/bugfree/api.php");
define('USER_NAME', 'admin');
define('USER_PASSWORD','1c8fd251fcb0c3ad91178fd9782c7cc7');        #整了3天,其实问题就在这儿。从debug信息中拿到的md5密码。用linux的md5sum加密出来的不同,是:“88a0aa9615ea4f01e584dea259a5161d”。这个密码是在bugfree中设置账号和密码后,自动用md5加密后的密码。
define('VIEWVC', 'http://10.10.10.2/viewvc/');
修改第61行如下:(你也可以不修改)
$note .= ' [url=' . VIEWVC . '][/url]';


六 修改class.http.php

默认是不用修改的,但我们装的是PHP5,当执行:

linux:/home1/subversion/project/data/hooks%./post-commit /home1/subversion/project/data 18 > /home/a.txt

会报错:

linux:/home1/subversion/project/data/hooks%more /home/a.txt
Deprecated: Function eregi() is deprecatedin /tmp/BugFreeforSVN/class.http.php on line 900

修改如下:

linux:/home1/subversion/project/data/hooks%vim +900 /tmp/BugFreeforSVN/class.http.php
旧内容:
if(!eregi($match ="^http/[0-9]+\\.[0-9]+[ \t]+([0-9]+)[ \t]*(.*)\$", $headers[0],$matches))
修改为:
if(!preg_match($match ="/^http\/[0-9]+\\.[0-9]+[ \t]+([0-9]+)[ \t]*(.*)\$/i", $headers[0],$matches))

原因:

我安装的PHP是5.5.6,由于PHP在5.3及以上的版本已经废弃了eregi()函数,改用preg_match()+//i参数替代;

另外,在http后面有一个/,需要转义,所以加了一个\,否则,报错Warning: preg_match(): Unknownmodifier '[' in /tmp/BugFreeforSVN/class.http.php on line 900


七 提交的方式

% svn ci -m "fix bug #346"

注意log中的空格。这些步骤bugfree官网有说明。这里就不累述了。

提交后会在bugfree的网页中看到提交信息。