您当前的位置: 首页 > 

xiangzhihong8

暂无认证

  • 0浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Gerrit环境与代码Review实战

xiangzhihong8 发布时间:2018-10-09 11:35:33 ,浏览量:0

代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被Delay甚至是忽略,而代码Code Review就能有效的解决这一问题。 Gerrit,一种免费、开放源代码的代码审查软件,支持使用网页界面。利用Gerrit,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。可以通过Gerrit的官方资料来了解更多有关Gerrit的内容。当然,也可以使用下面的链接来体验Gerrit:http://gerrit.aokp.co/#/q/status:open

Gerrit简介

Gerrit是Google为Android系统研发量身定制的一套免费开源的代码审核系统,它在传统的源码管理协作流程中强制性引入代码审核机制,通过人工代码审核和自动化代码验证过程,将不符合要求的代码屏蔽在代码库之外,确保核心代码多人校验、多人互备和自动化构建核验。

传统的代码审核流程示意图如下: 在这里插入图片描述 Gerrit对代码审核做了优化,并新增了各种角色配置,使得代码Review更加灵活,改变后的系统架构如下图。 在这里插入图片描述

环境搭建

本部分内容参考了Gerrit代码审核服务器搭建全过程,Gerrit的环境搭建主要涉及到Java,MySQL和gerrit的安装与配置。

安装配置Java 环境

关于Java相关环境的安装和配置,此处不多做解释,主要是配置安装软件和配置环境变量等。

安装MySQL

MySQL主要是用于记录提交等相关的内容,此处也不做过多的介绍,可以使用如下的命令方式来启动mysql。

$ sudo apt-get install mysql-server
$ sudo apt-get install mysql-client
$ sudo apt-get install libmysqlclient-dev
安装gerrit

gerrit最新的版本为2.15.4,可以通过官网获取最新版本,然后使用如下命令的安装 Gerrit。

$ java -jar gerrit-2.15.4.war init -d review_site

按照提示一步步完成安装即可,有几个按转配置需要特别注意一下。 1, Gerrit 的 Git 仓库的保存地址

Location of Git repositories   [git]: GerritResource

这个选项用于配置 Gerrit 的 Git 仓库的保存地址,上面的配置将创建 /home/gerrit/review_site/GerritResource 目录用于保存 Gerrit 的 Git 仓库。

2,MySQL数据库配置 这里选择 MySQL 作为 Gerrit 的数据库,其它选项全部采用默认配置。对于数据库的配置可以参考下面的内容:


Database server type           [h2]: mysql

Gerrit Code Review is not shipped with MySQL Connector/J 5.1.41
**  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.41/mysql-connector-java-5.1.41.jar ... OK
Checksum mysql-connector-java-5.1.41.jar OK
Server hostname                [localhost]: cloudgame-codereview.com
Server port                    [(mysql default)]: 
Database name                  [reviewdb]: 
Database username              [gerrit]: 
gerrit's password              : 
              confirm password :

对于MySQL,在是以前需要连上 MySQL,为 Gerrit 创建相应的数据库,用户,并为用户授权。

$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 35
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT USER();
+----------------+
| USER()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> create database reviewdb;
Query OK, 1 row affected (0.01 sec)

mysql> CREATE USER 'gerrit'@'localhost' IDENTIFIED BY 'gerrit';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on reviewdb.* to gerrit@localhost identified by 'gerrit';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| reviewdb           |
| sys                |
+--------------------+
8 rows in set (0.01 sec)
配置gerrit

gerrit的配置文件为gerrit.config,可以通过如下的命令打开:

$ vim review_site/etc/gerrit.config

打开这个配置文件后会看到如下的一些配置:

[gerrit]
    basePath = GerritResource
    serverId = 7b8058ff-932a-41ed-a1fa-6ea53dfba8e1
    canonicalWebUrl = http://review.virtcloudgame.com:8080/
        useSSL=false
[database]
    type = mysql
    hostname = review.virtcloudgame.com
    database = reviewdb
    username = gerrit
[index]
    type = LUCENE
