系統:ubuntu12.04
gerrit:2.8.5
參考連結:
1 http://blog.csdn.net/ganshuyu/article/details/8978614
2 http://fatalove.iteye.com/blog/1332881
3 http://blog.csdn.net/benkaoya/article/details/8680886
4 http://blog.chinaunix.net/uid-12076195-id-3487354.html
小小說明一下:
本人也是初次搭建gerrit伺服器,過程跟大家分享一下。文章中鑒于之前沒有碰到錯誤的地方,我就直接複制了。
中間涉及到的許多問題雖然都有解決,但還是有不少了解不到位的地方,歡迎有自己的獨到了解。
第一步:搭建gerrit
1、建立專有帳戶
sudo adduser gerrit
sudo passwd gerrit
su gerrit
2、配置Java環境
從官網下載下傳對應平台的JDK并安裝:
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
安裝:
sudo tar zxvf ./jdk-7u45-linux-i586.tar.gz -C /opt
完成後,配置相關環境變量
$: vim ~/.bashrc
添加如下環境變量:
export JAVA_HOME=/home/yaoshine/soft/jdk1.7.0_55
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
3、從官網下載下傳gerrit
http://code.google.com/p/gerrit/
4、安裝gerrit
java -jar gerrit-full-2.5.2.war init -d review_site
一路按回車,先以預設方式安裝,之後再手動修改配置檔案。
PS:這裡全部預設即可,我并沒有遇到會影響後期gerrit運作的地方。
5、配置gerrit
$: vim review_site/etc/gerrit.config
[gerrit]
basePath = git #這裡是存放工程目錄的地方,采取預設即可。我之前因為更換目錄導緻logs/error_log報錯說missing all-project.應該就是說的git目錄下邊的all-projecct.git
canonicalWebUrl = http://192.168.1.101:8081/ #更改為你的伺服器IP和端口号。8081可自定,但不能占用其他已用端口
[database]
type = h2 #這裡可以選擇gerrit的資料庫。預設是h2.用mysql的可以在這裡更改
database = db/ReviewDB
[auth]
type = HTTP
[sendemail]
smtpServer = smtp.163.com
smtpUser = [email protected] #這裡就相當于伺服器郵箱。每當有新使用者注冊,就會取這裡的郵箱和密碼給注冊使用者發郵件。必須密碼和郵箱對應起來,要不注冊不了使用者.
from = [email protected]
smtppass = ************ #密碼用自己的,郵箱也用自己的
[container]
user = gerrit #linux使用者
javaHome = /home/yaoshine/soft/jdk1.7.0_55/jre #修改自己的
[sshd]
listenAddress = *:29418 #預設即可 ,不要随便亂改。
[httpd]
listenUrl = http://*:8081/ #伺服器監聽的ip位址和端口,可以吧*換成ip
[cache]
directory = cache
7、安裝apache2伺服器
sudo apt-get install --reinstall apache2 apache2.2-common
8、配置apache2伺服器
8.1、開啟代理功能、複寫功能(以下子產品連結到mods-available)
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
8.2、配置apache2的監聽端口
$: vi /etc/apache2/ports.conf
……
NameVirtualHost *:80
NameVirtualHost *:8080 -->仿照80端口,加上對8080端口的監聽。
Listen 80
Listen 8080
……
8.3、配置反向代理
$: sudo vi /etc/apache2/httpd.conf
[html] view plain copy print ?
- ServerName ganshuyu.pbi.com
- <VirtualHost *:8080> -->用戶端通路:http:192.168.1.101:8080 會轉到gerrit伺服器的位址:http:192.168.1.101:8081上
- ProxyRequests Off
- ProxyVia Off
- ProxyPreserveHost On
- <Proxy *>
- Order deny,allow
- Allow from all
- </Proxy>
- <Location /login/>
- AuthType Basic
- AuthName "Gerrit Code Review"
- Require valid-user
- AuthBasicProvider file
- AuthUserFile /home/gerrit/review_site/etc/passwd #你存放gerrit使用者和密碼的地方
- </Location>
- ProxyPass / http://192.168.1.101:8081/
- </VirtualHost>
ServerName ganshuyu.pbi.com
<VirtualHost *:8080> -->用戶端通路:http:10.10.90.160:8081 會轉到gerrit伺服器的位址:http://10.10.90.160:8080 上
ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
AllowEncodedSlashes On
RewriteEngine On
RewriteRule ^/(.*) http://10.10.90.160: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 /home/gerrit/review_site/etc/passwd
</Location>
ProxyPass / http://10.10.90.160:8081/
</VirtualHost>
8.4、主配置檔案中加入httpd.conf,使其生效
$: sudo vi /etc/apache2/apache2.conf
檢視是否已包含:httpd.conf,如果沒有,則加上如下這句話:
Include httpd.conf
9、設定第一個gerrit使用者的帳号和密碼
$: touch ./review_site/etc/passwd
$: htpasswd -b ./review_site/etc/passwd gerritUser1 123456789
(後續再添加gerrit使用者可使用: $: htpasswd -b ./review_site/etc/passwd UserName PassWord )
10、開啟gerrit伺服器
$: ./review_site/bin/gerrit.sh start
如果提示發生如下錯誤:
** ERROR: GERRIT_SITE not set
則可按如下方法修改:
$: vim gerrit.sh
在GERRIT_SITE變量被指派之後加入下面這行,改變該變量的值。
GERRIT_SITE=/home/gerrit/review_site
11、重新開機apache2伺服器
$: sudo /etc/init.d/apache2 restart
12、通路: http://192.168.1.101:8080/ ,用gerritUser1使用者登入:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TVYVWMoJzY1ZkMaZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TN3MzNwcDN3EjMwcDMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
PS:如果在登陸之後出現ERROR資訊,可以參考錯誤日志,自行網上搜尋。日志在review_site/logs/error_log
第二步:注冊gerrit使用者。(直接原文複制,僅作PS)
注意,第一個注冊的使用者預設成了管理者,是以Gerrit安裝完畢第一件事要做的就是注冊或者登陸,以便初始化管理者賬戶。點選Become連結.
PS:我反正沒找到become連接配接。直接點右上角一個地方會出來settings和sign out,點settings會看到相關資訊。注意ID是10000的才是管理者。ssh的時候要用ID為10000的使用者,即使10001這種可以用好像後期也會各種出錯
如果你首次登陸的話,是會自動顯示注冊資訊之類。如果沒有就自己點setting對應設定資訊。效果一樣
圖2‑1 第一個注冊的使用者是管理者
◆ Full Name中輸入全名,點選SaveChanges儲存,Full Name設定完後還可以再修改。
◆ 點選Register New Email設定郵箱,點選SaveChanges儲存,郵箱設定完後可以修改。
◆ Username是gerrit的使用者名,輸入後使用者名後,點選Select Username儲存,注意Username設定後不可以再修改。
生成SSH密鑰對,可以加上-C參數添加說明(如
◆ 圖2‑2所示),以便能一眼看出這是誰的密鑰,否者預設的說明很雜亂。将公鑰檔案(注意是公鑰)的内容添加注冊頁面的Add SSH Publi Key中,點選Add即可。
PS:注冊新使用者時需要秘鑰。ssh-keygen -t rsa可以生成秘鑰。會生成兩個檔案在.ssh/下面。id_dsa和id_dsa.pub兩個檔案 。一個私鑰一個公鑰(.pub)。注冊時用vi打開id_dsa.pub檔案
複制粘貼到空白處即可、要全複制,包括開頭和結尾。
還有這裡的郵件需要注冊上,後期push的時候會用到。系統會發郵件到你的郵箱。确認即可。
圖 2‑2 生成SSH密鑰對
PS:完成之後大概是這個樣子
2.3.6. 測試下gerrit的SSH連接配接
PS:ssh的使用者為第一次注冊的使用者。也就是ID為10000的使用者
圖2‑3 gerrit使用者的使用者名Username
有了Gerrit賬号,也為該賬号正确配置了公鑰,就可以通路Gerrit提供的SSH登入服務。需要注意的是ssh登陸的使用者名必須是gerrit注冊的賬号,即如圖2‑3所示Settings > Profile > Username中顯示的Username。
$ ssh -p 29418 -i ~/.ssh/admin 192.168.1.101 -l admin
**** Welcome to Gerrit Code Review ****
Hi 管理者, you have successfully connected over SSH.
Unfortunately, interactive shells are disabled.
To clone a hosted Git repository, use:
恭喜你,看到welcome就表示你已經配置完成
如果連結異常的話,可以删除~/.ssh/knows_host重試
執行
第三步 簡單GIT操作,push clone操作
文章中大多為粘貼複制,可參考給對外連結接,略作整合
###############################################################################
這裡首先做出自己git的操作步驟:
ssh gerrit_short gerrit create-project -n 工程名
git clone ssh://使用者名@IP:29418/工程名 #這個地方會報警告,正常
cd 工程名
touch readme.txt;git add readme.txt;git commit readme.txt -m "commit"
git push origin refs/heads/master refs/for/master #這個地方回報缺少change-id。參考下文解決
#這裡也可以在clone完進入工程目錄後直接執行這句話,就不會報錯了 #scp -p -P 29418 [email protected]:hooks/commit-msg .git/hooks/ #name和IP用自己的
然後登陸web頁面,在web上找到ALL->open->review->選+2選項(+2才可以submit,管理者+2,兩個普通使用者+1)->publish and submit
#這時候你push 的代碼才真正到了遠端庫.而且中間經過了稽核過程
############################################################################### Java代碼
- ssh -p 29418 [email protected] gerrit create-project -n test_project
ssh -p 29418 [email protected] gerrit create-project -n test_project
添加一個項目。
在webUI就可以看到此項目了
5.簡便ssh
在~/.ssh/目錄下建立檔案config
加入内容如下
- Host gerrit_short
- User gerrit_fisrt_username
- Port 29418
- Hostname 192.168.1.101
- IdentityFile ~/.ssh/id_rsa
Host gerrit_short
User gerrit_fisrt_username
Port 29418
Hostname 127.0.0.1
IdentityFile ~/.ssh/id_rsa
以後執行
- ssh -p 29418 [email protected]
ssh -p 29418 [email protected]
這個指令就可以簡單的寫成
ssh gerrit_short
ssh gerrit_short
再比如
ssh -p 29418 [email protected] gerrit create-project -n test_project
就可以簡寫為
ssh gerrit_short gerrit create-project -n test_project
ssh gerrit_short gerrit create-project -n test_project
這裡的第2個參數gerrit是關鍵字
6.檢出項目
通過上面的指令建立項目以後,除了在http://192.168.1.101:8080/可以看見以外,通過ssh也可以檢視。
Java代碼
- ssh gerrit_short gerrit ls-projects
ssh gerrit_short gerrit ls-projects
将會輸出2個項目名稱
all_project
test_project
一個是内置的,一個是剛才建立的。(使用管理者賬戶才能看到内置的all_project項目)
下面客戶機就可以檢出項目了:
Java代碼
- git clone ssh://[email protected]:29418/test_project.git
git clone ssh://[email protected]:29418/test_project.git
目前目錄下就會多出一個test目錄,此目錄即是你重伺服器上檢出的項目。
同時shell中會見看到如下提示
Cloning into test_project...
warning: remote HEAD refers to nonexistent ref, unable to checkout.
PS:執行clone的時候是将遠端庫裡所有檔案copy到本地可以了解,copy的時候是根據遠端庫的分支執行的,現在遠端庫是隻有一個空的工程,不存在分支,是以給出警告資訊。
下邊是原作者注解:(commit 一次,就會建立一個新的指針)
//這是因為test項目本身就是個空項目,是以還不存在頭指針。
//git的版本控制方式就像c語言裡面的連結清單模型。每一次送出會産生一個新的節點,而這個新的節點同時還有個指向原來節點的連結。每一個頭指針代表一個分支。頭指針指向的是連結清單的最後一個節點。具體的模型可在progit.pdf中找到。
扯遠了,扯回來。
8.第一次送出。
在剛此檢出的test目錄下建立一個檔案readme.txt
cd test
touch readme.txt
執行:
git add readme.txt
git add readme.txt
或者執行
git stage readme.txt
git stage readme.txt
這兩個指令此處的效果相銅,之是以說“此處”,是因為add指令是個多個功能指令,還有其他含義,而這裡的git stage 相當于svn add
接下來将檔案送出到本地倉庫,先配置git的預設編輯器
Java代碼
- vi ~/.gitconfig
vi ~/.gitconfig
加入如下内容;
Java代碼
- [user]
- name = some_one_
- email = [email protected]
- [core]
- editor = vim
[user]
name = some_one_
email = [email protected]
[core]
editor = vim
并儲存,以後每次送出的資訊中對會帶上以上送出人的描述資訊,并且設定了編輯器為vim,友善編寫log
執行:
git commit readme.txt
git commit readme.txt
在vim中加入log并儲存推出,即完成一次送出,注意此次是送出到本地倉庫,和伺服器沒有關系。
PS:這是你執行檢視分支指令 git branch -a 會發現經過commit之後。本地自動建立一個分支master。之前是沒有的,也就是送出一次之後才會建立。但是這時候仍然不會有遠端分支的資訊。
9.push到遠端倉庫
參考http://www.infoq.com/cn/articles/Gerrit-jenkins-hudson
執行
git push origin master
git push origin master
origin和master可不是什麼關鍵字,他們隻是預設的名稱而已。是克隆的倉庫的預設别名,通過git clone ssh://[email protected]:29418/test_project.git克隆以後,就會産生這個預設名稱,簡單點說就是origin=ssh://[email protected]:29418/test_project.git
而master是本地倉庫的目前分支名稱。通過git checkout branchname可以切換目前工作分支,這個後面再說。
git push origin master此指令即是将到目前分支同步到遠端倉庫中去。不過此指令在gerrit中是會失敗的。後面再說。
結果卻顯示錯誤
- To ssh://[email protected]:29418/test_project.git
- ! [remote rejected] master -> master (prohibited by Gerrit)
- error: failed to push some refs to 'ssh://[email protected]:29418/test_project.git'
...
To ssh://[email protected]:29418/test_project.git
! [remote rejected] master -> master (prohibited by Gerrit)
error: failed to push some refs to 'ssh://[email protected]:29418/test_project.git'
原因是gerrit不允許直接将本地修改同步到遠端倉庫。客戶機必須先push到遠端倉庫的refs/for/*分支上,等待稽核。這也是為什麼我們需要使用gerrit的原因。gerrit本身就是個代碼稽核工具。
接下來更該push的位址:
- git config remote.origin.push refs/heads/*:refs/for/*
git config remote.origin.push refs/heads/*:refs/for/*
此指令實際是更改的是本地倉庫test_project/.git/config檔案。
再次push
git push origin
git push origin
這次不要加master,
結果又出錯
remote: ERROR: You have not registered any email addresses.
解決辦法:
- $ git config --global user.name "yourname"
- $ git config --global user.email [email protected]
- #進入gerirt的安裝目錄
- cd /home/xx/gerrt_sites
- #執行
- $ java -jar bin/gerrit.sh stop
- $ java -jar bin/gerrit.war gsql
- #在新的shell中執行(其實就是修改mysql資料庫表的内容,添加郵件位址)
- gerrit> select * from account_external_ids;
- gerrit> update account_external_ids set email_address = '[email protected]' where account_id = your_acc_id
- #這裡的your_acc_id就是select查詢出來的gerrit_fisrt_username賬戶對應的account_id列中的值
- $ java -jar bin/gerrit.sh start
remote: ERROR: You have not registered any email addresses.
PS:這裡如果gerrit.config和注冊使用者的郵箱都有的話,應該是不會報錯的。我的沒有報錯
但是我的在這裡出現了Missing Change-ID的錯誤,
remote: ERROR: missing Change-Id in commit message footer
remote: Suggestion for commit message:
remote: 12.2 commit
remote:
remote: Change-Id: I05b315ecacd0f2177697e300e7ef75f825c30e62
remote:
remote: Hint: To automatically insert Change-Id, install the hook:
remote: gitdir=$(git rev-parse --git-dir); scp -p -P 29418 [email protected]:hooks/commit-msg ${gitdir}/hooks/
remote:
remote:
這裡可以有兩個方法可以解決:
1:報錯後執行git commit --amend會重新打開送出資訊然胡将上文中Change-Id: I05b315ecacd0f2177697e300e7ef75f825c30e62
複制到檔案尾,重新執行git push origin
2:參考連結4,用鈎子自動添加change-id資訊。這樣做的好處是,一個工程之需要添加一次鈎子,以後就不用再管理了。
執行指令如下: scp -p -P 29418 [email protected]:hooks/commit-msg .git/hooks/ #$name和IP用伺服器ID 為100000的使用者和伺服器IP替換
然後再次執行gerrti commit --amend,退出儲存後再次執行git push origin就可
$ git config --global user.name "yourname"
$ git config --global user.email [email protected]
#進入gerirt的安裝目錄
cd /home/xx/gerrt_sites
#執行
$ java -jar bin/gerrit.sh stop
$ java -jar bin/gerrit.war gsql
#在新的shell中執行(其實就是修改mysql資料庫表的内容,添加郵件位址)
gerrit> select * from account_external_ids;
gerrit> update account_external_ids set email_address = '[email protected]' where account_id = your_acc_id
#這裡的your_acc_id就是select查詢出來的gerrit_fisrt_username賬戶對應的account_id列中的值
$ java -jar bin/gerrit.sh start
再次執行
- git push origin
git push origin
恭喜你,push成功。
10。稽核,驗證、送出。
push成功以後,進入http://192.168.1.101:8080/開打web界面
點選左上的all,再點open,
會看到所有帶稽核的commit
即你在本地push之前執行了多少此commit,這裡就會列出多少個commitid
首先需要為使用者配置權限資訊,在admin--》projects--》All-Projects--》access中點選
edit,然後設定權限,具體設定方法就不描述了,說來話長了。出要是要為refs/heads/*添加
Label Code-Review
Label Verified
Submit
+1和+2權限,并為每個權限添加使用者組。
權限配置好以後,
點選某個commitid,在點選review,然後點選pulish或者submit
順序是先稽核,再驗證,再送出。相信大家多琢磨琢磨就知道怎麼操作了
送出以後,
剛才的git push origin才算真正的送出到了遠端倉庫中。
11.下載下傳。
其他客戶機就可以通過git colne(重複上面的過程)或者git fetch來下載下傳遠端倉庫,下載下傳下來的内容就包含了剛才push上去内容。當然,前提是要為其他開發者建立賬戶并添權重限,這些就不說啦,可以參考git權威指南這本書,有介紹gerrit的内容
這樣即完成了一次代碼的共享過程。