天天看點

強制執行像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,如需轉載請自行聯系原作者

繼續閱讀