天天看點

linux : gerrit搭建配置伺服器+git簡單操作+apache代理配置+部分遇到的錯誤及處理

系統: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 ?

  1. ServerName ganshuyu.pbi.com  
  2. <VirtualHost *:8080>        -->用戶端通路:http:192.168.1.101:8080 會轉到gerrit伺服器的位址:http:192.168.1.101:8081上 
  3.     ProxyRequests Off 
  4.     ProxyVia Off 
  5.     ProxyPreserveHost On 
  6. <Proxy *> 
  7.           Order deny,allow 
  8.           Allow from all 
  9.     </Proxy> 
  10.     <Location /login/> 
  11.         AuthType Basic 
  12.         AuthName "Gerrit Code Review" 
  13.         Require valid-user 
  14.         AuthBasicProvider file 
  15.         AuthUserFile /home/gerrit/review_site/etc/passwd #你存放gerrit使用者和密碼的地方
  16.     </Location> 
  17.     ProxyPass / http://192.168.1.101:8081/ 
  18. </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使用者登入:

linux : gerrit搭建配置伺服器+git簡單操作+apache代理配置+部分遇到的錯誤及處理

PS:如果在登陸之後出現ERROR資訊,可以參考錯誤日志,自行網上搜尋。日志在review_site/logs/error_log

第二步:注冊gerrit使用者。(直接原文複制,僅作PS)

注意,第一個注冊的使用者預設成了管理者,是以Gerrit安裝完畢第一件事要做的就是注冊或者登陸,以便初始化管理者賬戶。點選Become連結.

PS:我反正沒找到become連接配接。直接點右上角一個地方會出來settings和sign out,點settings會看到相關資訊。注意ID是10000的才是管理者。ssh的時候要用ID為10000的使用者,即使10001這種可以用好像後期也會各種出錯

 如果你首次登陸的話,是會自動顯示注冊資訊之類。如果沒有就自己點setting對應設定資訊。效果一樣

linux : gerrit搭建配置伺服器+git簡單操作+apache代理配置+部分遇到的錯誤及處理

圖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的時候會用到。系統會發郵件到你的郵箱。确認即可。

linux : gerrit搭建配置伺服器+git簡單操作+apache代理配置+部分遇到的錯誤及處理

圖 2‑2 生成SSH密鑰對

PS:完成之後大概是這個樣子

linux : gerrit搭建配置伺服器+git簡單操作+apache代理配置+部分遇到的錯誤及處理

2.3.6. 測試下gerrit的SSH連接配接

PS:ssh的使用者為第一次注冊的使用者。也就是ID為10000的使用者

linux : gerrit搭建配置伺服器+git簡單操作+apache代理配置+部分遇到的錯誤及處理

圖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代碼 

  1. 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

加入内容如下

  1. Host gerrit_short 
  2.           User gerrit_fisrt_username 
  3.           Port 29418 
  4.           Hostname 192.168.1.101
  5.           IdentityFile ~/.ssh/id_rsa 
Host gerrit_short
          User gerrit_fisrt_username
          Port 29418
          Hostname 127.0.0.1
          IdentityFile ~/.ssh/id_rsa
           

以後執行

  1. 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代碼 

  1. ssh gerrit_short gerrit ls-projects 
ssh gerrit_short gerrit ls-projects
           

将會輸出2個項目名稱

all_project

test_project

一個是内置的,一個是剛才建立的。(使用管理者賬戶才能看到内置的all_project項目)

下面客戶機就可以檢出項目了:

Java代碼 

  1. 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代碼 

  1. vi ~/.gitconfig 
vi ~/.gitconfig
           

加入如下内容;

Java代碼 

  1. [user] 
  2.         name = some_one_ 
  3.         email = [email protected] 
  4. [core] 
  5.         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中是會失敗的。後面再說。

結果卻顯示錯誤

  1. To ssh://[email protected]:29418/test_project.git 
  2. ! [remote rejected] master -> master (prohibited by Gerrit) 
  3. 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的位址:

  1. 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. 

解決辦法:

  1. $ git config --global user.name "yourname" 
  2. $ git config --global user.email [email protected] 
  3. #進入gerirt的安裝目錄 
  4. cd /home/xx/gerrt_sites 
  5. #執行 
  6. $ java -jar bin/gerrit.sh stop 
  7. $ java -jar bin/gerrit.war gsql 
  8. #在新的shell中執行(其實就是修改mysql資料庫表的内容,添加郵件位址) 
  9. gerrit>  select * from account_external_ids; 
  10. gerrit> update account_external_ids set email_address = '[email protected]' where account_id = your_acc_id 
  11. #這裡的your_acc_id就是select查詢出來的gerrit_fisrt_username賬戶對應的account_id列中的值 
  12. $ 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
           

再次執行

  1. 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的内容

  這樣即完成了一次代碼的共享過程。