Gerrit 3.1.0 Code Review (代碼審查)

Code Review

Base on Gerrit-3.1.0, Gitlab, Jenkins

Gerrit

Install

  1. download 安裝包 gerrit*.war;
  2. Strongly recommended 添加系統 用戶 gerrit;
# 添加用戶
user add gerrit
# 切換用戶
su gerrit
  1. 安裝
java -jar gerrit*.war init -d ~/gerrit_site

Attention

  1. 為方便進行多用戶管理 鑒權方式改為 http
[auth]
        type = HTTP
  1. 應用反向代理
Behind reverse proxy           [y/N]? y
  1. canonicalWebUrl 對外訪問地址
  2. listenUrl = proxy-http://*:8081/ http 監聽地址

配置文件

[gerrit]
        basePath = git
        canonicalWebUrl = http://190.168.1.27:8081/
        serverId = ba92321d-bb2c-4c13-9d0c-7a4c2e43fce8
[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 = gerrit
        javaHome = /usr/java/jdk1.8.0_201-amd64/jre
[index]
        type = lucene
[auth]
        type = HTTP
[receive]
        enableSignedPush = true
[sendemail]
        smtpServer = smtp.126.com
        smtpServerPort = 465
        smtpEncryption = SSL
        smtpUser = xxx@126.com
        from = xxx@126.com
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = proxy-http://*:8081/
[cache]
        directory = cache
[plugins]
        # allow install plugin
        allowRemoteAdmin = true

安裝官方參考 Install

設置

Nginx 反向代理配置

server {
     listen 81;
     server_name www.example.com;

     auth_basic "Welcomme to Gerrit Code Review Site!";
     auth_basic_user_file  /home/gerrit/gerrit_site/etc/gerrit.password;

     location / {
        proxy_pass  http://127.0.0.1:8081/;
        #proxy_set_header X-Forwarded-For $remote_addr;
        #proxy_set_header Host $host;
     }
   }
  • proxy_pass 對應 gerrit 配置中 listenUrl屬性, like this, "proxy-http://*:8081/"

添加用戶

htpasswd -cb gerrit_site/etc/gerrit.password gerrit gerrit

Attention:

  • 默認 添加的第一個為 管理員;
  • 只有在登錄之后,用戶信息才會被寫入數據庫。

注冊郵箱

后續 Push, Review, Verify, Submit, 接收通知 等都需要郵箱的支持。

  1. 登錄 -> 進入 Settings -> Email Addresses;
  2. 輸入郵箱地址 xxx@xxx.com, Click “Send VERIFICATION” button 發送驗證郵件;
  3. 接收郵件 訪問 驗證鏈接;
  4. done.
Settings_Gerrit_email png.png

配置ssh 免密登錄

避免 Pull, Push 時頻繁輸入密碼。

配置 gerrit 服務端到 gitlab 的 ssh 免密登錄
  1. 為 gitlab 添加同名管理員賬戶 gerrit;
  2. 為 gerrit 服務端 系統用戶 gerrit 生成 rsa 密鑰;
# 為 gerrit 用戶生成 ssh 密鑰
ssh-keygen -t rsa -C gerrit
  1. 將公鑰添加到 gitlab 系統 gerrit 管理員賬戶 下;
  2. done.

登錄 gitlab -> 進入 Settings -> SSH keys;

gerrit_add_gitlab_pubkey.png
配置 開發端到 gerrit 的 ssh 免密登錄

可選。ssh 方式 用。

  1. 確保開發端具有與 gerrit 注冊賬戶同名的用戶, like dev1;
  2. 在開發端生成 該用戶 dev1 的 rsa 密鑰;
# 為 dev1 用戶生成 ssh 密鑰
ssh-keygen -t rsa -C dev1
  1. 將公鑰添加到 gerrit 系統 dev1 賬戶 下;

登錄 gerrit -> 進入 Settings -> SSH keys;

gerrit_add_ssh_pub_key.png

從 gerrit 系統獲取 http credentials

可選。http 方式 Pull, Push 時用

  1. 登錄 gerrit -> 進入 Settings -> HTTP Credentials;
  2. 點擊 "GENERATE NEW PASSWORD" Button 獲取 password;
  3. done.


    gerrit_http_credentials.png

添加項目

BROWSE -> Repositories -> CREATE NEW;


image.png

若使用外部倉庫,以 Gitlab 為例。

  1. 在 gerrit UI 創建倉庫 repo-demo(倉庫名稱須與 gitlab 中的項目名稱相同)
  2. 去 gerrit 倉庫目錄下刪除 repo-demo, 從 Gitlab 克隆同名項目替換之 加上 --bare 參數;
git clone --bare ssh://git@xxx.xxx.xxx/gerrit/repo-demo.git

代碼審查流程

  1. Coder 提交代碼,實際代碼到了 gerrit 對應倉庫的暫存區(staging area), 供 Review 和 Verify;
  2. Review, Verify -> Passed -> Submit, 代碼到了 gerrit 對應倉庫的 master 分支;
  3. done.

參考文檔 代碼審查流程

開發端 Pull 代碼

倉庫地址在倉庫詳情頁。

Attention: Pull 時選擇 "Clone with commit-msg hook" 方式以便 Commit 時通過 commit-msg (.git/hooks/commit-msg) 生成 Change-Id 。

  • Http 方式;
  • ssh 方式;
gerrit 內建分支

推送之前有必要講一下 推送涉及到的分支

  • refs/for/*
  • refs/*
refs/for/*

這個Reference 是用于 Review 的。

The refs/for/ prefix is used to map the Gerrit concept of "Pushing for Review" to the git protocol. For the git client it looks like every push goes to the same branch, e.g. refs/for/master but in fact for each commit that is pushed to this ref Gerrit creates a new branch under the refs/changes/ namespace. In addition Gerrit creates an open change.

refs/*

配置 Verified 權限的時候 要針對這個 Reference 進行配置。

開發端 Push 代碼

Attention: 確保 commit footer 有 Change-Id 信息。

Change-Id 可從通過 commit-msg (.git/hooks/commit-msg) 生成。

Strongly recommended:
只需確保項目目錄(.git/hooks/)下有 commit-msg 腳本,再配合對應 的 gerrit 插件即可在 Commit 時完成 Change-Id 的自動生成。

Idea, Eclipse 都有相應的 gerrit 插件。

Change-Id

用于標識 commit。

Parent:     65c50d48 (Update Dockerfile base image to 0.1.2)
Author:     xxxx <xxxxx@qq.com>
AuthorDate: 2019-12-12 17:41:51 +0800
Commit:     xxxx <xxxxx@qq.com>
CommitDate: 2019-12-12 17:41:51 +0800

add readme.md;

Change-Id: Iba58fbc6a1a440a9d3e2e48bbd72f898ba3cabc0

開啟權限

進入對應的項目 -> 選擇菜單 "Access" 選項

  • 開啟 Verify 權限

    為 "refs/*" Reference 添加 Label Verified 相關權限,并賦權給相應的 Group, 否則無權限進行 Verify。

    gerrit_verified_config.png
  • 繞過審核直接提交

  1. 開啟相應人員的 Submit 權限;

  2. 提交時在相應分支后加上 %submit;

    Idea gerrit 插件中 Push 時勾選 Submit Change 選項即可。

參考文檔 Gerrit-訪問控制

Review& Verified

YOUR -> Changes -> 選擇對應的 Change -> REPLY;

gerrit_reply.png
  1. 添加接收者,抄送者,評論,并對 Code-Review, Verified(若有權限) 打分。

  2. 若 Code-Review Verified 對應的分數均符合 Sumbmit 要求,
    則 當前Change 狀態變為 Ready to submit, 放出 Sumbim 按鈕。

  3. 點擊 Submit 按鈕 完成 變更往 gerrit 倉庫 master 分支的提交。

Replication

與外部 git 倉庫同步

config path: gerrit_home/etc/replication.config

target 有兩種連接方式:

  • ssh
  • http
[remote "gitlab_domain"]
# http 方式
#  url = https://username:password@gitlab_domain/xxxx/${name}.git
# ssh 方式
  url = ssh://git@gitlab_domain/xxxx/${name}.git
  push = +refs/heads/*:refs/heads/*
  push = +refs/tags/*:refs/tags/*
  push = +refs/changes/*:refs/changes/*
  timtout = 30
  threads = 3

關閉 Gitlab 的提交權限

后續開發端提交代碼走 gerrit, 不再走 gitlab。

Jenkins Gerrit trigger TODO

  • 為 Jenkins 添加 插件 Gerrit trigger
  • 添加 Gerrit Server
  • 為 Job 配置 Gerrit trigger

涉及的問題

  1. send email 失敗

安裝完之后,記得加入 from 屬性!

[sendemail]
        smtpServer = smtp.126.com
        smtpServerPort = 465
        smtpEncryption = SSL
        smtpUser = xxx@126.com
        from = xxx@126.com
  1. 開發端 Pull Code 無權限

因 canonicalWebUrl 配置錯誤導致的 gerrit 倉庫地址生成錯誤,
配置文件檢查

  1. 開發端 Push Code 無權限

push 時的密碼是 http credentials, 不是賬戶密碼!

  1. 開發端 Push 被拒(缺少Change-Id)

去 gerrit 對應的 repository 里(.git/hooks/)拿 commit-msg,
通過 commit-msg 生成 Change-Id, 可借助插件在 commit 時自動生成。

  1. You don't have permission to verify

為對應項目的 "refs/*" Reference 添加 Label Verified 相關權限,并賦權給相應的 Group

  1. replication Error

配置文件有誤

  • 格式不對;
  • 目標倉庫地址錯誤;
  • 目標倉庫地址鑒權信息(ssh/account)錯誤;
  • ...
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。