标签 程序员 下的文章

Review Board安装和配置札记

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

Code Review工具对代码走查是一种很好的补充。目前比较流行的开源Code Review工具有Review BoardCodeStriker等。对于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到。

Solaris 10安装二三事

部门服务器资源向来都比较紧张,每当忙碌季节到来,服务器资源消耗都较大,开发人员总是抱怨编辑代码慢、Build慢以及磁盘空间不足等问题,严重时甚至无法工作。部门也一直在尝试改善这个问题,无非加服务器、加磁盘等,但是这些措施似乎都难以满足开发和测试人员日益增长的对服务器资源的索求。

为了尽量在组内杜绝上述现象的发生,决定搭建多台PC Server给组内开发人员使用,让大家工作的更有效率,更独立自由,不受共享服务器的约束。因负责部门内部服务器的系统工程师出差在外,无奈委托一个热心同事尝试去安装一下Solaris 10 for x86版本。这位热心同事很积极也很快的将Solaris 10安到了那台空闲PC Server上。但是上午我发现系统的网络仍然未配置,决定亲自手工给这个Server配置网络参数。

对于Solaris系统的配置和管理,我就是一菜鸟级选手,一切都要从头来-到网络上查找资料。找了半天仍是一头雾水。又想到利用Solaris 10提供图形化界面去配置,但是居然没有找到对应的工具或程序的位置。只能向家中另外一位系统工程师同事求助。这位同事也是热心肠,还亲自过来为我配置网络。在他配置的过程中,我也学到了网络配置的一些皮毛。

首先查看网口是否激活,如果没有,则找到网口设备名称,并激活网口服务:
在这台Server上,执行ifconfig -a发现,只有lo0这一个本机LOOPBACK虚拟网口,显然该主机物理网口没有被激活。

寻找这个网口设备名称:
cd /dev
ls -l|more
一般网口设备名称都类似:bge0,hme0等。发现我的这台主机网口为bge0。

激活该网口设备:
ifconfig bge0 plumb up
这回你再执行ifconfig -a,你将会看到bge0网口,但是该网口尚未分配IP地址和掩码。

如果你要临时设置该网口IP和掩码的话,可直接使用ifconfig命令(ifconfig bge0 HOST_IP netmask 255.255.255.XXX)进行,但是这样的设置在主机重启后将无法保留下来。那我们就说说永久保留设置的方法。

设置静态IP:
vi /etc/hosts,在结尾添加一行:HOST_IP   主机名  loghost
vi /etc/hostname.bge0,该文件可能需要你手工创建,只有一行:主机名

设置子网掩码:
vi /etc/netmasks,增加一行格式诸如:"network-number  netmask"。如果主机IP为10.10.12.77,掩码为255.255.255.0,则你可添加"10.10.12.0 255.255.255.0"。

设置网关/默认路由
vi /etc/defaultrouter,直接将你的网关的IP写入即可。

重启系统后,网络算是通了。无论是从本主机访问其他主机,还是从其他主机访问这个主机都没有问题了。但是还有一个问题:打开Firefox无法打开网页?应该是DNS没有配置,配置方法如下:

vi /etc/nsswitch.conf,在hosts:   files后面加上一个"dns",即该行变成:"hosts:   files dns",保存退出。
vi /etc/resolv.conf,每一行是一个DNS服务器,格式如:nameserver xxx.xxx.xxx.xx

配置完,firefox顺利打开了外部网页。

配置完网络本以为该主机可以投入正式使用了,但无意间却发现'/'分区下空闲空间仅剩下20%多了,70%的空间已经被使用,再细致一看,发现'/'分区分配的空间太小了,不仅如此swap交换分区仅仅分配了500M的空间。经沟通得知,首次安装采用的是默认安装,才有了此结果。由于无法动态扩展'/'和swap分区大小,无奈只能重装,否则日后问题更多。

Solaris10的图形化安装果真比不了Ubuntu,更无法与Windows相比了,不过我还能应付,这次我选择了自定义安装,并在安装阶段就将网络配置好了。一个小时左右,安装过程结束,进入桌面,需重新按上面步骤配置DNS,其他就无需配置了。

从其他机器Telnet访问该主机,居然提示:"telnet: Unable to connect to remote host: Connection refused",是我的网络配置错了?ping和traceroute都正常,而且从这台主机Telnet访问其他主机都没有问题,估计是Telnet服务没有启动,通过“netstat -an|grep LISTEN”并未看到在监听23端口,但是如何启动Telnet服务到不是很清楚,在询问了系统工程师后,执行了一下:svcadm enable telnet,Telnet服务瞬间启动了。同理,Ftp服务也是如此。svcadm应该是Solaris 10新增的系统管理工具,低版本的OS可能都不具备这个命令。

再次从别的机器telnet这台服务器,并用root用户登录,提示:"Not on system console, Connection to xxx.xxx.xxx.xxx closed by foreign host",这又是怎么回事?从系统工程师那得到的答案是:默认不允许root用户远程登录。可打开/etc/default/login这个文件,并将“CONSOLE=/dev/console”这行注释掉就可以了。

下班前终于将该主机安装配置完毕,可正式投入使用了。但是在下班路上与另一位同事探讨这个安装配置问题时,他提示我还有一处遗漏:那就是/var没有单独分区,而是与'/'分区共享,这样给以后的使用带来了一些隐患,在测试和运行一些大程序时/var很容易被占满,导致程序无法正常运行。在不再重装系统的前提下,只能考虑定期清理/var下的文件了。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats