代碼審覈(Code Review)是軟件研發質量保障機制中很是重要的一環,但在實際項目執行過程當中,卻由於種種緣由被Delay甚至是忽略。在實踐中,給你們推薦一款免費、開放源代碼的代碼審查軟件Gerrit。html
Code Review最直觀的解釋即看代碼。常規的作法爲本身看,有時代碼邏輯問題可能本身看不出來,須要找同事一塊兒看,在你們知識體系相對平均的狀況下可能須要花錢專門的公司幫助查看。java
Code Review須要看哪些?對於剛入職場或者剛接觸到Coding的新人來講,代碼風格是比較重要的一塊。除此以外,編碼規範及代碼結構寫法,框架和工具的選型,具體項目的業務邏輯,安全隱患,性能問題等均可以經過review的方式發現。Code Review從前日後大體分爲結對編程,提交代碼後,測試以前,發版以前,發版以後等幾個階段,越日後,Code Review的效果越差,修復的成本也愈來愈高。linux
爲何必定要作入庫前Code Review?nginx
首先,代碼審查的最大的功用是純社會性的。若是你在編程,並且知道將會有同事檢查你的代碼,你編程態度就徹底不同了。你寫出的代碼將更加整潔,有更好的註釋和程序結構。git
其次,偷懶是人的天性,從節約成本的角度考慮,你們通常會選擇在測試以前無限制的Delay Code Review。入庫前作Code Review即是成本和效果之間最佳平衡點,它能及時發現問題,進行修改後確保代碼質量。web
最後,代碼審查能傳播知識。在不少開發團隊裏,常常每一個人負責一個核心模塊,每一個人都只關注本身的模塊。除非是同事的模塊影響了本身的程序,他們從不相互交流。這種狀況的後果是,每一個模塊只有一我的熟悉裏面的代碼。若是這我的休假或辭職了,其餘人則一籌莫展。經過代碼審查,至少會有兩我的熟悉這些程序——做者,以及審查者。審查者並不能像程序的做者同樣對程序十分了解,但至少他會熟悉程序的設計和架構,這是極其重要的。shell
Gerrit是Google爲Android系統研發量身定製的一套免費開源的代碼審覈系統,它在傳統的源碼管理協做流程中強制性引入代碼審覈機制,經過人工代碼審覈和自動化代碼驗證過程,將不符合要求的代碼屏蔽在代碼庫以外,確保核心代碼多人校驗、多人互備和自動化構建覈驗。數據庫
Gerrit以前的系統架構:apache
Gerrit以後的系統架構:編程
經過Gerrit機制將代碼作分隔。
Gerrit適用性
幾乎任何須要正式發佈的項目都應當使用Gerrit來進行代碼審查,若是Team中有新人,必須使用Gerrit確保代碼質量。
使用過git的同窗,都知道,當咱們git add --> git commit --> git push
以後,你的代碼會被直接提交到repo,也就是代碼倉庫中,就是圖中橘紅色箭頭指示的那樣。
那麼gerrit就是上圖中的那隻鳥,普通成員的代碼是被先push到gerrit服務器上,而後由代碼審覈人員,就是左上角的integrator在web頁面進行代碼的審覈(review),能夠單人審覈,也能夠邀請其餘成員一同審覈,當代碼審覈經過(approve)以後,此次代碼纔會被提交(submit)到代碼倉庫(repo)中去。
不管有新的代碼提交待審覈,代碼審覈經過或被拒絕,代碼提交者(Contributor)和全部的相關代碼審覈人員(Integrator)都會收到郵件提醒。
gerrit還有自動測試的功能,和主線有衝突或者測試不經過的代碼,是會被直接拒絕掉的,這個功能彷佛就是右下角那個老頭(Jenkins)的任務。
整個流程就是這樣。 在使用過程當中,有兩點須要特別注意下:
提交者不能直接把代碼推到遠程的master主線(或者其餘遠程分支)上去。這樣就至關於越過了gerrit了。 gerrit必須依賴於一個refs/for/*
的分支。
假如咱們遠程只有一個master主線,那麼只有當你的代碼被提交到refs/for/master
分支時,gerrit纔會知道,我收到了一個須要審覈的代碼推送,須要通知審覈員來審覈代碼了。
當審覈經過以後,gerrit會自動將這條分支合併到master主線上,而後郵件通知相關成員,master分支有更新,須要的成員再去pull就行了。並且這條refs/for/master
分支,是透明的,也就是說普通成員實際上是不須要知道這條線的,若是你正確配置了sourceTree,你也應該是看不到這條線的。
這兩點很重要!!這兩點很重要!!這兩點很重要!!
①. Linux,Gerrit須要Linux環境,ubuntu 或者 centos,這裏使用Ubuntu;
②. JDK,使用1.7版本就行
③. MySQL,其實這個非必須,Gerrit自帶的有H2數據庫
④. nginx/apache,做爲認證和反向代理服務器;
⑤. Maven, 在安裝的過程當中會下載一些jar文件;
⑥. Git,用來拉取代碼
下載:jdk-7u79-linux-x64.tar.gz http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
安裝:sudo tar zxvf ./jdk-7u79-linux-x64.tar.gz -C /opt
配置:vim ~/.bashrc(針對當前用戶) or vim /etc/profile(針對全部用戶,推薦)
export JAVA_HOME=/opt/jdk1.7.0_79 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
驗證:
java -version java version "1.7.0_79" Java(TM) SE Runtime Environment (build 1.7.0_79-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
gerrit依賴,用來操做git repository
sudo apt-get install git
wget https://www.gerritcodereview.com/download/gerrit-2.12.4.war
sudo apt-get install apache2
驗證:
service apache2 start
gerrit依賴,用來管理gerrit。
sudo adduser gerrit sudo passwd gerrit
並將gerrit加入sudo權限
sudo visudo
gerrit ALL=(ALL:ALL) ALL (爲了測試方便,開最大權限)
默認安裝:
java -jar gerrit-2.12.4.war init --batch -d ~/review_site
更新配置文件:sudo vim ~/review_site/etc/gerrit.config
[gerrit] basePath = git canonicalWebUrl = http://47.120.74.47:8081/ [database] type = h2 database = /home/gerrit/review_site/db/ReviewDB [index] type = LUCENE [auth] type = http [receive] enableSignedPush = false [sendemail] smtpServer = smtp.163.com smtpServerPort = 465 smtpEncryption = ssl smtpUser = avcd@163.com smtpPass = avcd123123123 sslVerify = false from = code review<avcd@163.com> [container] user = gerrit javaHome = /opt/jdk1.7.0_79/jre [sshd] listenAddress = *:29418 [httpd] listenUrl = http://*:8081/ [cache] directory = cache [http] proxy = http://47.120.74.47:8090 proxyUsername = gerrit1 #proxy user & password proxyPassword = 123456
a、若是apache目錄結構以下:
apache2.conf conf-enabled magic mods-enabled ports.conf sites-enabled conf-available envvars mods-available sites-available
開啓SSL、Proxy、Rewrite等模塊:
cd /etc/apache2/mods-enabled ln -s ../mods-available/proxy.load ln -s ../mods-available/proxy.conf ln -s ../mods-available/proxy_http.load ln -s ../mods-available/proxy_balancer.conf ln -s ../mods-available/proxy_balancer.load ln -s ../mods-available/rewrite.load ln -s ../mods-available/ssl.conf ln -s ../mods-available/ssl.load ln -s ../mods-available/socache_shmcb.load # ln -s ../mods-available/slotmem_shm.load #
更新配置文件:sudo vim /etc/apache2/sites-enabled/gerrit-httpd.conf
ServerName 47.200.74.47 <VirtualHost *:8090> ProxyRequests Off ProxyVia Off ProxyPreserveHost On AllowEncodedSlashes On RewriteEngine On RewriteRule ^/(.*) http://47.200.74.47:8081/$1 [NE,P] <Proxy *> Order deny,allow Allow from all </Proxy> <Location /login/> AuthType Basic AuthName "Gerrit Code Review" Require valid-user AuthBasicProvider file AuthUserFile /etc/apache2/passwords </Location> ProxyPass / http://127.0.0.1:8081/ </VirtualHost>
b、若是apache目錄結構以下:
bin build cgi-bin conf error htdocs icons include lib logs man manual modules
開啓SSL、Proxy、Rewrite等模塊:
# Open LoadModule LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule ssl_module modules/mod_ssl.so LoadModule rewrite_module modules/mod_rewrite.so # Gerrit config Include conf/extra/gerrit-httpd.conf
其中apache2/conf/extra/gerrit-httpd.conf內容同上,apache2/sites-enabled/gerrit-httpd.conf。
touch /etc/apache2/passwords htpasswd -b /etc/apache2/passwords admin 123456(管理員) htpasswd -b /etc/apache2/passwords gerrit1 123456(普通用戶)
sudo ~/review_site/bin/gerrit.sh start sudo /etc/init.d/apache2 start
前提:須要git使用端 / gerrit服務端配合使用。
ssh -p 29418 gerrit1@47.200.74.47 gerrit create-project --empty-commit --name demo-project
#建議採用管理界面添加
ssh -p 29418 gerrit1@192.168.199.112 gerrit create-project --name exist-project #建議採用管理界面添加
或者使用gerrit管理界面
而後將已有項目與gerrit上創建的exist-project關聯,即將已有代碼庫代碼push到gerrit中進行管理。
cd ~/exist-project git push ssh://gerrit1@47.200.74.47:29418/exist-project *:*
在開發帳戶中生成sshkey,用做與gerrit服務器鏈接。
ssh-keygen -t rsa #生成sshkey
此步驟與git流程相似,即將id_rsa.pub內容上傳到git repository,gerrit中幫咱們管理git repository.
驗證sshkey是否配置成功:ssh gerrit1@47.200.74.47 -p 29418
**** Welcome to Gerrit Code Review **** Hi gerrit1, you have successfully connected over SSH. Unfortunately, interactive shells are disabled. To clone a hosted Git repository, use: git clone ssh://gerrit1@47.200.74.47:29418/REPOSITORY_NAME.git Connection to 47.200.74.47 closed.
拉取代碼:
git clone ssh://gerrit1@47.200.74.47:29418/REPOSITORY_NAME.git
更新githooks:
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 gerrit1@47.200.74.47:hooks/commit-msg ${gitdir}/hooks/
該過程用來在commit-msg中加入change-id,gerrit流程必備。
修改代碼並提交,推送時與原有git流程不一致,採用 git push origin HEAD:refs/for/master 。
[root@iZ62j8121e5Z abcd]# git push origin HEAD:refs/for/master Counting objects: 3, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 710 bytes | 710.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: Processing changes: new: 1, refs: 1, done remote: remote: New Changes: remote: http://47.200.74.47:8081/5 xxxx remote: To ssh://47.200.74.47:29418/abcd * [new branch] HEAD -> refs/for/master
若是不加會提示一下錯誤:
[root@iZ62j8121e5Z abcd]# git push origin HEAD:refs/for/master Counting objects: 3, done. Writing objects: 100% (3/3), 239 bytes | 239.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: Processing changes: refs: 1, done remote: ERROR: missing Change-Id in commit message footer remote: remote: Hint: To automatically insert Change-Id, install the hook: remote: gitdir=$(git rev-parse --git-dir); scp -p -P 29418 admin@47.200.74.47:hooks/commit-msg ${gitdir}/hooks/ remote: And then amend the commit: remote: git commit --amend remote: To ssh://47.200.74.47:29418/abcd ! [remote rejected] HEAD -> refs/for/master (missing Change-Id in commit message footer) error: failed to push some refs to 'ssh://admin@47.200.74.47:29418/abcd'
當完成push後,可在gerrit管理界面看到當前提交code review的change。
查看某次提交的詳細信息(審覈者+2可經過本次提交,提交者可經過Abandon本次提交):
若是審覈者+2經過後,可提交該次commit.
須要爲每一個使用者分配gerrit帳號,不要都使用admin帳號,由於admin帳號可直接push master
pull代碼後須要配置githooks文件,以便在commit時自動生成change-id,不然沒法push
push代碼時須要使用git push origin HEAD:refs/for/master(branch),gerrit默認關閉非admin帳號的push direct權限
push代碼時須要commit email與gerrit account email一致,不然沒法push成功,可選擇關閉email notify,並開啓forge user權限,或者經過修改gerrit數據庫account email信息
gerrit數據庫與gitlab同步,須要安裝replication插件,並開啓該功能
參考連接:
Java SDK Download: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
Gerrit Code Review - Releases Download: https://gerrit-releases.storage.googleapis.com/index.html
Gerrit Code Review - Quick get started guide: https://git.eclipse.org/r/Documentation/install-quick.html
Gerrit代碼審覈流程 http://www.worldhello.net/gotgit/images/gerrit-workflow.png
Gerrit代碼審覈原理 http://www.worldhello.net/gotgit/05-git-server/055-gerrit.html
Gerrit代碼審覈權限管理 https://gerrit-review.googlesource.com/Documentation/access-control.html#category_forge_committer
Gerrit修改數據庫email信息 http://www.cnblogs.com/kevingrace/p/5624122.html
Gerrit安裝replication插件 https://gerrit-review.googlesource.com/Documentation/cmd-plugin-install.html