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)错误;
  • ...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342