眼下部门还没有採用Pair Programming那种时时刻刻都在review代码的工作方式,代码Review多採用走查方式。即代码写完后召开一个Code Review的Meeting,集中时间和经验丰富的人力对重点代码进行筛查。这样的方式的代码Review有利。但也有弊。

其弊端在于低效和覆盖面小。

做一次走查须要N多人參与若干个小时,而在这段时间里不是每一个參与者都能极其高效的參与到走查中的,实践证明仅仅有少数几个人能真正在一次代码走查会议上起到关键的作用。

另外走查一次能覆盖的代码范围又较小,一些看似不重要却非常可能带来BUG的代码在走查会上非常容易被遗漏。

Code Review工具对代码走查是一种非常好的补充。眼下比較流行的开源Code Review工具有Review BoardCodeStriker等。对于ReviewBoard。我关注已久。在其还在rc阶段我就以前尝试安装过,只是不管是在Windows和Unix下都以失败告终。开源工具的安装的确有些让人头痛。一堆互相依赖的软件包,版本号稍有差异就非常可能导致安装执行失败。并且失败的原因还非常难得知。

ReviewBoard今年最终Release了,眼下最新版是1.0.3。其官方推荐在Linux和Windows上安装。

我选择了Ubuntu 9.04Ubuntu的包管理工具apt最大的优点就是能自己主动帮你分析开源包的依赖关系并自己主动下载安装依赖包。恰巧在CSDN的一个博客上发现一篇'ReviewBoard on Ubuntu 9.04 Server'的安装步骤,我就依照文章中的步骤超级顺利的完毕了ReviewBoard的安装,这里我也将其步骤贴出来,并做一些简单凝视(有些地方略有不同):

我是在Ubuntu 9.04 Desktop上安装的,这个版本号默认自带GccPython等软件包。我们仅仅需安装其它工具:(假设你是通过公司代理上外网,别忘了在你的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是訪问数据库的username。后一个reviewboard是密码 */
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on reviewboard.* to 'reviewboard'@'localhost';  /* 前一个reviewboard是数据库的名字。而后一个reviewboard则是訪问数据库的username */
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 <module>
    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 <module>
    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后返回的应答内容,竟然是公司代理serverwebsense的拦截应答。

哇,原来如此。我的.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。

ReviewBoard功能还是非常强大的,Review时你能够针对每行代码写Comments,这样的Review Code的方式给你足够时间去思考,仅仅要你认真对待,就不会出现盲区、死角,所以新提交的代码就都能被Review到。

注:安装reviewboard时,遇到一个问题, 使用easy_install不能下载ftp://ftp.tummy.com/pub/python-memcached/old-releases/python-memcached-1.45.tar.gz。 可是能通过浏览器或者curl下载该压缩包。

解决方法:

先通过curl下载该包。在使用easy_install -f . python-memcached-1.45.tar.gz 进行离线安装。

然后再运行reviewboard的easy_install.

ReviewBoard安装和配置说明的更多相关文章

  1. ReviewBoard安装和配置札记

    眼下部门还没有採用Pair Programming那种时时刻刻都在review代码的工作方式,代码Review多採用走查方式,即代码写完后召开一个Code Review的Meeting,集中时间和经验 ...

  2. Linux ReviewBoard安装与配置

    目录 0. 引言 1. 安装步骤 2. 配置站点 2.1 创建数据库 2.2 开始安装 2.3 修改文件访问权限 2.4 Web服务器配置 2.5 修改django相关配置 正文 回到顶部 0. 引言 ...

  3. linux下vsftpd的安装与配置说明

    问题: 1.530 Permission denied.答:配置文件中userlist_enable=YES(如果启用即YES,则看userlist_deny=YES/NO,如果为NO,则要把登录的用 ...

  4. Hadoop的安装与配置说明

    安装hadoop是一件非常容易的事情,读者可以在官网上下载到最近的几个hadoop版本.网址为http://apache.etoak.com//hadoop/core/.   目前,hadoop可以运 ...

  5. Kafka系列(一)安装和配置说明

    单机模式 修改kafak安装文件中 .../kafka_2.9.2-0.8.1.1/config 下面的server.properties 配置文件 1.broker.id=0   [默认不用修改,该 ...

  6. HTTP小幺鸡接口管理工具安装与配置说明

    http://www.xiaoyaoji.cn/doc/TxybXPTdx 小幺鸡接口管理工具安装说明 使用可以参考:https://blog.csdn.net/qincidong/article/d ...

  7. python nltk 安装及配置说明

    本教程采用pip安装方式,前期需要在本机安装setuptools 及pip 网上铺天盖地的说了很多关于nltk的说明,特别是后期nltk_data 手动下载操作,多数都不好使,这里整理 用pip安装n ...

  8. Oracle10g 客户端安装与配置说明

    1:百度文库 http://wenku.baidu.com/link?url=bA-FrFMaqxkoifwz-oiPeU5QmMVVJyy8rYDBryhTUCJywpkDS0VNJcObCIM8l ...

  9. Zookeeper安装以及配置说明(三)

    Zookeeper的安装和配置非常的简单,既可以配置成单机模式,也可以配置成集群模式.如下图所示: 下面将分别进行介绍: 单机模式 下载最新稳定版本zookeeper的安装包之后(看第一篇博文), 解 ...

随机推荐

  1. (一)IE8以下background不起作用

    最近遇到了些小bug,在这里做个记录分享下.低版本的浏览器不支持新属性或者说对代码的解析方式不一样,导致最后解析出来的结果五花八门,各种浏览器之间的兼容的确是一个令开发人员头疼的事情,不过有时候换一个 ...

  2. NSIS:IfFileExists+Goto实现简单跳转

    原文 NSIS:IfFileExists+Goto实现简单跳转 在用户手册中有相关示例,但也许有的同学没有发现,那么我再发一个,仅供入门学习参考. IfFileExists 要检测的文件 文件存在时跳 ...

  3. 看多csdn它还烂论坛?

    什么? 版权声明:本文博主原创文章,博客,未经同意不得转载.

  4. Cordic 算法的原理介绍

    cordic 算法知道正弦和余弦值,求反正切,即角度. 采用用不断的旋转求出对应的正弦余弦值,是一种近似求解发. 旋转的角度很讲求,每次旋转的角度必须使得 正切值近似等于 1/(2^N).旋转的目的是 ...

  5. JNDI数据源配置注意事项

    假设是在原有project上改动 1,applicationContext.xml中改动当中的value值 <bean id="dataSource" class=" ...

  6. UVA11992 - Fast Matrix Operations(段树部分的变化)

    UVA11992 - Fast Matrix Operations(线段树区间改动) 题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v ...

  7. HDOJ--4821--String【弦hash】

    联系:http://acm.hdu.edu.cn/showproblem.php?pid=4821 题意:给一个字符串,选m个长度为l的子串组成新的串.要求这m个子串互不同样,问有多少种组合. 字符串 ...

  8. Oracle 数据导出到PowerDesigner

    原文:Oracle 数据导出到PowerDesigner [一]配置ODBC win7 :控制面板(查看方式:小图标)→管理工具→数据源(ODBC) 在[ODBC数据源管理器]面板下,在默认[用户DN ...

  9. JMeter 怎么保存登录状态

    在Recording Controller中添加一个HTTP Cookie Manager Recording Controller右键-->add-->config element--& ...

  10. iBatis多表查询

    <typeAlias alias="Product" type="com.shopping.entity.Product"/> <typeAl ...