眼下部门还没有採用Pair Programming那种时时刻刻都在review代码的工作方式,代码Review多採用走查方式,即代码写完后召开一个Code Review的Meeting,集中时间和经验丰富的人力对重点代码进行筛查,这样的方式的代码Review有利,但也有弊。其弊端在于低效和覆盖面小。做一次走查须要N多人參与若干个小时,而在这段时间里不是每一个參与者都能极其高效的參与到走查中的,实践证明仅仅有少数几个人能真正在一次代码走查会议上起到关键的作用。另外走查一次能覆盖的代码范围又较小,一些看似不重要却非常可能带来BUG的代码在走查会上非常容易被遗漏。

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

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

我是在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是訪问数据库的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. Maven安装与配置(最实用!!!)eclipse中配置maven

    Maven安装与配置 一.需要准备的东西 JDK Eclipse(本章主要是在eclipse中进行配置maven) Maven程序包 二.下载与安装 1. 前往maven下载最新版的Maven程序: ...

  3. Portainer 安装与配置

    文章目录 Portainer 安装与配置 一.介绍 二.安装使用 1.单机运行 2.基于swarm集群方式运行 Portainer 安装与配置 一.介绍 ​ Portainer 是一个开源.轻量级Do ...

  4. Myeclipse安装、配置、测试

    Myeclipse安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.安装与激活 4.JavaSE开发测试(确保JDK已正确安装) 5.JavaEE开发测试(确保服务器和 ...

  5. [网摘学习]在Ubuntu上安装和配置OpenStack Nova之二

    再收藏一份Openstack的文章,这两天的操作与此相同.但其中出现的问题还需要查找原因.待个人继续学习研究. 原文参考:http://www.linuxde.net/2011/11/1599.htm ...

  6. centos6.5 php5.2,Linux中PHP安装与配置(CentOS-6.5:php-5.2.13)

    1 PHP简介     PHP(PHP: Hypertext Preprocessor的缩写,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Per ...

  7. java jdk 1.8 安装_下载、安装、配置 java jdk1.8

    近期配置react native的开发环境,所以就从配置环境开始.rn的环境配置有那么几项,其中重要的一个就是java jdk(Java Development Kit 的缩写),那么以下就是下载.安 ...

  8. mysql安装好需要优化配置一下_Mysql的安装、配置、优化

    Mysql的安装.配置.优化 安装步骤 1.先单击中的安装文件,如果是win7系统,请选择以管理员的方式运行. 2.大概需要30秒的时间,开始进入安装界面.请先把标红的打勾,好进行下一步的动作. 3. ...

  9. windows下opencv安装及配置(vs2010环境)

    opecv下载 前往官方下载地址 https://opencv.org/releases/ opencv安装及配置 解压,会得到一个opencv文件夹,可将提取出的文件移动到任意位置,我将其放在F盘. ...

最新文章

  1. 面试官问:对象池技术了解吗?apache common pool2呢?
  2. [训练日志] 7月22-31日
  3. JS-数据类型-数值Number
  4. ORACLE 11g 使用ROWNUM完美解决ORA-00600:内部错误代码
  5. Vue项目构建设计说明
  6. 【数理知识】《数值分析》李庆扬老师-第6章-解线性方程组的迭代法
  7. iPIN CEO 杨洋:AI 还未被大规模用在工作中,缺的是认知智能
  8. Python语言学习之字符串那些事:python和字符串的使用方法之详细攻略
  9. Linux日志 系统日志及分析
  10. Android无需权限保存文件,即使使用用户权限,也无法在外部存储上保存文件[Android]...
  11. Chrome 调试动态加载的js
  12. 论文都看不懂,你还搞什么人工智能?
  13. PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集...
  14. [转]wince中解析reg和bib文件的不同之处
  15. 深度学习优化算法入门:二、动量、RMSProp、Adam
  16. html选择符分几类,css的选择符有哪些?
  17. 离散数学1 命题逻辑-基本的概念
  18. 数组填空题c语言及答案,C语言程序设计 程序填空题库及答案
  19. java转置输出_在java中如何将一个5*3的二维数组转置输出
  20. 有两个瓶子,一个瓶子是5升_隐藏的功能,装在瓶子中的消息和痴呆的面包师。...

热门文章

  1. Swift - UITableView里的cell底部分割线左侧靠边
  2. 数学思想 —— 推广和泛化
  3. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用...
  4. 美丽的数学家:如果您讨厌数学,这些其实都是人生故事
  5. LeetCode-3Sum -三数求和-有序数组扫描
  6. Arcengine实现创建网络数据集札记(二)
  7. Android之使用ViewPager实现图片展示(最简单的)
  8. Struts2中Result类型介绍
  9. php+mysql+into_PHP+MySQL之InsertInto数据插入用法分析_php技巧
  10. mysql数据库根目录恢复_MySQL中数据导入恢复的简单教程