天天看點

在滴滴雲 DC2 上搭建 Gerrit 代碼審查工具

Gerrit 是一個基于 Web 的代碼評審工具,它基于 Git版本控制系統。Gerrit 旨在提供一個輕量級架構,用于在代碼入庫之前對每個送出進行審閱。更改将上傳到 Gerrit,但實際上并不成為項目的一部分,直到它們被審閱和接受。

Gerrit 是标準開源過程的一個簡單工具,用來支援送出更新檔程式,然後由項目成員在應用到代碼庫之前進行評審。Gerrit 事實上是一個臨時區域,在送出的代碼成為代碼庫的一部分之前,團隊成員可以對其修改進行檢查。

安裝步驟

首先,需要在滴滴雲上購買一台雲主機。

由于安裝 Gerrit 需要 JDK8、MySQL 和 Nginx 反向代理,是以在這裡可以直接選擇一鍵部署鏡像——“Java on CentOS:7.4 內建軟體:JDK 1.8.0/Mariadb(Mysql) 5.5.56/Tomcat 7.0.76/Nginx 1.12.2”,該鏡像已經為使用者預設安裝好了 JDK8、MariaDB 等依賴軟體,無需使用者再花額外的時間和精力去安裝。

雲主機選擇 2核 4G記憶體 40G磁盤的規格。

現在就可以開始 Gerrit 的搭建了。

建庫

Gerrit 預設使用 H2 内嵌資料庫,但是在大型項目組中并不推薦,為了友善後期管理和互動,在安裝的過程中我們使用 MySQL 資料庫。

這裡我們需要建立 Gerrit 使用者和 ReviewDB 資料庫,是以需要以 root 賬号登入:

sudo su //切換到root賬号。
service mariadb stop //停止mariadb服務
mysqld_safe --skip-grant-table & //跳過授權表啟動
mysql -uroot //不用密碼登陸
           

修改 root 賬号密碼:

use mysql;
update user set password=password('newpassword') where user='root';
exit;
           

最後,殺掉 MariaDB 程序并重新開機服務(如果殺不掉則可以直接在滴滴雲控制台重新開機 VM)。

接下來,就可以建立 Gerrit 賬号和資料庫了:

CREATE USER 'gerrit'@'localhost' IDENTIFIED BY 'secret';
CREATE DATABASE reviewdb DEFAULT CHARACTER SET 'utf8';
GRANT ALL ON reviewdb.* TO 'gerrit'@'localhost';
FLUSH PRIVILEGES;
           

安裝 Gerrit

sudo adduser gerrit
sudo su gerrit //切換到gerrit賬号
cd /usr/local/
wget https://gerrit-releases.storage.googleapis.com/gerrit-2.15.5.war
java -jar gerrit-2.15.5.war init -d /usr/local/gerrit
           

現在進行到 Gerrit 的初始化互動界面,除了 SQL Database 選擇 MySQL,其他地方都選擇預設的即可。

同時在初始化過程中如果遇到一些需要的包,會提示你進行下載下傳:

Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2019-02-18 12:58:45,899] [main] INFO com.google.gerrit.server.config.GerritServerConfigProvider : No /home/gerrit/gerrit/etc/gerrit.config; assuming defaults

*** Gerrit Code Review 2.15.5
***

Create '/home/gerrit/gerrit' [Y/n]? y

*** Git Repositories
***

Location of Git repositories [git]: git

*** SQL Database
***

Database server type [h2]: mysql

Gerrit Code Review is not shipped with MySQL Connector/J 5.1.43
** This library is required for your configuration. **
Download and install it now [Y/n]? Y
Downloading https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.43/mysql-connector-java-5.1.43.jar ... OK
           

Gerrit 在一個本地目錄中存儲配置檔案、伺服器 SSH key 和需要管理的 Git 倉庫(site_path),這裡的 site_path 為 ~/gerrit。

初始化完成之後,可以在 ~/gerrit/etc/gerrit.config 中檢視配置檔案,如下所示:

[gerrit]
 basePath = git
 serverId = d2033d5c-7a67-47e0-9c98-22d828728ffc
 canonicalWebUrl = http://localhost/
 ui = polygerrit
 enableGwtUi = true
[database]
 type = mysql
 hostname = localhost
 database = reviewdb
 username = gerrit
[noteDb "changes"]
 disableReviewDb = true
 primaryStorage = note db
 read = true
 sequence = true
 write = true
[index]
 type = LUCENE
[auth]
 type = OPENID
[receive]
 enableSignedPush = false
[sendemail]
 smtpServer = localhost
 smtpUser = libi
[container]
 user = gerrit
 javaHome = /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre
[sshd]
 listenAddress = *:29418
[httpd]
 listenUrl = proxy-http://*:8081/
[cache]
 directory = cache
           

現在就可以通過浏覽器進行登入了 VMIP:8081。

對于 Gerrit 來說,第一個成功登入的使用者具有特殊意義,它會直接被賦予管理者權限。

配置 Nginx 反向代理

為了通過更為強大的 Web 伺服器來對外提供服務,同時友善 Gerrit Server 的 HTTP 使用者認證方式可以正常工作,需要設定Nginx反向代理。

首先更改 Gerrit 配置,使之能夠起到代理的效果;另外,使用反向代理後就可以直接使用 Nginx 的 80 端口通路了,需要把 canonicalWebUrl 中的 8080 去掉,Gerrit Server 監聽的端口也改為 8081。

Gerrit Server 強制要求使用反向代理,通過反向代理伺服器提供的 Authorization 等 HTTP 頭來獲得使用者認證資訊。

最後配置 Nginx,修改 Nginx 的配置檔案 /etc/nginx/nginx.conf,在它的 HTTP 塊中加入如下内容:

server {
    listen 80;
    server_name localhost;

    auth_basic "Welcome to Gerrit Code Review !";
    auth_basic_user_file ~/gerrit/review_site/etc/passwd;

    #charset koi8-r;
    #access_log /var/log/nginx/host.access.log main;

    location / {
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    #error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
           

修改之後,讓 Nginx 重新加載配置檔案,這樣就可以直接通過 Nginx 監聽的 80 端口通路 Gerrit Server 了。

總結

Gerrit 是一種基于 Web 的代碼評審工具,結合 Git 和浏覽器,能夠顯示代碼的每一步變化,使項目組代碼協作、CodeReview 變得更加容易了。

本文在滴滴雲 DC2 一鍵部署鏡像的基礎上,快速搭建了 Gerrit 工具,希望能夠幫助到有此需求的項目團隊。