跳转至

05-gerrit服务部署

简单介绍

Gerrit是一个建立在Git版本控制系统之上,基于Web的代码审查工具。

Gerrit是一种免费、开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。

代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被Delay甚至是忽略。在实践中,免费、开放源代码的代码审查软件Gerrit是一个很好的选择。

它在传统的源码管理协作流程中强制性引入代码审核机制,通过人工代码审核和自动化代码验证过程,将不符合要求的代码屏蔽在代码库之外,确保核心代码多人校验、多人互备和自动化构建核验。

**Gerrit适用性:**几乎任何需要正式发布的项目都应当使用Gerrit来进行代码审查,如果Team中有新人,必须使用Gerrit确保代码质量。

Gerrit上进行代码审查,确认入库

Verify:工程里面接入了jenkins自动verify,结果可在上图红框内展示verify结果。

review代码,提交入库。

Gerrit是一款被Android开源项目广泛采用的code review(代码审核)系统。普通用户将gitlab里的项目clone到本地,修改代码后,虽不能直接push到代码中心 ,但是可以通过git review提交到gerrit上进行审核。gerrit相关审核员看到review信息后,判断是否通过,通过即commit提交。然后,gerrit代码会和gitlab完成同步。 grrit的精髓在于不允许直接将本地修改同步到远程仓库。客户机必须先push到远程仓库的refs/for/*分支上,等待审核。 gerrit上也可以对比代码审核提交前后的内容状态。

GitLab 与 Gerrit对比

开发风格

**gitlab**的特色是一我的维系一个分支。 **gerrit**的特色是一个团队维系一个分支。(这里的分支对应一个业务需求)git

权限管理

**gitlab**提供了比较多的选择,能够根据须要建立project,每一个团队能够根据本身的需求管理本身的代码,方式更加的灵活。github

**gerrit**比较单一,并且权限配置比较复杂,每每都是要联系管理员作出修改,每一个团队很难作到对代码的个性化管理。web

代码评审

**gitlab**是以merge request做为一次review,merge request中可能包含多个 commit,若是review不经过也不须要发起另外一次merge request。docker

**gerrit**是以commit做为一次review,因为changeId的存在,能够对一次commit反复的进行review。 若是task划分的粒度够细的话,并不会影响各个团队的review习惯。ss

团队协做

**gitlab**能够选择公开代码,团队间能够看到互相的代码,有利于团队的协做。 **gerrit**因为权限控制问题,只能在权限范围内公开代码。

信息共享

gitlab 能够提供issues,wiki等功能方便开发者与使用者之间的沟通,而且gitlab能够无缝的与一些项目管理工具集成,好比:jira。 gerrit 这个方面比较欠缺。 **gitlab**每一个项目都有本身的wiki,很方便查看。

有关集成

如今比较流行的CI系统,gitlab提供代码查看功能,gerrit保存真正得代码,jenkins经过plugin发布 gerrit上的代码。 这样作没有体现出gitlab的特色,并且因为gerrit的权限问题,不少代码没法放在gitlab上,gitlab沦为代码查看工具,不少功能形同虚设。 有关docker: 考虑到公司将使用docker技术,对于dockerfile存放等问题,gitlab比gerrit支持的更好(由于权限,文件查看的问题)

jenkins提供了plugin,能够经过从gitlab上拉取代码直接部署(已测试成功,CA采用sshkey)。测

gerrit总结

**gerrit**做为谷歌管理安卓项目的版本管理工具仍是有其优势的, 多部门之间的权限隔离,强制review的机制都是其优势, 反观gitlab做为github的开源版,遵循了一套开源的流程,比较符合大多数人得习惯。 因此,经过比较,推荐使用gitlab做为版本管理工具,而且不与gerrit作集成。xm

什么人在使用

https://www.kernel.org/

linux内核团队在使用

https://git.kernel.org/

openstack云计算也在使用

https://docs.openstack.org/contributors/zh_CN/common/setup-gerrit.html

https://review.opendev.org/q/status:open+-is:wip

软件获取

链接:https://pan.baidu.com/s/1vF5F-lj2F-UAR6slJRbtaw?pwd=dn4q 提取码:dn4q
请在 【03-gerrit】目录获取软件包

安装部署

安装gerrit

1.安装git

yum -y install git

2.安装gerrit

下载 gerrit-2.13.11.war gerrit_lib.tar.gz 软件包至 /root目录

安装java(java版本要大于1.7)

yum -y install java

安装数据库

安装数据库mysql

yum -y install mariadb*

启动数据库

systemctl start mariadb 
systemctl enable mariadb 

初始化数据库

[root@mini ~]# mysql_secure_installation
Enter current password for root (enter for none):  # 输入数据库超级管理员root的密码(注意不是系统root的密码),第一次进入还没有设置密码则直接回车

Set root password? [Y/n]  # 设置密码,y

New password:  # 新密码
Re-enter new password:  # 再次输入密码

Remove anonymous users? [Y/n]  # 移除匿名用户, y

Disallow root login remotely? [Y/n]  # 拒绝root远程登录,n,不管y/n,都会拒绝root远程登录

Remove test database and access to it? [Y/n]  # 删除test数据库,y:删除。n:不删除,数据库中会有一个test数据库,一般不需要

Reload privilege tables now? [Y/n]  # 重新加载权限表,y。或者重启服务也许

数据库字符集配置

1)/etc/my.cnf 文件

在 [mysqld] 标签下添加

init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

2)/etc/my.cnf.d/client.cnf 文件

在 [client] 标签下添加

default-character-set=utf8

3)/etc/my.cnf.d/mysql-clients.cnf 文件

在 [mysql] 标签下添加

default-character-set=utf8

4)重启服务

[root@mini ~]# systemctl restart mariadb

5)进入mariadb查看字符集

未配置之前的状态

MariaDB [(none)]> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

MariaDB [(none)]>

配置完毕后的状态

MariaDB [(none)]> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

MariaDB [(none)]>

配置启动

登录数据库

mysql -p123456

创建数据库

create database reviewdb;
grant all privileges on reviewdb.* to "gerrit"@"%" identified by "123123"; 

刷新权限并退出

flush privileges;
exit;

创建gerrit用户

adduser gerrit

切换到gerrit用户

\cp gerrit-2.13.11.war /home/gerrit/
\cp gerrit_lib.tar.gz /home/gerrit/
su - gerrit

初始化环境(要连接外网)

mkdir -p /home/gerrit/code_review
tar xf gerrit_lib.tar.gz -C code_review/
java -jar gerrit-2.13.11.war init -d /home/gerrit/code_review

对接HTTP认证配置

初始化配置

开始进行初始化配置

java -jar gerrit-2.13.11.war init -d /home/gerrit/code_review

ldap认证的初始化配置方式如下:

Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2021-12-30 12:42:36,821] [main] INFO  com.google.gerrit.server.config.GerritServerConfigProvider : No /home/gerrit/code_review/etc/gerrit.config; assuming defaults

*** Gerrit Code Review 2.13.11
*** 

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

*** Git Repositories
*** 

Location of Git repositories   [git]: 

*** SQL Database
*** 

Database server type           [h2]: 

*** User Authentication
*** 

Authentication method          [OPENID/?]: HTTP    需要填写
Enable signed push support     [y/N]? n

*** Review Labels
*** 

Install Verified label         [y/N]? 

*** Email Delivery
*** 

SMTP server hostname           [localhost]: 
SMTP server port               [(default)]: 
SMTP encryption                [NONE/?]: 
SMTP username                  : 

*** Container Process
*** 

Run as                         [gerrit]: 
Java runtime                   [/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre]: 
Copy gerrit-2.13.11.war to /home/gerrit/code_review/bin/gerrit.war [Y/n]? 
Copying gerrit-2.13.11.war to /home/gerrit/code_review/bin/gerrit.war

*** SSH Daemon
*** 

Listen on address              [*]: 
Listen on port                 [29418]: 

Gerrit Code Review is not shipped with Bouncy Castle Crypto SSL v152
  If available, Gerrit can take advantage of features
  in the library, but will also function without it.
Download and install it now [Y/n]? 
Downloading https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.52/bcpkix-jdk15on-1.52.jar ... OK
Checksum bcpkix-jdk15on-1.52.jar OK

Gerrit Code Review is not shipped with Bouncy Castle Crypto Provider v152
** This library is required by Bouncy Castle Crypto SSL v152. **
Download and install it now [Y/n]? 
Downloading https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.52/bcprov-jdk15on-1.52.jar ... OK
Checksum bcprov-jdk15on-1.52.jar OK
Generating SSH host key ... rsa... dsa... done

*** HTTP Daemon
*** 

Behind reverse proxy           [y/N]? 
Use SSL (https://)             [y/N]? 
Listen on address              [*]: 
Listen on port                 [8080]: 
Canonical URL                  [http://linux-node83.domain.local:8080/]: http://192.168.56.83:8080/

*** Cache
*** 


*** Plugins
*** 

Installing plugins.
Install plugin commit-message-length-validator version v2.13.11 [y/N]? y
Installed commit-message-length-validator v2.13.11
Install plugin download-commands version v2.13.11 [y/N]? y
Installed download-commands v2.13.11
Install plugin hooks version v2.13.11 [y/N]? y
Installed hooks v2.13.11
Install plugin replication version v2.13.11 [y/N]? y
Installed replication v2.13.11
Install plugin reviewnotes version v2.13.11 [y/N]? y
Installed reviewnotes v2.13.11
Install plugin singleusergroup version v2.13.11 [y/N]? y
Installed singleusergroup v2.13.11
Initializing plugins.
No plugins found with init steps.

Initialized /home/gerrit/code_review
Executing /home/gerrit/code_review/bin/gerrit.sh start
Starting Gerrit Code Review: 
OK
Waiting for server on 192.168.56.83:8080 ... OK
Opening http://192.168.56.83:8080/#/admin/projects/ ...FAILED
Open Gerrit with a JavaScript capable browser:
  http://192.168.56.83:8080/#/admin/projects/

启动服务

/home/gerrit/code_review/bin/gerrit.sh restart

配置nginx前端认证

开始安装nginx

[root@linux-node83 ~]# yum -y install nginx httpd

配置nginx作为代理认证

[root@linux-node83 ~]# vim /etc/nginx/nginx.conf
        location / {
          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;
        }

启动nginx

systemctl start nginx
systemctl enable nginx

创建管理员用户(Gerrit默认以第一个登陆的用户为超级管理员)

touch /passwords
htpasswd -m /passwords admin

密码设置为 123

打开浏览器输入url: http:192.168.56.83

image-20211230151327437

成功登录的界面

image-20211230151357373

配置httpd前端认证

首先关闭上面的nginx服务

 systemctl stop nginx
 systemctl disable nginx

开始安装httpd服务

yum -y install httpd

配置httpd作为代理认证

[root@linux-node83 ~]# vim /etc/httpd/conf/httpd.conf 
## 在最后一行追加如下内容
<VirtualHost 192.168.56.83:80>
    ServerName 192.168.56.83
    ProxyRequests Off
    ProxyVia Off
    ProxyPreserveHost On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    <Location /login/>
        AuthType Basic
        AuthName "Gerrit Code Review"
        Require valid-user
        AuthUserFile /gerrit.password
    </Location>
    ProxyPass / http://192.168.56.83:8080/
 </VirtualHost>

启动httpd服务

systemctl start httpd
systemctl enable httpd

创建管理员用户(Gerrit默认以第一个登陆的用户为超级管理员)

touch /gerrit.password
htpasswd -m /gerrit.password admin

密码设置为 123456

打开浏览器输入url: http:192.168.56.83 (记得清理一下浏览器的缓存)

image-20211230151834642

认证成功后的界面

image-20211230151856811

管理员是可以创建项目的

image-20211230151953989

普通用户登录

我们也可以创建一个普通用户 test

htpasswd -m /gerrit.password test
密码为 123456

登录普通用户(记得提前清理浏览器缓存)

image-20211230152203066

普通用户登录界面

image-20211230152237735

我们可以看到普通用户是没有创建项目的权限的

对接LDAP认证配置

首先关闭以上的http认证

## root用户下执行
systemctl stop httpd
systemctl disable httpd
## gerrit用户下执行
/home/gerrit/code_review/bin/gerrit.sh stop

## 备份加速包
\cp -rf code_review/lib/ .
## 初始化配置
rm -fr code_review
mkdir -p code_review
\cp -rf lib code_review/

## 删除初始化数据库
mysql -p123456
drop database reviewdb;
create database reviewdb;
grant all privileges on reviewdb.* to "gerrit"@"%" identified by "123123"; 

初始化配置

开始进行初始化配置

java -jar gerrit-2.13.11.war init -d /home/gerrit/code_review

ldap认证的初始化配置方式如下:

Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2021-12-30 12:42:36,821] [main] INFO  com.google.gerrit.server.config.GerritServerConfigProvider : No /home/gerrit/code_review/etc/gerrit.config; assuming defaults

*** Gerrit Code Review 2.13.11
*** 

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

*** Git Repositories
*** 

Location of Git repositories   [git]: 

*** SQL Database
*** 

Database server type           [h2]: 

*** User Authentication
*** 

Authentication method          [OPENID/?]: LDAP
LDAP server                    [ldap://localhost]: ldap://192.168.56.85
LDAP username                  : cn=admin,dc=bkce,dc=com
cn=admin,dc=bkce,dc=com's password :  123456
              confirm password :  123456
Account BaseDN                 [DC=168,DC=56,DC=85]: ou=users,dc=bkce,dc=com
Group BaseDN                   [ou=users,dc=bkce,dc=com]: ou=users,dc=bkce,dc=com
Enable signed push support     [y/N]? n

*** Review Labels
*** 

Install Verified label         [y/N]? 

*** Email Delivery
*** 

SMTP server hostname           [localhost]: 
SMTP server port               [(default)]: 
SMTP encryption                [NONE/?]: 
SMTP username                  : 

*** Container Process
*** 

Run as                         [gerrit]: 
Java runtime                   [/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre]: 
Copy gerrit-2.13.11.war to /home/gerrit/code_review/bin/gerrit.war [Y/n]? 
Copying gerrit-2.13.11.war to /home/gerrit/code_review/bin/gerrit.war

*** SSH Daemon
*** 

Listen on address              [*]: 
Listen on port                 [29418]: 

Gerrit Code Review is not shipped with Bouncy Castle Crypto SSL v152
  If available, Gerrit can take advantage of features
  in the library, but will also function without it.
Download and install it now [Y/n]? 
Downloading https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.52/bcpkix-jdk15on-1.52.jar ... OK
Checksum bcpkix-jdk15on-1.52.jar OK

Gerrit Code Review is not shipped with Bouncy Castle Crypto Provider v152
** This library is required by Bouncy Castle Crypto SSL v152. **
Download and install it now [Y/n]? 
Downloading https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.52/bcprov-jdk15on-1.52.jar ... OK
Checksum bcprov-jdk15on-1.52.jar OK
Generating SSH host key ... rsa... dsa... done

*** HTTP Daemon
*** 

Behind reverse proxy           [y/N]? 
Use SSL (https://)             [y/N]? 
Listen on address              [*]: 
Listen on port                 [8080]: 
Canonical URL                  [http://linux-node83.domain.local:8080/]: http://192.168.56.83:8080/

*** Cache
*** 


*** Plugins
*** 

Installing plugins.
Install plugin commit-message-length-validator version v2.13.11 [y/N]? y
Installed commit-message-length-validator v2.13.11
Install plugin download-commands version v2.13.11 [y/N]? y
Installed download-commands v2.13.11
Install plugin hooks version v2.13.11 [y/N]? y
Installed hooks v2.13.11
Install plugin replication version v2.13.11 [y/N]? y
Installed replication v2.13.11
Install plugin reviewnotes version v2.13.11 [y/N]? y
Installed reviewnotes v2.13.11
Install plugin singleusergroup version v2.13.11 [y/N]? y
Installed singleusergroup v2.13.11
Initializing plugins.
No plugins found with init steps.

Initialized /home/gerrit/code_review
Executing /home/gerrit/code_review/bin/gerrit.sh start
Starting Gerrit Code Review: 
OK
Waiting for server on 192.168.56.83:8080 ... OK
Opening http://192.168.56.83:8080/#/admin/projects/ ...FAILED
Open Gerrit with a JavaScript capable browser:
  http://192.168.56.83:8080/#/admin/projects/

配置ldap前端认证

重启服务器加载配置

/home/gerrit/code_review/bin/gerrit.sh restart

管理员用户登录

打开浏览器:http://192.168.56.83:8080

image-20211230160333105

输入第一个登陆的ldap用户(默认第一个登陆的用户为超级管理员)

image-20211230160416619

登录以后的界面(管理员是可以创建项目的)

image-20211230160500263

普通用户登录

输入第二个登陆的ldap用户(默认第二个登陆的用户为普通用户)

image-20211230160613975

普通用户是无法创建项目的

image-20211230160702234

备份配置文件

cp /home/gerrit/code_review/etc/gerrit.config{,_bak}
ll /home/gerrit/code_review/etc/gerrit.config{,_bak}
-rw-rw-r-- 1 gerrit gerrit 496 Dec 30 10:01 /home/gerrit/code_review/etc/gerrit.config
-rw-rw-r-- 1 gerrit gerrit 496 Dec 30 10:05 /home/gerrit/code_review/etc/gerrit.config_bak

修改配置文件

vim /home/gerrit/code_review/etc/gerrit.config
[gerrit]
        basePath = git
        canonicalWebUrl = http://$ip:$port/gerrit/
[database]
        type = mysql
        hostname = localhost
        database = reviewdb
        username = gerrit
        password = 123123
[auth]
        type = LDAP
        logoutUrl = http://$ip:$port/gerrit/
[ldap]
        server = ldap://$ip
        username = cn=admin,dc=test,dc=com
        password = $ldappassword
        accountBase = ou=users,dc=test,dc=com
        accountFullName = ${cn}
        accountPattern = (uid=${username})
        groupName = cn=openstack,ou=Groups,dc=test,dc=com
[container]
        user = gerrit2
        javaHome = /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.45-35.b13.el6.x86_64/jre
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = http://$ip:$port/gerrit/
[cache]
        directory = cache

解决首次不能登录,二次登录后不是管理员的办法:

删除/创建数据库reviewdb,删除git目录(/home/gerrit/code_review/git),然后再重新初始化一次

mysql -p123456
drop database reviewdb;
create database reviewdb;
grant all privileges on reviewdb.* to "gerrit"@"%" identified by "123123"; 
rm -fr /home/gerrit/code_review/git


java -jar gerrit-2.13.11.war init -d /home/gerrit/code_review 
vim /home/gerrit/code_review/etc/gerrit.config
/home/gerrit/code_review/bin/gerrit.sh restart

Ldap配置文件样板

[gerrit]
        basePath = git
        serverId = 8622b0ba-6ca6-4067-9284-fefff22b5131
        canonicalWebUrl = http://192.168.56.83:8080/
[database]
        type = h2
        database = /home/gerrit/code_review/db/ReviewDB
[auth]
        type = LDAP
[ldap]
        server = ldap://192.168.56.85
        username = cn=admin,dc=bkce,dc=com
        accountBase = ou=users,dc=bkce,dc=com
        groupBase = ou=users,dc=bkce,dc=com
[receive]
        enableSignedPush = false
[sendemail]
        smtpServer = localhost
[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 = http://*:8080/
[cache]
        directory = cache

项目管理

创建一个项目

现在我们使用管理员用户来创建一个demo项目

image-20211230160934644

开始创建项目

image-20211230161043713

项目创建完毕

image-20211230161112833

创建组

创建一个组

image-20211230161240340

组的名称叫public-group

image-20211230161318181

加入组成员

将test02 用户加入到组里

image-20211230161420490

授权组管理项目

image-20211230161600519

普通用户配置

首先使用普通用户登录web

image-20211230161721413

设置普通用户key

image-20211230161821265

gerrit代码审核流程

前面都是准备工作,接下来演示gerrit如何做代码审核的

a、client server( 192.168.56.83)的git初始配置

配置用户名和邮箱

git config --global user.name "test02"
git config --global user.email "zhaofei@qq.com"

普通用户提交代码

用账户test02提交代码

拉取代码

image-20211230163410689

复制上面的命令拉取代码

git clone ssh://test02@192.168.56.83:29418/demo && scp -p -P 29418 test02@192.168.56.83:hooks/commit-msg demo/.git/hooks/

注意:步骤b一定选Clone with commit-msg hook下面的地址来clone,否则在客户端使用git push

命令提交代码时会报错。如果不需要向gerrit服务器提交代码,那么你只需使用

git clone ssh://user2@172.16.206.133:29418/Project2

或者git clone http://user2@172.16.206.133:8081/a/Project2

创建一个文件,并提交到gerrit服务器端

[root@linux-node83 ~]# cd demo
[root@linux-node83 demo]# echo "hello world" > test.sh

用git add 和git commit命令将文件保存到git仓库中

[root@linux-node83 demo]# git add test.sh 
[root@linux-node83 demo]# git commit -m "创建了test.sh文件"
[master 6cf156d] 创建了test.sh文件
 1 file changed, 1 insertion(+)
 create mode 100644 test.sh

用git push命令将代码从本地传到gerrit服务器对象项目下的master分支

[root@linux-node83 demo]# git push origin master:refs/for/master
Counting objects: 4, done.
Writing objects: 100% (3/3), 306 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Processing changes: new: 1, refs: 1, done    
remote: 
remote: New Changes:
remote:   http://192.168.56.83:8080/1 创建了test.sh文件
remote: 
To ssh://test02@192.168.56.83:29418/demo
 * [new branch]      master -> refs/for/master

origin:远程仓库的名称,用git remote 可以查看所有的远程仓库名称

[root@linux-node83 demo]#  git remote 
origin

表示将代码从本地的master分支传到远端的master分支,固定格式就是这样

管理员代码审核

Test01账号登录Gerrit Web UI,邀请管理员admin来做code review。

注意:之前忘记截图了,所以下图不是原图,但是基本上都一样,只有Owner和Project不对而已。

Add:添加指定用户来进行Code Review

Cherry Pick:切换分支,当执行push操作之后如果发现分支不对,需要切换,可以在这里点击Cherry Pick按钮进行分支切换操作。

Abandon:撤销push操作,当push之后,如果发现代码有问题,需要修改,可以点击这个按钮,然后修改代码,修改完成后,再次push,然后登陆Gerrit Web UI,会有一个Restore按钮,这时候点击Restore,就可以重新申请Code Review。

image-20211230164142031

管理员可以进行代码的审核

image-20211230170014015

审核成功的代码,就可以进行提交合并

image-20211230170050401

合并成功后会在merged里面显示

image-20211230170119140

乱码说明

关于以上用户登录时显示的信息为乱码的情况,为mysql数据库字符集的问题,可以在一开始创建数据库的时候指定默认字符集为utf-8即可解决乱码问题。

其他技巧

统计gerrit代码工具脚本

vim statistics_code_data.py

#!-*- coding:utf-8 -*-
"""
使用方法
1、配置gerrit_url,admin_user,admin_pass,最好是管理员,不然统计会出现不全
2、将要统计的用户添加到users中
3、指定时间段after, before
"""
import requests
import json
import os

gerrit_url = 'https://172.18.211.200:8081/gerrit/'
admin_user = 'admin'
admin_pass = ''

users = [
    {"username": "liuxichao","realname": "刘希超"},
    {"username": "zhangshuaiyi","realname": "张帅依"},
]

def get_cookies(username, password):
    global gerrit_url
    req = requests.Session()
    login_url = gerrit_url + \
        "login/?username=" + username + "&password=" + password
    req.post(login_url, verify=False)
    cookie = "GerritAccount=" + \
        req.cookies._cookies.values()[0]["/gerrit"]["GerritAccount"].value
    return cookie

def search(q, after=None, before=None):
    global gerrit_url, admin_user, admin_pass
    headers = {
        "Cookie": get_cookies(admin_user, admin_pass)
    }
    if after:
        q = q + "+" + after
    if before:
        q = q + "+" + before
    url = gerrit_url + 'changes/?q=' + q + '&n=0&O=81'
    data = requests.get(url, headers=headers, verify=False)
    content = data._content
    try:
        result = json.loads(content)
    except:
        try:
            #由于返回的data第一行存在4个多余的字符,导致无法loads
            #因此去掉前面4个字符在loads
            result = json.loads(content[4:])
        except:
            result = []
    return result

def statistics_merged_patch(username, after=None, before=None):
    q = 'status:merged+owner:' + username
    result = search(q, after=after, before=before)
    megerd_num = len(result)
    locs_add = 0
    locs_del = 0
    for r in result:
        locs_add = locs_add + r.get("insertions", 0)
        locs_del = locs_del + r.get("deletions", 0)
    return megerd_num, locs_add, locs_del

def statistics_review_num(username, after=None, before=None):
    q = 'reviewer:' + username + '+-owner:' + username
    return len(search(q, after=after, before=before))

def convert_str_to_gbk(convert_str):
    if convert_str:
        return convert_str.decode('utf-8').encode('gb2312')

def ouput_to_csv(username, content=None):
    if not content:
        return
    file_name = "statistics_code_data.csv"
    if not os.path.exists(file_name):
        with open(file_name, "w+") as fd:
            first_line = "用户名,姓名,patch合并数量,代码增加行数,代码删除行数,review次数\n"
            fd.write(convert_str_to_gbk(first_line))

    with open(file_name, "a") as fd:
        fd.writelines(convert_str_to_gbk(",".join(content) + "\n"))


#统计一段时间内的数据
def statistics_data(user, after=None, before=None):
    megerd_num, locs_add, locs_del = \
        statistics_merged_patch(user["username"], after=after, before=before)
    review_num = statistics_review_num(user["username"], after=after, before=before)
    write_list = [user["username"], str(user["realname"]), str(megerd_num),
                  str(locs_add), str(locs_del), str(review_num)]
    ouput_to_csv(user["username"], write_list)

after = "after:2017-1-1"
before = "before:2018-1-1"
before = None

for user in users:
    statistics_data(user, after=after, before=before)

Gerrit和Gitlab服务器的集成

https://www.cnblogs.com/yinzhengjie/p/11057383.html

参考博文

Gerrit和OpenLDAP服务器集成

https://www.cnblogs.com/yinzhengjie/p/11029559.html

Gerrit配置--用户配置

https://www.cnblogs.com/jiangzhaowei/p/8005328.html