[auth]
    type = http
[receive]
    enableSignedPush = false
[sendemail]
    smtpServer = localhost
[container]
    user = gerrit
    javaHome = /usr/lib/jvm/java-8-openjdk-amd64/jre
[sshd]
    listenAddress = *:29418
[download]
        scheme = ssh
        scheme = http
[httpd]
        listenUrl = proxy-http://127.0.0.1:8080/
[cache]
        directory = cache
[plugins]
        allowRemoteAdmin = true

按照如上内容配置完 Gerrit Server 之后,使用如下命令重新启动服务。

$ review_site/bin/gerrit.sh restart
Review使用 配置管理员

对于 Gerrit 来说,第一个成功登录的用户具有特殊意义 —— 它会直接被赋予管理员权限。可以使用下面的命令来设置第一个 Gerrit 用户的帐号和密码。

$ touch ./review_site/etc/passwd
$ htpasswd -b ./review_site/etc/passwd admin admin
Adding password for user admin

htpasswd 命令是 apache2-utils 软件包中的一个工具,如果系统中还没有安装的话,通过如下命令进行安装。

$ sudo apt-get install apache2-utils

使用OpenID登录后,第一个登录的用户为admin,拥有创建dev帐号、review帐号和verify帐号的权限,创建dev、review和verify用户组并添加相应用户,注意设置Username,代码同步时需要用到。 在这里插入图片描述

启动Gerrit

可以通过如下的命令来启动Gerrit 服务器。

$ review_site/bin/gerrit.sh start
Starting Gerrit Code Review: OK

Gerrit Server 启动,需要监听 8080 端口,如果启动失败很有可能是端口号被占用,可以使用如下的命令来查看8080端口的使用情况。

$ sudo lsof -i -P | grep 8080

如果启动成功,此时通过浏览器打开 http://review.virtcloudgame.com:8080 将可以看到如下这样的页面。 在这里插入图片描述

认证方式和反向代理

为了通过更为强大的 Web 服务器来对外提供服务,同时方便 Gerrit Server 的 HTTP 用户认证方式可以正常工作,需要设置反向代理。这里选择通用的nginx作为反向Web代理服务器。 使用反向代理后就可以直接使用 nginx 的 80 端口访问,此时需要把 canonicalWebUrl 中的 8080 去掉,Gerrit Server 监听的端口改为 8081或者其他未使用的端口。

[gerrit]
    basePath = GerritResource
    serverId = 7b8058ff-932a-41ed-a1fa-6ea53dfba8e1
    canonicalWebUrl = http://review.virtcloudgame.com/
        useSSL=false
. . . . . .
[auth]
    type = HTTP
. . . . . .
[httpd]
        listenUrl = proxy-http://127.0.0.1:8081/

修改之后,需要重启 Gerrit Server。接下来,需要配置 nginx,修改 nginx 的配置文件 /etc/nginx/nginx.conf配置文件。

  server {
      listen 80;
      server_name review.virtcloudgame.com;

      location ^~ / {
            auth_basic "Restricted";
            auth_basic_user_file /home/gerrit/review_site/etc/passwd;
        proxy_pass        http://127.0.0.1:8081;
        proxy_set_header  X-Forwarded-For $remote_addr;
        proxy_set_header  Host $host;
      }
    }

其中,auth_basic_user_file 行用户配置用户名和密码文件的保存路径,proxy_pass 行用户设置 Gerrit Server 的地址。修改之后,需要重启 nginx 。

$ sudo nginx -s reload

在这里插入图片描述

Replication 配置

所谓的 replication,是 Gerrit 的一个插件,它可以自动地将 Gerrit Code Review 对它所管理的 Git 仓库创建的任何 changes push 到另外一个系统里,也就是提供 changes 的镜像或热备份功能。

此外,许多现有的项目可能是用另外一套系统来管理 Git 代码仓库的,比如 GitLab,或者 GitHub。需要引入 Gerrit 做 Code Review,同时对接这些已有的 Git 仓库系统时,replication 插件比较有用。

