環境:
gerrit server :176.23.47.118
管理員機器用戶名: su admin
gerrit 的管理員賬號:admin
gerrit 工作流程
gerrit工作流程的圖:
使用過git的同學,都知道,當我們git add --> git commit --> git push
之后,你的代碼會被直接提交到repo,也就是代碼倉庫中,就是圖中橘紅色箭頭指示的那樣。
那么gerrit就是上圖中的那只鳥,普通成員的代碼是被先push到gerrit服務器上,然后由代碼審核人員,就是左上角的integrator在web頁面進行代碼的審核(review),可以單人審核,也可以邀請其他成員一同審核,當代碼審核通過(approve)之后,這次代碼才會被提交(submit)到代碼倉庫(repo)中去。
無論有新的代碼提交待審核,代碼審核通過或被拒絕,代碼提交者(Contributor)和所有的相關代碼審核人員(Integrator)都會收到郵件提醒。
gerrit還有自動測試的功能,和主線有沖突或者測試不通過的代碼,是會被直接拒絕掉的,這個功能似乎就是右下角那個老頭(Jenkins)的任務。
整個流程就是這樣。 在使用過程中,有兩點需要特別注意下:
- 當進行commit時,必須要生成一個Change-Id,否則,push到gerrit服務器時,會收到一個錯誤提醒。
-
提交者不能直接把代碼推到遠程的master主線(或者其他遠程分支)上去。這樣就相當於越過了gerrit了。 gerrit必須依賴於一個
refs/for/*
的分支。假如我們遠程只有一個master主線,那么只有當你的代碼被提交到
refs/for/master
分支時,gerrit才會知道,我收到了一個需要審核的代碼推送,需要通知審核員來審核代碼了。
當審核通過之后,gerrit會自動將這條分支合並到master主線上,然后郵件通知相關成員,master分支有更新,需要的成員再去pull就好了。而且這條refs/for/master
分支,是透明的,也就是說普通成員其實是不需要知道這條線的,如果你正確配置了sourceTree,你也應該是看不到這條線的。
這兩點很重要!!這兩點很重要!!這兩點很重要!!
為管理員admin配置SSH Public Keys:
第一個Gerrit 賬戶自動成為權限最高的管理員,因為Gerrit 安裝完畢后第一件事就是立即注冊或者登錄,以便初始化管理員賬號
這里需要把你的公鑰鑰匙拷貝出來,然后粘貼在對話中
生成公私鑰對
首先切換到 admin用戶下 ,在命令行中輸入:
[root@localhost home]# su admin
[admin@localhost home]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/admin/.ssh/id_rsa):
Created directory '/home/admin/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/admin/.ssh/id_rsa.
Your public key has been saved in /home/admin/.ssh/id_rsa.pub.
找到公鑰鑰匙:
默認公私鑰的是放置在~/.ssh
目錄下的,默認的名稱是id_rsa
和id_rsa.pub
。其中.pub
文件就是公鑰,私鑰你自己需要保存好。我們要做的,就是把公鑰的內容拷貝出來,然后粘貼到頁面上去。注意拷貝時,要從RSA開始拷貝,如果格式不對,頁面上會有提示。拷貝完成之后如下圖所示:
測試SSH key是否提交成功,在client 服務器上執行以下命令:
#ssh -p 29418 admin@ip地址
ps:一定要切換到你生成 公鑰私鑰的用戶下 gerrit, 29418為gerrit上SSH服務器監聽的端口,admin為登錄的gerrit賬號(admin 賬號為我的管理員賬號),並且該賬號已經登錄了gerrit服務器,而且公鑰已經上傳。
176.23.47.118為gerrit服務器的IP
[root@localhost .ssh]# su gerrit [gerrit@localhost .ssh]$ ssh -p 29418 admin@176.23.47.118 **** Welcome to Gerrit Code Review **** Hi admin, you have successfully connected over SSH. Unfortunately, interactive shells are disabled. To clone a hosted Git repository, use: git clone ssh://admin@localhost:29418/REPOSITORY_NAME.git
在gerrit服務器上創建普通用戶:
Linux下的用戶名須和管理員給的Gerrit賬號名相同,如果沒有,請添加新用戶:
Gerrit服務器使用的是HTTP認證類型,並用nginx做反向代理,創建用戶使用以下命令:
[root@localhost .ssh]# htpasswd -m /home/gerrit/gerrit.password tana New password: Re-type new password: Updating password for user tana
創建普通用戶 tana ,在gerrit網頁登錄進去,按照配置admin的路徑 給tana用戶配置ssh keys。
[tana@localhost ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/tana/.ssh/id_rsa): Created directory '/home/tana/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/tana/.ssh/id_rsa. Your public key has been saved in /home/tana/.ssh/id_rsa.pub.
配置成功后下圖所示:
管理員訪問SSH的管理接口
在gerrit個人配置界面中設置了公鑰之后,就可以連接Gerrit的ssh服務器執行命令。注意遠程gerrit服務器的端口不要被防火牆攔截,gerrit的ssh服務器使用的特殊的端口,默認是29418,任何用戶都可以通過 ssh連接執行 ls-projects 命令查看項目列表
[tana@localhost root]$ ssh -p 29418 176.23.47.118 gerrit ls-projects All-Projects All-Users projec1 test3
通過ssh 創建新項目:
管理員admin 可以使用命令行創建新項目 test3:
[admin@localhost root]$ ssh -p 29418 176.23.47.118 gerrit create-project test3
創建group並創建一個project
圖片是gerrit默認的分組,之后我們還可以建立新的分組,加入新的成員
注意,只有管理員組的用戶才能創建group和Project
創建一個group
登錄Gerrit管理員賬號admin,創建一個新的組為test1。並將tana賬號加入該組
創建一個project
創建一個project1 :BROWSE->Repositores->CREATE NEW
BROWSE->Repositores->Access->ADD REFERENCE->ADD
tana用戶clone工程
clone工程到本地
切換到tana用戶上,下拉剛剛創建的 projec1工程:
執行命令:#git clone ssh://tana@176.23.47.118:29418/projec1.git
[tana@localhost ~]$ git clone "ssh://tana@172.23.57.119:29418/project5" && scp -p -P 29418 tana@172.23.57.119:hooks/commit-msg "project5/.git/hooks/"
Initialized empty Git repository in /home/tana/project5/.git/
remote: Counting objects: 2, done
remote: Finding sources: 100% (2/2)
remote: Total 2 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (2/2), done.
commit-msg 100% 1791 1.8KB/s 00:00
[tana@localhost ~]$ ls
project5
進入到/home/tana/中,我們發現多了一個 projec1的文件夾。這個文件夾就是我們下拉下來的projec1 工程了
下面新建一個 test.md文件 ,嘗試着提交:
提交
首先我們通過下面兩個命令首先commit到本地倉庫:
[tana@localhost ~]$ cd /home/tana/projec1/ [tana@localhost projec1]$ vim test.md just for test "test.md" [New] 1L, 14C written [tana@localhost projec1]$ git add test.md [tana@localhost projec1]$ git commit
我們把這次提交命名為 test 20190419 commit
然后我們通過git push
命令來推送,發送推送失敗了,錯誤如下:
我們設置了push命令之后,重新進行push,結果報錯了。。這次是報 郵箱沒有注冊,下面我們來配置郵箱。
配置郵箱
修改gerrit.config配置文件
注意: smtppass是郵箱的授權碼密碼,不是你的登錄密碼,授權碼需要在郵件網頁端登錄設置,允許第三方客戶端登錄
from 是發送注冊郵箱的
用戶綁定郵箱
登錄到 gerrit上面去,settings->Email Addresses 去設置注冊郵箱:
輸入你的郵箱地址,注意每個用戶的郵箱地址都是唯一的,不能多個用戶用同一個郵箱注冊
然后登錄郵箱,點擊鏈接進行注冊:
點擊鏈接注冊成功以后,我們可以在 settings->Profile 看到有郵箱地址了
配置commit 的名稱和email
在commit的時候,發現提交者的名稱和email都是錯誤的,我們需要先配置成我們當前的tana用戶,以及對應的email
[tana@localhost projec1]$ git config user.name tana [tana@localhost projec1]$ git config user.email ytyt@cypress.com
通過git config --list
來查看一下當前git倉庫的配置,發現已經把用戶名和密碼正確設置了。
然后我們通過git push
命令來推送:
Gerrit拒絕了我們直接提交到master的推送!
這就是我們在文章開頭提到的問題,我們需要push到refs/for/master那條線上!!
我們在命令行寫入下面的命令:
git config remote.origin.push refs/heads/*:refs/for/*
這行命令的意思是,當執行push
命令時,將會推送到refs/for/當前head所在的分支
上。
然后再執行git push命令:
這次的錯誤是:
這個是提到的第2個問題,commit一定要有Change-Id
然后我們看到了命令行中給了我們提示,我們可以從hooks文件中拷貝commit-msg文件下來,這樣commit時,會自動幫我們生成Change-Id
.
我們在命令行寫入下面的命令:
我們可以看一下 git rev-parse --git-dir
就是指向的當前git配置的文件,就是.git
文件夾
所以我們直接用scp命令從gerrit服務器上拉取當前用戶的hooks文件。
注意這個命令要在project5文件夾上一層目錄做:/home/tana
[tana@localhost ~]$ scp -p -P 29418 tana@172.23.57.119:hooks/commit-msg "project5/.git/hooks/"
commit-msg 100% 1791 1.8KB/s 00:00
然后后我們重新push發現一樣的錯誤,因為我們還停留在上次commit,上次的commit是沒有生成Change-Id
的! 但是我們回退一下,然后重新提交。
回退命令是先用git log
找到上一次的commit id, 然后用git reset --hard 找到的id
命令回退,還是不行,不知道什么原因,我把整個工程刪除,直接在 clone的時候就拉取當前用戶的hooks文件。