眼下部门还没有採用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. Linux ReviewBoard安装与配置

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

  2. JDK安装与配置

    JDK安装与配置 一.下载 JDK是ORACLE提供免费下载使用的,官网地址:https://www.oracle.com/index.html 一般选择Java SE版本即可,企业版的选择Java ...

  3. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  4. 烂泥:redis3.2.3安装与配置

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前一段时间写过一篇codis集群的文章,写那篇文章主要是因为当时的项目不支持redis自 ...

  5. mysql源码包手动安装、配置以及测试(亲测可行)

    笔记编者:小波/qq463431476博客首页:http://www.cnblogs.com/xiaobo-Linux/ 记下这篇mysql笔记,望日后有用! redhat6采用centos yum源 ...

  6. 环境搭建系列-系统安装之centos 6.5安装与配置

    按照国际惯例,系列目录先奉上: 系列一:系统安装之centos 6.5安装与配置 系列二:准备工作之Java环境安装 系列三:数据为先之MySQL读写集群搭建 系列四:谈分布式之RabbitMQ集群搭 ...

  7. ZooKeeper安装与配置

    一. 单机安装.配置: 1. 下载zookeeper二进制安装包下载地址:http://apache.dataguru.cn/zookeeper/zookeeper-3.4.3/zookeeper-3 ...

  8. mac 下JDK 与 tomcat 的安装与配置

    一.Mac下JDK的安装 1.先检测Mac是否已经安装过JDK,在终端中输入java 或者 javac 显示说明,表明已经安装过JDK,JDK版本查询终端键入java -version,终端会返回JD ...

  9. 烂泥:zabbix3.0安装与配置

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 这个月又快过完了,最近也比较忙,没时间写文章,今天挤点时间把zabbix3.0安装与配置 ...

随机推荐

  1. Android源码的下载和编译

    由于公司会安排我做硬解码这块,所以最近一直想研究一下Android源码,可是Android源码的下载真的挺麻烦的(可能是我第一次下载),参照网上的方法,没有一个可行的,现在就将我的下载过程和大家分享一 ...

  2. mfc删除标题和边框

    //删除标题和边框WS_CAPTION和WS_BORDER风格 ModifyStyle(WS_CAPTION, 0);ModifyStyle(WS_BORDER, 0);

  3. HDU 1848 Fibonacci again and again

    题解:尼姆博弈,对于1至1000计算SG函数,每次取最小的前继值,SG值异或为0则为P-position. #include <cstdio> #include <cstring&g ...

  4. HDU 1983 Kaitou Kid - The Phantom Thief (2)

    神题,搜索太差,来自网络的题解与程序 思路: 封锁出口或者入口周围的格子. 最多需要4个封锁点. 所以我们可以采取这样的策略: 1.寻找一条盗贼的可行路线,如果没有,返回0. 2.计算封锁出口和入口四 ...

  5. Binary Tree Level Order Traversal II --leetcode C++

    考察点 广度优先遍历--层次遍历 STL内容器的用法 广度优先遍历的时候,首先应该想到的就是借助于队列.还需要在遍历下一层之前保存当前层节点的数量 代码很简单: class Solution { pu ...

  6. 禁止apache显示目录索引

    1)修改目录配置: 复制代码 代码如下: <Directory "D:/Apache/blog.phpha.com">Options Indexes FollowSym ...

  7. csv批量导入mysql命令

    今天把从Kaggle上下载下来的csv数据导入mysql,想做个统计分析,怎奈csv文件有些大.所以仅仅能用mysql 命令导入,现mark下,以备以后不时之需: 1. 导入: 基本的语法: load ...

  8. 在GridView控件里面绑定DropDownList控件

    参考链接: http://www.aspsnippets.com/Articles/Populate-DropDownList-with-Selected-Value-in-EditItemTempl ...

  9. jQuery的扩展

    我们自己通过扩展jQuery来达到 “通过$.xx(paras)的形式来进行调用某个jQuery对象的xx(paras)方法”. 下面就是一个实例: (function(j){//这里的j是一个形参, ...

  10. php随笔4-thinkphp 学习-ThinkPHP3.1快速入门(2)数据CURD

    ThinkPHP3.1快速入门(2)数据CURD   浏览:194739 发布日期:2012/09/05 分类:文档教程 关键字: 快速入门 CURD 上一篇中,我们了解了ThinkPHP的基础部分, ...