如果通过 SSH 来从 Gerrit 同步代码到 GitLab,需要确保远程系统,也就是 GitLab 服务器的主机密钥已经在 Gerrit 用户的 ~/.ssh/known_hosts 文件中了。所以,在使用Gerrit前需要事先配置SSH Key。可以使用如下的命令来生成SSH Key。

ssh-keygen -t rsa

生成的内容如下:

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/gerrit/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/gerrit/.ssh/id_rsa.
Your public key has been saved in /home/gerrit/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:idkrXgfm7oq+dNsWi9Q9ewDyZuQEYl8icA4ltq8o46U gerrit@admins-B85-HD3-A
The key's randomart image is:
+---[RSA 2048]----+
|  =oo            |
| . *+ o .        |
|  ...+ +         |
|   .  o++.       |
|    . oBSo       |
| . .  .oBo+      |
|+ ....o++o.+     |
|o.o. +.*o.. .    |
| E .+.+++  .     |
+----[SHA256]-----+

然后将 SSK Key 的公钥,即 ~/.ssh/id_rsa.pub 文件的内容,添加到 GitLab 中具有权限的用户的 SSH key 列表里。接下来,创建 一个site_path/etc/replication.config 文件。这是一个 Git 风格的配置文件,它用来控制 replication 插件的设置。这个文件由一个或多个 remote 段组成,每个 remote 段都为一个或多个目标 URIs 提供公共配置设置。

[remote "g.hz.netease.com"]
    url = ssh://git@g.hz.netease.com:22222/cloudgame/${name}.git
    push = +refs/heads/*:refs/heads/*
    push = +refs/tags/*:refs/tags/*
    push = +refs/changes/*:refs/changes/*
    timtout = 30
    threads = 3

如果 ~/.ssh/config 文件存在的话,Gerrit 将在启动的时读取并缓存它,并支持大部分 SSH 配置。主要支持的配置有:

  • Host
  • Hostname
  • User
  • Port
  • IdentityFile
  • PreferredAuthentications
  • StrictHostKeyChecking
Gerrit 创建工程

用前面创建的 admin 用户登录,它将自动获得管理员权限,可以以这个用户创建工程,登录之后,选择 Projects -> Create New Project。 在这里插入图片描述 在 Project Name一栏输入工程的名字,工程名字要与 GitLab 上对应的工程名字相同。在 Gerrit 上创建了工程之后,还需要用 GitLab 上已有的代码替换 Gerrit 中的空工程。

$ cd ~/review_site/GerritResource/
$ rm -rf cloudgame_tools.git/
$ git clone --bare ssh://git@g.hz.netease.com:22222/cloudgame/cloudgame_tool

然后在Gerrit工程的主页,可以找到 clone 工程的命令,直接将工程 clone 到本地。 在这里插入图片描述 如果要提交代码,需要先使用如下命令 push 代码到 Gerrit 进行 Code Review,然后才能提交。

git push 远程地址 本地分支:refs/for/远程分支

例如:

$ git push origin master:refs/for/master
对象计数中: 3, 完成.
Delta compression using up to 8 threads.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 329 bytes | 0 bytes/s, 完成.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1)
remote: Processing changes: new: 1, refs: 1, done    
remote: 
remote: New Changes:
remote:   http://review.virtcloudgame.com/12 Just for test.
remote: 
To ssh://admin@review.virtcloudgame.com:29418/EventServer
 * [new branch]      master -> refs/for/master

在这里插入图片描述 关于Gerrit更多的使用细节,可以参考董霖老师的 Gerrit代码Review高阶实战

参考文档 Gerrit代码审核服务器搭建全过程 Gerrit2安装配置 gerrit使用总结 Gerrit服务器搭建 gerrit2安装和用Nginx设置HTTP基本验证 Gerrit Code Review - Reverse Proxy Gerrit与Gitlab同步配置replication&其他配置 CentOS安装gitlab,gerrit,jenkins并配置ci流程 ssh-keyscan(1) - Linux man page Gerrit Plugins

关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.0768s