找回密码
 立即注册
首页 业界区 安全 Gerrit 介绍和使用

Gerrit 介绍和使用

汪玉珂 6 天前
Gerrit 介绍和使用

介绍

Demo:https://gerrit-demo.123u.com/
开源地址:https://github.com/GerritCodeReview/gerrit
Gerrit,一种开放源代码的代码审查软件,提供 Code Review和 Git 仓库的两大功能,但实际上很多项目用的是其他的Git仓库,例如GitLab和GitHub。同一个团队的程序员,可以通过web页面相互审阅彼此修改后的代码,决定是否能够提交,退回或是继续修改。它使用版本控制系统Git作为底层。
理论上Git虽然是一个分布式版本管理系统,不需要中心代码库就能相互同步数据。而在实际的操作过程中,为了方便一个团队的多名开发人员通常需要指定一个确定的代码库用于提交和相互同步代码。所以我们开发团队代码管理一般使用如下结构:
1.png

2.png

在引入Gerrit代码审核机制后,我们的代码提交和同步的方式发生了变化:
3.png

工作流程

首先贡献者的代码通过 git 命令(或 repo 封装)推送到 Gerrit 管理下的 Git 版本库,推送的提交转化为一个一个的代码审核任务,审核任务可以通过 refs/changes/下的引用访问到。代码审核者可以通过 Web 界面查看审核任务、代码变更,通过 Web 界面做出通过代码审核或者打回等决定。测试者也可以通过 refs/changes/引用获取(fetch)修订对其进行测试,如果测试通过就可以将该评审任务设置为校验通过(verified)。最后经过了审核和校验的修订可以通过 Gerrit 界面中提交动作合并到版本库对应的分支中。 在 Android 项目的网站的代码贡献流程图更为详细的介绍了 Gerrit 代码审核服务器的工作流程。
4.png

安装

高可用部署文档:https://gerrit.googlesource.com/plugins/multi-master/+/master/src/main/resources/Documentation/config.md
  1. #  Git  Nginx Java 安装
  2. yum install -y java-1.8.0-openjdk git nginx
  3. java -version
  4. systemctl start nginx && systemctl enable nginx
  5. # 下载
  6. wget https://gerrit-releases.storage.googleapis.com/gerrit-3.6.0.war
  7. # 启动
  8. export GERRIT_SITE=~/gerrit_testsite
  9. java -jar gerrit-3.6.0.war init -d /data/gerrit
复制代码
~/gerrit_testsite/etc/gerrit.config 配置内容
  1. [gerrit]
  2.         basePath = git
  3.         canonicalWebUrl = https://gerrit.com/
  4.         serverId = 5916d32e-428a-40de-8608-c778819f11d8
  5. [container]
  6.         javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"
  7.         javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance"
  8.         user = root
  9.         javaHome = /usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64
  10. [index]
  11.         type = lucene
  12. [auth]
  13.         type = ldap
  14. [receive]
  15.         enableSignedPush = false
  16. [sshd]
  17.         listenAddress = *:29418
  18. [httpd]
  19.         listenUrl = proxy-https://gerrit.com/
  20. [cache]
  21.         directory = cache
  22. [ldap]
  23.         server = LDAP://10.0.150.191/
  24.         username = cn=rootu
  25.         password = ""
  26.         accountBase = OU=users
  27.         groupBase = OU=users
  28. [sendemail]
  29.     enable = true
  30.     smtpServer = smtp.feishu.cn
  31.     smtpServerPort = 465
  32.     smtpEncryption = SSL
  33.     sslVerify = true
  34.     smtpUser = gerrit@qq.com
  35.     smtpPass = ******
  36.     from = gerrit@qq.com
