Gerrit 代碼審覈服務器的工作流和原理
6.7 Gerrit 代碼審覈服務器
首先貢獻者的代碼通過 git 命令(或 repo 封裝)推送到 Gerrit 管理下的 Git 版本庫,推送的提交轉化爲一個一個的代碼審覈任務,審覈任務可以通過 refs/changes/<change-id> 下的引用訪問到。代碼審覈者可以通過 Web 界面查看審覈任務、代碼變更,通過 Web 界面做出通過代碼審覈或者打回等決定。測試者也可以通過 refs/changes/<change-id> 引用獲取(fetch)修訂對其進行測試,如果測試通過就可以將該評審任務設置爲校驗通過(verified)。最後經過了審覈和校驗的修訂可以通過 Gerrit 界面中提交動作合併到版本庫對應的分支中。 在 Android 項目的網站的代碼貢獻流程圖更爲詳細的介紹了 Gerrit 代碼審覈服務器的工作流程。代碼審覈工作流
6.7.1 Gerrit 的實現原理
SSH 協議的 Git 服務器 Gerrit 本身基於 SSH 協議實現了一套 Git 服務器,這樣就可以對 Git 數據推送進行更爲精確的控制,爲強制審覈的實現建立了基礎。 Gerrit 提供的 Git 服務的端口並非標準的 22 端口,缺省是 29418 端口。可以訪問 Gerrit 的 Web 界面得到這個端口。對 Android 項目的代碼審覈服務器,訪問https://review.source.android.com/ssh_info 就可以查看到 Git 服務的服務器域名和開放的端口。下面我們用 curl 命令查看網頁的輸出。$ curl -L -k http://review.source.android.com/ssh_info
review.source.android.com 29418
特殊引用 refs/for/<branch-name> 和 refs/changes/nn/<task-id>/m Gerrit 的 Git 服務器,禁止用戶向 refs/heads命名空間下的引用執行推送(除非特別的授權),即不允許用戶直接向分支進行提交。爲了開發者能夠向 Git 服務器提交修訂,Gerrit 的 Git 服務器只允許用戶向特殊的引用 refs/for/<branch-name> 下執行推送,其中 <branch-name> 即爲開發者的工作分支。向 refs/for/<branch-name> 命名空間下推送並不會在其中創建引用,而是爲新的提交分配一個
ID,稱爲 task-id ,併爲該 task-id 的訪問建立如下格式的引用 refs/changes/nn/<task-id>/m ,其中:
- task-id 爲 Gerrit 爲評審任務順序分配的全局唯一的號碼。
- nn 爲 task-id 的後兩位數,位數不足用零補齊。即 nn 爲 task-id 除以 100 的餘數。
- m 爲修訂號,該 task-id 的首次提交修訂號爲 1,如果該修訂被打回,重新提交修訂號會自增。
Android 項目的 16993 號評審
在該界面我們可以看到:- URL 中顯示的評審任務編號爲 16993。
- 該評審任務的 Change-Id 以字母 I 開頭,包含了一個唯一的 40 位 SHA1 哈希。
- 整個評審任務有三個人蔘與,一個人進行了檢查(verify),兩個人進行了代碼審覈。
- 該評審任務的狀態爲已合併:“merged”。
- 該評審任務總共包含兩個補丁集: Patch set 1 和 Patch set 2。
- 補丁集的下載方法是: repo download platform/sdk 16993/2 。
$ git ls-remote ssh://review.source.android.com:29418/platform/sdk refs/changes/93/16993*
5fb1e79b01166f5192f11c5f509cf51f06ab023d refs/changes/93/16993/1
d342ef5b41f07c0202bc26e2bfff745b7c86d5a7 refs/changes/93/16993/2
接下來我們就來介紹一下 Gerrit 服務器的部署和使用方法。