來到一個新的團隊,開發的程式碼被同事覆蓋了。找同事核實,同事卻說根本沒有看到我的程式碼。經過一番溝通了解,原來他們的程式碼沒有直接在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,還多費一遍事。