來到一個新的團隊,開發的代碼被同事覆蓋了。找同事核實,同事卻說根本沒有看到我的代碼。經過一番溝通了解,原來他們的代碼沒有直接在gitlab上操作,而是先提交到gerrit,然后在提交到git。但是代碼拉取的時候,不會直接從gitlab上拉取。所以,我提交到gitlab上的代碼,同事們都沒有拉取到。
新團隊使用的代碼審核工具是gerrit,因為之前一直使用的是gitlab,審題提交也都是使用的gitlab。但是新團隊的小伙伴說他們提交,拉取都到gerrit上,我問:那不用集團的gitlab么?同事說最終代碼還是保存在gitlab上,gerrit的作用就是用來審核的,當時有一個疑問,就是一個代碼審核工具嘛,為什么不直接用gitlab呢,而要多一個工具審核呢?得到的答復是gitlab不好用。因為不了解gerrit,也不好多說,但是心里有個大大的問號。
我的疑惑是,gitlab的代碼審核功能為何不好用?為何一定要嵌入一個新的工具gerrit呢?而這個工具的主體代碼還是在gitlab上,只是起到了審核的作用。所以,我要弄清兩個問題,這篇文章要解決兩個問題
1.Gerrit的用法,優缺點
2.和Gitlab在權限管理上的區別
一、Gerrit的用法
參考文檔:http://39.106.94.54:50000/002-常用基礎服務/05-gerrit服務部署/
1、Gerrit介紹
Gerrit是建立在git版本控制系統之上的,基於web的代碼審核工具。Gerrit是免費的,開源的,有一個可視化界面可供用戶操作。主要解決的問題是代碼審核。他在傳統的源碼工具管理協作流程中強制性引入代碼審核機制,通過人工代碼審核和自動化代碼驗證的方式,不符合要求的代碼屏蔽在代碼庫之外,確保核心代碼多人校驗、多人互備和自動化構建核驗。
2、Gerrit的使用
1)依賴組件
- 安裝git:版本管理工具
- 安裝gerrit:不用說了,我們的今天的主角
- 安裝nginx:啟動gerrit使用
- 安裝java:初始化gerrit使用
- 安裝mysql數據庫:用來保存gerrit中的用戶以及用戶提交的記錄
- 安裝gitlab:用來和gerrit做集成
- 集成jenkins:代碼提交到gerrit時,自動提交到gitlab
2)Gerrit安裝部署
第一步:安裝git
yum -y install git
第三步:安裝和配置數據庫
這一步省略了數據庫安裝步驟,使用現有數據庫就可以。
創建gerritdb數據庫
create database gerritdb CHARACTER SET utf8 COLLATE utf8_general_ci;
給用戶授權,我這里是root用戶, 所以,不用在授權了
grant all on gerritdb.* to 'gerrituser'@'localhost'identified by 'gerritpass';
第二步:安裝gerrit
下載地址:https://www.gerritcodereview.com/
將其拷貝到/root目錄下
在root下創建一個項目gerrit
並且解壓項目
java -jar gerrit-3.5.0.1.war init -d /root/gerrit/
以下為安裝大致內容
切換到root用戶下,然后執行安裝命令, 安裝過程中除數據庫選用mysql(並配置對應gerrit的數據庫和密碼)、開啟方向代理並配置端口外,其他均選默認即可
修改配置文件
[gerrit]
basePath = git
canonicalWebUrl = http://10.211.55.200:8080/
serverId = d69a4326-ef00-45f2-bb84-8c91dd9af221
[database]
type = mysql
hostname = 10.14.181.145
database = gerritdb
username = root
password = 123456
[container]
javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"
javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance"
user = root
javaHome = /usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64
[index]
type = lucene
[auth]
type = HTTP
[receive]
enableSignedPush = false
[sendemail]
smtpServer = localhost
[sshd]
listenAddress = *:29418
[httpd]
listenUrl = http://*:8080/
[cache]
directory = cache
重啟服務
/root/gerrit/bin/gerrit.sh restart
這時在服務器驗證是否啟動成功
curl -GET http://localhost:8080
又返回,提示HTTP server did not provide the username,接下來配置nginx
第四步:安裝nginx
nginx下載地址:http://nginx.org/en/download.html
安裝nginx的依賴
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
解壓nginx文件
tar -zxvf nginx-1.18.0.tar.gz
進入解壓后目錄執行編譯
./configure --with-http_ssl_module
編譯參數有很多,這邊我只增加了SSL模塊,小伙伴可以根據自身情況調整
--prefix=PATH:指定 nginx 的安裝目錄
--conf-path=PATH:指定 nginx.conf 配置文件路徑
--user=NAME:nginx 工作進程的用戶
--with-pcre:開啟 PCRE 正則表達式的支持
--with-http_ssl_module:啟動 SSL 的支持
--with-http_stub_status_module:用於監控 Nginx 的狀態
--with-http-realip_module:允許改變客戶端請求頭中客戶端 IP 地址
--with-file-aio:啟用 File AIO
--add-module=PATH:添加第三方外部模塊
執行完上述命令后,在解壓目錄下,多出一個Makefile文件

執行make命令
make
執行make install 命令
make install
因編譯時未指定安裝目錄,執行make install 命令后看到反饋日志信息,實際安裝目錄為/usr/local/nginx
進入實際安裝目錄,看看,並在其sbin目錄下執行啟動nginx
cd /usr/local/nginx/
./nginx

配置nginx作為代理認證,設置nginx的80端口直接跳轉到gerrit的登錄
server {
listen 80;
server_name localhost;
location / {
#root html;
#index index.html index.htm;
auth_basic "Gerrit Code Review";
auth_basic_user_file /passwords;
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
}
}
auth_basic 是否開啟使用“HTTP基本認證”(HTTP Basic Authentication)協議的用戶名密碼驗證, 默認不開啟
語法: auth_basic string | off;
默認值: auth_basic off;
上下文: http,server,location,limit_exceptauth_basic 值為off表示不開啟HTTP基本認證。
auth_basic指定了字符串,那么字符串會在彈窗中顯示
auth_basic_user_file 指定保存用戶名密碼的文件
語法: auth_basic_user_file file;
默認值: —
上下文: http,server,location,limit_except
接下來,創建保存用戶名密碼的文件
touch /passwords
htpasswd -m /passwords admin
密碼設置為 123456
可以查看文件內容

重啟nginx
訪問nginx服務器,端口是80
http://10.211.55.200/

登錄成功后,會直接跳轉到http://10.211.55.200:8080,如下界面。

我這個是新版本的,創建項目在BROWER下的Repository-->CREATE NEW

上面創建了一個管理員賬號
接下來創建普通用戶賬號
touch /gerrit.password
htpasswd -m /gerrit.password test
密碼為 123456
普通用戶登錄看不到創建項目的按鈕。其他功能都是差不多的
二、對比Gerrit和gitlab
Gerrit其實就是多了一個審核功能,個人覺得沒有必要非要使用gerrit,尤其是小團隊。gitlab的審核功能足夠了。gitlab+gerrit 更是架空了gitlab,還多費一遍事。