Review Board安装和配置札记
目前部门还没有采用Pair Programming那种时时刻刻都在review代码的工作方式,代码Review多采用走查方式,即代码写完后召开一个Code Review的Meeting,集中时间和经验丰富的人力对重点代码进行筛查,这种方式的代码Review有利,但也有弊。其弊端在于低效和覆盖面小。做一次走查需要N多人参与若干个小时,而在这段时间里不是每个参与者都能极其高效的参与到走查中的,实践证明只有少数几个人能真正在一次代码走查会议上起到关键的作用。另外走查一次能覆盖的代码范围又较小,一些看似不重要却很可能带来BUG的代码在走查会上很容易被遗漏。
Code Review工具对代码走查是一种很好的补充。目前比较流行的开源Code Review工具有Review Board、CodeStriker等。对于ReviewBoard,我关注已久。在其还在rc阶段我就曾经尝试安装过,不过无论是在Windows和Unix下都以失败告终。开源工具的安装的确有些让人头痛,一堆互相依赖的软件包,版本稍有差异就很可能导致安装运行失败。而且失败的原因还很难得知。
Review Board今年终于Release了,目前最新版是1.0.3,其官方推荐在Linux和Windows上安装。我选择了Ubuntu 9.04。Ubuntu的包管理工具apt最大的好处就是能自动帮你分析开源包的依赖关系并自动下载安装依赖包。恰巧在CSDN的一个博客上发现一篇'ReviewBoard on Ubuntu 9.04 Server'的安装步骤,我就按照文章中的步骤超级顺利的完成了Review Board的安装,这里我也将其步骤贴出来,并做一些简单注释(有些地方略有不同):
我是在Ubuntu 9.04 Desktop上安装的,这个版本默认自带Gcc、Python等软件包。我们只需安装其他工具:(如果你是通过公司代理上外网,别忘了在你的Shell配置文件中设置http_proxy环境变量,格式是:export http_proxy=http://user:passwd@url:port)
1、安装easy_install
sudo apt-get install python-setuptools python-dev;
2、安装apache2和mod_python
sudo apt-get install apache2 libapache2-mod-python
sudo a2enmod python /* 修改apache2的配置,让python mod处于enable状态 */
3、安装mysql
sudo apt-get install mysql-server python-mysqldb libmemcache-dev
sudo easy_install http://gijsbert.org/downloads/cmemcache/cmemcache-0.95.tar.bz2
创建数据库、数据库用户for ReviewBoard(这块要注意数据库的字符集设置,默认是UTF-8,如果你要用其他中文字符编码标准,这里就需要显式指定,查查mysql的Manual吧)
mysql -u root -p /* 用root用户登录 */
mysql> create database reviewboard;
Query OK, 1 row affected (0.00 sec)
mysql> create user 'reviewboard'@'localhost' identified by 'reviewboard'; /* 前一个reviewboard是访问数据库的用户名,后一个reviewboard是密码 */
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on reviewboard.* to 'reviewboard'@'localhost'; /* 前一个reviewboard是数据库的名字,而后一个reviewboard则是访问数据库的用户名 */
Query OK, 0 rows affected (0.00 sec)
mysql> exit
4、安装subversion (目前大多数公司都用subversion)
sudo apt-get install patch subversion python-svn
5、安装reviewboard
sudo easy_install reviewboard
6、创建你的reviewboard站点
sudo rb-site install /var/www/reviewboard /* 之后会有一系列类似安装向导的步骤,需要你做出选择,尽量选择默认值吧 */
· Domain = localhost
· Root Path = /
· Media URL = media/
· Database Type = mysql
· Database Name = reviewboard
· Database server = localhost
· Database username = 'reviewboard'
· Database password = 'reviewboard'
· Cache Type = memcache
· Memcache Server = memcached://localhost:11211/
· Webserver = apache
· Python loader = modpython
7、配置站点,启动Apache2
sudo chown -R www-data /var/www/reviewboard/htdocs/media/uploaded /* 让webserver拥有对uploaded目录的修改权限 */
sudo cp /var/www/reviewboard/conf/apache-modpython.conf /etc/apache2/sites-available/reviewboard
sudo a2dissite default
sudo a2ensite reviewboard
sudo /etc/init.d/apache2 restart
在你的浏览器里敲入:http://localhost:80,ReviewBoard的登录界面就会出现在你的面前。
顺利安装完ReviewBoard后,你可以到官网去看Manual,学习如何使用ReviewBoard。简单说ReviewBoard支持两种Review Code的模式,一种是在code没有commit之前提交diff/patch文件进行review,叫做pre-commit review,另外一种则是在code commit之后,由工具自动根据提交的版本号生成diff/patch文件,并形成一条新的Review Request,这种模式也叫post-commit review。
先说pre-commit review模式。生成pre-commit review request有两种方法,第一种就是通过页面手工提交patch/diff文件的方法:首先通过界面设置好你的svn repository,比如:svn://10.1.1.23:3344;然后在你的DashBoard中“New Review Request",有三个字段需要你填写:
Repository: /* 选择你刚才配置的repository的id */
Base Diff Path: /* 如果你checkout出来的proj的svn url是svn://10.1.1.23:3344/trunk/testproj,那么这个字段填的就是/trunk/testproj */
Diff: /* 你生成的diff文件的路径,在Windows上我用TortoiseSVN的creatpatch工具直接生成某个源文件的diff格式文件 */
填好后,提交,这时你就会看到一个处于draft状态的Request,继续编辑它,指定Reviewer,然后Publish这个Request,这样你指定的Reviewer就能看到这个Request了。这块如果你设置了Email通知,Publish过程会有一定延迟,特别是如果你的Email设置出错了,那Publish将一直处于ing状态,你刷新一下页面后,实际上你的Request已经publish结束了。
另外一种提交pre-commit review request的方法是通过一个名为'Post-Review'的python脚本实现的。这个脚本在RBTools工具包中,在使用之前先执行:'sudo easy_install -U RBTools'安装这一脚本。
Post-Review需要知道两类信息,一个是ReviewBoard Server的信息, 一个是你的svn repository的信息,第一种信息我们可以通过编辑~/.reviewboardrc,添加一行REVIEWBOARD_URL="http://localhost:80"。至于svn repository的信息,post-review脚本可自动从你本地checkout出的代码working copy中携带的repository信息中获得,前提你要进入到该working copy所在的目录下去执行post-review。比如:你将svn://10.1.1.23:3344/trunk/testproj checkout到~/proj/testproj下面,那么你就应该先cd ~/proj/testproj后再执行post-review,post-review工具在默认情况下会将当前本地代码uncommitted的changes形成一个review request并提交到reviewboard server。你也可以在post-review后面加上文件名字来指定将特定的文件的changes而不是当前项目目录下所有的uncommitted changes。
下面是我配置和执行Post-review出现的一些问题和解决方法:
首次在testproj下执行'sudo post-review',出现如下打印日志:
Traceback (most recent call last):
File "/usr/local/bin/post-review", line 5, in
pkg_resources.run_script('RBTools==0.2beta1', 'post-review')
File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 448, in run_script
self.require(requires)[0].run_script(script_name, ns)
File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 1166, in run_script
execfile(script_filename, namespace, namespace)
File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 2314, in
main(sys.argv[1:])
File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 2292, in main
server.login()
File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 308, in login
'password': password,
File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 570, in api_post
return self.process_json(self.http_post(path, fields, files))
File "/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review", line 481, in process_json
rsp = simplejson.loads(data)
File "/usr/local/lib/python2.6/dist-packages/simplejson-2.0.9-py2.6-linux-i686.egg/simplejson/__init__.py", line 307, in loads
return _default_decoder.decode(s)
File "/usr/local/lib/python2.6/dist-packages/simplejson-2.0.9-py2.6-linux-i686.egg/simplejson/decoder.py", line 335, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/lib/python2.6/dist-packages/simplejson-2.0.9-py2.6-linux-i686.egg/simplejson/decoder.py", line 353, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
这种错误信息弄得我一头雾水,在Google上找了半天,也没有什么好的办法。在ReviewBoard的issue archive里有人遇到了和我一样的问题,而ReviewBoard的维护人员建议:修改/usr/local/lib/python2.6/dist-packages/RBTools-0.2beta1-py2.6.egg/EGG-INFO/scripts/post-review中的代码(在/usr/local/lib/python2.6/dist-packages下你可能会发现RBTools-0.2beta1-py2.6.egg是个文件而不是目录,不要紧,.egg文件就是一个zip文件,可将其用unzip命令解压后再放到一个名为RBTools-0.2beta1-py2.6.egg的目录中即可,解压后原始RBTools-0.2beta1-py2.6.egg做好更名和备份),在process_json method开始处加上一行代码:debug(data)。然后在执行post-review时加上–debug选项,观察http post的response数据。
按照网上的建议做了修改:执行sudo post-review –debug,果然有效果,能看到http post后返回的应答内容,居然是公司代理服务器websense的拦截应答。
哇,原来如此,我的.bashrc配置了http_proxy,似乎post-review是向代理发出的http post请求,结果被代理拦截掉了。注释掉.bashrc中的http_proxy变量后,再重复执行post-review命令,这下一切ok了,一个New Review Request成功生成。
第二种模式post-committed review同样是通过post-review工具完成的。命令格式:post-review –revision-range=STARTREV[:STOPREV]。脚本会自动diff两个revision之间的差别并形成review request提交到reviewboard server的。
关于post-review的更多用法,这里不细说了,可阅读官方的Manual。Review Board功能还是很强大的,Review时你可以针对每行代码写Comments,这种Review Code的方式给你足够时间去思考,只要你认真对待,就不会出现盲区、死角,所以新提交的代码就都能被Review到。
© 2009, bigwhite. 版权所有.
Related posts:
我最近也在试用review-board了,就快成功了,可是在执行post-review的时候 提示 http://x.x.x.23:81/review/api/json/accounts/login/. The host path may be invalid
<urlopen error (10061, ‘Connection refused’)>
我在IE上输入这个URL,提示405,应该与apache的配置有关,还请指教
连 ,http://*.*.*.23:81/review/这个目录没有问题。
但是访问http://x.x.x.23:81/review/api/json/accounts/login/ 就不行,非常郁闷啊。 对了我是win 平台。
我就是在官网上问了,Christian 没给我很好的回复,所以就找您问问,我自己再研究下吧,谢谢了。
请问有人用CVS吗,我的~/.reviewboardrc配置文件配置为
TREES = {
‘:pserver:lucy@localhost:2401/cvsd’: {
‘REVIEWBOARD_URL’: ‘http://localhost:80',
},
}
但一直报库不对的错。
我配置的SVN已经可以使用,请问CVS如何配置
您好,我已经配置好了,但是我想和Perforce做集成。页面上应该怎么配置啊?
我在我页面配置了,但是还是不知道怎么去用。
reviewboard安装完成后,可以正常登录,并且已经实现自动发送邮件,但是在上传diff文件时总是提示错误如下:Something broke! (Error 500)It appears something broke when you tried to go to here. This is either a bug in Review Board or a server configuration error. Please report this to your administrator不知道具体是什么原因,具体哪里的配置出问题;希望各位知道的能不吝赐教
我自己折腾reviewboard那是好久以前的事情了,目前我们用的reviewboard运行稳定,基本没有啥问题。你的问题我还真的没遇到过,这里也无法帮你定位。还是自己摸索摸索吧。
请教下,您的reviewboard环境是什么样的?我是reviewboard服务器在linux下,web访问在windows下。会出现上述错误,但是在linux本机下访问提交diff就一切正常。
我们的环境是Review Board 1.5.1,版本比较老了,装在redhat 5.6虚拟机上。在任何环境下访问页面和提交diff都是没问题的哦。
btw,是否你的diff文件在windows和linux下的生成是不一样的,记得要用-u选项的。
确实是这样,我在linux使用svn diff 生成patch,copy到windwos下就可以。之前出现500错误是因为 我使用svn客户端直接生成patch文件,如:里边有“版本 10”,如果把“版本 10”换成 “version 10”就可以。现在知道这个问题了,就是不知道怎么可以解决,svn直接生成patch文件上传问题
估计是windows上的svn客户端会判断系统设置的语言和区域,如果是中文,自然在diff中会显示中文;我在linux下export LANGUAGE=en_US:en后,svn diff就会出现version 10,而不是版本10。但在以前的LANGUAGE=zh_CN:zh下,svn diff就会输出”版本 10“。
自动发送邮件怎么实现的,需要配置一些什么?
需要配置邮件服务器。reviewboard的manual上应该有说明。
==> HTTP Authentication RequiredEnter authorization information for “Web API” at 192.168.1.115Username: adminPassword:There was an error creating this review request.The repository path “svn://192.168.24.167″ is not in thelist of known repositories on the server.Ask the administrator to add this repository to the Review Board server.For information on adding repositories, please readhttp://www.reviewboard.org/docs/manual/dev/admin/configuration/repositories/
我都配置好了,但就是不行
svn://192.168.24.167是svn仓库的地址,我在reviewboard里已经设置了,需要重启reviewboard的web服务吗
应该不用重启。访问svn://192.168.24.167的user和passwd都配置了么?确认配置是正确的。另外在reviewboard安装的那台机器上试试用svn访问你的svn repository svn://192.168.24.167,看看是否ok?
谢谢你的回复,在我的PC上是可以的正常访问svn://192.168.24.167的, 可以正常检入检出
C:UsersIBM_ADMINDocumentsGitHubtest2 [master +1 ~1 -0 !]> post-review==> HTTP Authentication RequiredEnter authorization information for “Web API” at 9.11.111.120Username: adminPassword:There was an error creating this review request.The repository path “https://github.com/chzh-snake/test2.git” is not in thelist of known repositories on the server.Ask the administrator to add this repository to the Review Board server.For information on adding repositories, please readhttp://www.reviewboard.org/docs/manual/dev/admin/configuration/repositories/想请问一下这个是什么问题啊?自己跳了好久没出来,而且自己用git diff生成的diff文件上传,每次都是diff文件通过不了验证,不知道什么问题,求指教。
似乎是reviewboard上没有添加”https://github.com/chzh-snake/test2.git这个库。通过管理员权限进入reviewboard,admin->repositories中添加你的仓库。一直用svn,git repository如何与reviewboard结合,你最好看看在线的manual。
谢谢,后面通过了,可是用SSH访问远程库的时候,出现了这个问题:>>> Got API Error 207 (HTTP code 400): The file was not found in the repository>>> Error data: {u’stat’: u’fail’, u’file’: u’build.xml’, u’err’: {u’msg’: u’The file was not found in the repository’, u’code’: 207}, u’revision’: u’03f8ea08a8667200fd40e7c8c3efe749e05fe59b’}Error uploading diffYour review request still exists, but the diff is not attached.配置的Raw file path 在浏览器中可以正确的找到此文件,但是用post-review的时候debug结果显示在服务器上找不到文件。
我也遇到这个问题了,解决了吗
Review Board is taking a nap 跳出来了这个页面,别的页面我都进不去,能帮个忙弄下吧。谢谢了。。
哥们我也是这个问题 你弄了好了没
post-review时失败么?是不是也是http_proxy代理的问题?我的原文中所有问题都已经解决,在原文中有描述的。
你好 请问 你的问题解决了吗
你好 请问 你的问题解决了吗
When the events you specify occur, Review Board will send an HTTP request to any URLs you configure with a payload describing what happened.