天天看点

强制执行像Facebook的代码审计

Facebook、Google这样的巨头IT公司都具备完善的代码库管理、代码审计(Code Review)制度。代码审计能够消除一些Bug,不过事实上,这不是代码审计最主要的目的,因为Reviewer很难通过审阅代码来发现深层次的Bug。代码审计更重要的是,它有助于维护代码的质量,因为Reviewer可以发现代码编写的是否规范,可以从审计过程中互相学习,也可以指出代码存在的问题。此外,开发人员也会有更多的意识来编写更高质量的代码,被别人指出太多问题或者低级问题,显示是很没有面子的,:)。因此,我认为代码审计对于产品的维护过程是非常重要的一环。Facebook采用谨慎的审计来防止代码出现一些问题。

Facebook 有非常牢靠的安全保障,以免有人(你可以想象内部有人有这个权限的)不小心/故意做了些糟糕的的事。如果你已经"成为"了需要别人支持的人,事由将被记录,并且有谨慎的审计。这里不允许钻空子。

首先,确保代码审计严格实施基于我们产品开发过程中对Check in的两个限制,如下:

没有一个BugID,那么任何东西都不可以Check in到代码库;

如果代码对应的Bug所处的状态不是“Review Passed”,那么任何东西都不可以Check in到代码库。

这两个限制能够来避免开发人员不经过审查就将代码非法的Check in到仓库。因此,当没有指定Bug/BugId不存在/Bug不处于Review Passed状态时,将阻止开发者Check in代码,向其提示错误消息。

强制执行像Facebook的代码审计

要实现Check in之前的限制,我们需要通过向VisualSVN的代码仓库中注册一个Pre-Commit的Hook,通过这个Hook来检查要Check in的代码是否处于正确的状态。以下是执行这个操作的Hook。这个Hook会获取当前BugId,然后传递给BugTracker.NET中的svn_hook.aspx执行对Bug状态的查询,如果允许签入,则返回包含“OK:”的响应码,否则,返回“ERROR:”。

强制执行像Facebook的代码审计

#!/usr/local/bin/python

import sys 

import subprocess 

import re 

import urllib 

import os

svnlook='C://Progra~1//Visual~1//bin//svnlook.exe' 

this_repository_url = "https://LADANFKING:8443/svn/monoaddins" 

btnet_url = "http://ladanfking/btnet/svn_hook.aspx" 

btnet_username = "admin" 

btnet_password = "admin"

repos=sys.argv[1] 

txn=sys.argv[2]

# Pre-commit tag 

status = -1

bDebug = False

def debug_out(s): 

    if (bDebug): 

        f = open('d:\\btnet_svn_hook_log.txt', 'a') 

        f.write(s) 

        f.write('\n') 

        f.close    

        print s

log_cmd = svnlook + ' log -t "' + txn + '" "' + repos + '"' 

process = subprocess.Popen(log_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

log_string = process.stdout.read()

debug_out(log_string)

params = urllib.urlencode({ 

    'svn_log': log_string, 

    'repo': this_repository_url, 

    'username': btnet_username, 

    'password': btnet_password, 

    'status':status})

response = urllib.urlopen(btnet_url, params) 

data = response.read() 

debug_out(data)

nPos = data.find('OK:') 

print data 

if nPos >= 0 and nPos == (len(data) - 3): 

    sys.exit(0) 

else: 

    sys.exit(1)

强制执行像Facebook的代码审计

因此,开发者想要Check in之前,必须创建一个Bug,并将这个Bug赋给某个人进行Review。这个步骤如下:

1 Create Bug:这一步骤一般是由QA来完成的,开发者也可以自己来创建Bug。如下所示。

强制执行像Facebook的代码审计

2 Assign Review

(1)创建一个Patch:进入到你的代码工作目录,然后右键,使用TotoiseSVN的“Create Patch”来创建一个补丁。

强制执行像Facebook的代码审计

这个补丁打开后就是前后代码的变更情况。

强制执行像Facebook的代码审计

(2)Assign Review:这一步就是将这个Patch文件通过BugTracker.NET作为附件上传给指定Bug,并将这个Bug赋给某个人来审计。

强制执行像Facebook的代码审计

3 Review:审计人员进入BugTracker.NET,查看Patch文件,如果审计通过,则将状态改为“Review Passed”,否则更改为“Review Failed”,这样开发人员需要重新进行代码变更并申请新的审计。

当要Check in的代码对应的Bug通过了审计之后,开发者就可以Check in了。以下是代码Check in之后的情况了。

强制执行像Facebook的代码审计

另外,其他人可以通过点击“svn revisions”来查看本次的更新,如下。

强制执行像Facebook的代码审计

这样,引入强制的代码审计就可以约束了开发者不可以随意Check in代码,不可以Check in不符合质量要求的代码,而且,其他开发人员可以查询BugTracker.NET仓库来看看相似的Bug是如何修复的。

本文转自道法自然博客园博客,原文链接:http://www.cnblogs.com/baihmpgy/archive/2011/09/09/2172425.html,如需转载请自行联系原作者

继续阅读