复制代码
Nginx 配置文件:/etc/nginx/conf.d/gerrit.conf
  1. upstream proxy_pool_gerrit {
  2.     server 10.221.0.1:8080 weight=10;
  3.     keepalive 512;
  4. }
  5. server {
  6.     listen 443 ssl;
  7.     ssl_certificate /etc/nginx/ssl/1_123u.com_bundle.crt;
  8.     ssl_certificate_key /etc/nginx/ssl/2_123u.com.key;
  9.     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  10.     server_name gerrit.com;
  11.     ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  12.     ssl_prefer_server_ciphers on;
  13.     access_log /var/log/nginx/gerrit.access.log main;
  14.     location / {
  15.        proxy_set_header X-Real-IP $remote_addr;
  16.        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  17.        proxy_pass http://proxy_pool_gerrit;
  18.     }
  19. }
  20. server {
  21.         listen 80;
  22.         server_name gerrit.com;
  23.                 access_log /var/log/nginx/gerrit.access.log main;
  24.         location / {
  25.                    proxy_set_header X-Real-IP $remote_addr;
  26.                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  27.                    proxy_pass http://10.221.0.1:8080;
  28.                 }
  29. }
复制代码
启动
  1. gerrit_testsite]# ./bin/gerrit.sh restart
复制代码
服务端

新建项目


  • 进入gerrit管理页面
5.png

创建项目


  • Repository name,仓名,必填,可以包含/字符、英文大小写、数字;
  • Rights inherit from,权限集成自,选填,指定已有仓名,默认是All-Projects;
  • Owner,选填,指定项目所有者,指定的所有者即便不是管理员也有Review+2等权限;
  • Create initial empty commit,用于指定是否创建一个空提交,默认为True;
  • Only serve as parent for other repositories,用于指定当前仓仅作为Parent仓,默认为False
6.png

将gitlab项目同步gerrit服务器
  1. [root@test-lwj-150-64 gerrit_testsite]# cd git/
  2. [root@test-lwj-150-64 git]# pwd
  3. /root/gerrit_testsite/git
  4. [root@test-lwj-150-64 git]# rm -rf bubble.git/
  5. [root@test-lwj-150-64 git]# git clone --bare git@git.intra.123u.com:sa/bubble.git
  6. Cloning into bare repository 'bubble.git'...
  7. remote: Counting objects: 63, done.
  8. remote: Compressing objects: 100% (54/54), done.
  9. remote: Total 63 (delta 14), reused 0 (delta 0)
  10. Receiving objects: 100% (63/63), 436.15 KiB | 3.83 MiB/s, done.
  11. Resolving deltas: 100% (14/14), done.
  12. [root@test-lwj-150-64 git]# ls
  13. All-Projects.git  All-Users.git  bubble.git  test_repo.git
  14. [root@test-lwj-150-64 git]# ll bubble.git/
  15. total 20
  16. -rw-r--r-- 1 root root   23 May 31 15:06 HEAD
  17. drwxr-xr-x 2 root root    6 May 31 15:06 branches
  18. -rw-r--r-- 1 root root  128 May 31 15:06 config
  19. -rw-r--r-- 1 root root   73 May 31 15:06 description
  20. drwxr-xr-x 2 root root 4096 May 31 15:06 hooks
  21. drwxr-xr-x 2 root root   21 May 31 15:06 info
  22. drwxr-xr-x 4 root root   30 May 31 15:06 objects
  23. -rw-r--r-- 1 root root  365 May 31 15:06 packed-refs
  24. drwxr-xr-x 4 root root   31 May 31 15:06 refs
复制代码
改动后的内容自动同步Gitlab
  1. # 在gerrit_testsite/etc/replication.config配置添加如下内容;
  2. [remote "bubble"]
  3. projects = bubble
  4. url = git@git.com:sa/bubble.git
  5. push = +refs/heads/*:refs/heads/*
  6. push = +refs/tags/*:refs/tags/*
  7. push = +refs/changes/*:refs/changes/*
  8. threads = 3
复制代码
重启gerrit
  1. [root@test-lwj-150-64 gerrit_testsite]# ./bin/gerrit.sh restart
  2. Stopping Gerrit Code Review: OK
  3. Starting Gerrit Code Review: OK
复制代码


客户端


  • 本地Git用户配置要和Gerrit用户信息一致,使用域账号登入即可
  • 本地公钥已添加到Gerrit用户配置中
  • 本地Git版本不能太低,否则会出现未知的错误
本地公钥已添加到Gerrit用户配置中; 【settings】>【SSH Key】

7.png

8.png

9.png

客户端使用test用户进行拉取代码

注:在初次克隆代码时需要从服务器下载hook脚本用于每次审查自动生成change-id。
  1. [dev@test-lwj-150-64 ~]$ git clone "ssh://test@gerrit-demo.123u.com:29418/bubble" && scp -p -P 29418 test@gerrit-demo.123u.com:hooks/commit-msg "bubble/.git/hooks/"
  2. Cloning into 'bubble'...
  3. remote: Counting objects: 63, done
  4. remote: Finding sources: 100% (63/63)
  5. remote: Total 63 (delta 14), reused 63 (delta 14)
  6. Receiving objects: 100% (63/63), 436.16 KiB | 3.16 MiB/s, done.
  7. Resolving deltas: 100% (14/14), done.
  8. commit-msg                                                100% 1790   666.8KB/s   00:00
  9. [dev@test-lwj-150-64 ~]$ ls
  10. bubble  test_repo
  11. [dev@test-lwj-150-64 ~]$ ls bubble/
  12. conf        dao          go.mod  main.go  README.md  setting  templates
  13. controller  example.png  go.sum  models   routers    static   testlog.txt
  14. [dev@test-lwj-150-64 ~]$
复制代码
提交代码
  1. [dev@test-lwj-150-64 bubble]$ echo "1111111111" >> testlog.txt
  2. [dev@test-lwj-150-64 bubble]$ git add .
  3. [dev@test-lwj-150-64 bubble]$ git commit -m "update tesetlog 1.0.0"
  4. # 如果没有develop分支,则会自动创建
  5. [gerrit@test-lwj-150-64 bubble]$ git push origin HEAD:refs/for/develop
  6. Enumerating objects: 5, done.
  7. Counting objects: 100% (5/5), done.
  8. Delta compression using up to 4 threads
  9. Compressing objects: 100% (2/2), done.
  10. Writing objects: 100% (3/3), 309 bytes | 309.00 KiB/s, done.
  11. Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
  12. remote: Resolving deltas: 100% (1/1)
  13. remote: Processing changes: refs: 1, new: 1, done
  14. remote:
  15. remote: SUCCESS
  16. remote:
  17. remote:   http://10.0.150.64:8080/c/bubble/+/103 update tesetlog 1.0.0 [NEW]
  18. remote:
  19. To ssh://gerrit.com:29418/bubble
  20. * [new reference]   HEAD -> refs/for/develop
复制代码
通过Gerrit Web页面进行review


  • subject:提交的变更
  • branch:合并的目标分支
10.png


  • 默认只有Project Owners和Administrator群组用户拥有“Code-Review”选项+2的权限(提交通过)
  • 普通用户的“Code-Review”选项只能选择+1(审核建议)
  • 多人评审后当总分>=2时,表示审核通过,进入下一步的代码验证流程;否则需要提交者返工修改。
11.png


  • 点击“Summit”按钮才能进入代码库
12.png

13.png

选择Merged,查看合并记录

14.png

15.png

查看是否同步gitlab

16.png

查看触发构建任务

这里使用蓝盾Devops平台作为CICD流程示例,配置了代码库进行监听并自动触发CI任务。
由Gerrit code 代码审核过之后,通过merge request之后会自动同步到Gitlab仓库, 同时会自动触发构建任务
17.png

参考

  • Gerrit Code Review for Git
  • Gerrit 用户指南 · gerrit-user-guide
  • Gerrit项目管理指南 - 走看看

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册