Code Review
Base on Gerrit-3.1.0, Gitlab, Jenkins
Gerrit
Install
- download 安装包 gerrit*.war;
- Strongly recommended 添加系统 用户 gerrit;
# 添加用户
user add gerrit
# 切换用户
su gerrit
- 安装
java -jar gerrit*.war init -d ~/gerrit_site
Attention
- 为方便进行多用户管理 鉴权方式改为 http
[auth]
type = HTTP
- 应用反向代理
Behind reverse proxy [y/N]? y
- canonicalWebUrl 对外访问地址
- 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, 接收通知 等都需要邮箱的支持。
- 登录 -> 进入 Settings -> Email Addresses;
- 输入邮箱地址 xxx@xxx.com, Click “Send VERIFICATION” button 发送验证邮件;
- 接收邮件 访问 验证链接;
- done.
配置ssh 免密登录
避免 Pull, Push 时频繁输入密码。
配置 gerrit 服务端到 gitlab 的 ssh 免密登录
- 为 gitlab 添加同名管理员账户 gerrit;
- 为 gerrit 服务端 系统用户 gerrit 生成 rsa 密钥;
# 为 gerrit 用户生成 ssh 密钥
ssh-keygen -t rsa -C gerrit
- 将公钥添加到 gitlab 系统 gerrit 管理员账户 下;
- done.
登录 gitlab -> 进入 Settings -> SSH keys;
配置 开发端到 gerrit 的 ssh 免密登录
可选。ssh 方式 用。
- 确保开发端具有与 gerrit 注册账户同名的用户, like dev1;
- 在开发端生成 该用户 dev1 的 rsa 密钥;
# 为 dev1 用户生成 ssh 密钥
ssh-keygen -t rsa -C dev1
- 将公钥添加到 gerrit 系统 dev1 账户 下;
登录 gerrit -> 进入 Settings -> SSH keys;
从 gerrit 系统获取 http credentials
可选。http 方式 Pull, Push 时用
- 登录 gerrit -> 进入 Settings -> HTTP Credentials;
- 点击 "GENERATE NEW PASSWORD" Button 获取 password;
-
done.
添加项目
BROWSE -> Repositories -> CREATE NEW;
若使用外部仓库,以 Gitlab 为例。
- 在 gerrit UI 创建仓库 repo-demo(仓库名称须与 gitlab 中的项目名称相同)
- 去 gerrit 仓库目录下删除 repo-demo, 从 Gitlab 克隆同名项目替换之 加上 --bare 参数;
git clone --bare ssh://git@xxx.xxx.xxx/gerrit/repo-demo.git
代码审查流程
- Coder 提交代码,实际代码到了 gerrit 对应仓库的暂存区(staging area), 供 Review 和 Verify;
- Review, Verify -> Passed -> Submit, 代码到了 gerrit 对应仓库的 master 分支;
- 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。
绕过审核直接提交
开启相应人员的 Submit 权限;
-
提交时在相应分支后加上 %submit;
Idea gerrit 插件中 Push 时勾选 Submit Change 选项即可。
参考文档 Gerrit-访问控制
Review& Verified
YOUR -> Changes -> 选择对应的 Change -> REPLY;
添加接收者,抄送者,评论,并对 Code-Review, Verified(若有权限) 打分。
若 Code-Review Verified 对应的分数均符合 Sumbmit 要求,
则 当前Change 状态变为 Ready to submit, 放出 Sumbim 按钮。点击 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
涉及的问题
- send email 失败
安装完之后,记得加入 from 属性!
[sendemail]
smtpServer = smtp.126.com
smtpServerPort = 465
smtpEncryption = SSL
smtpUser = xxx@126.com
from = xxx@126.com
- 开发端 Pull Code 无权限
因 canonicalWebUrl 配置错误导致的 gerrit 仓库地址生成错误,
配置文件检查
- 开发端 Push Code 无权限
push 时的密码是 http credentials, 不是账户密码!
- 开发端 Push 被拒(缺少Change-Id)
去 gerrit 对应的 repository 里(.git/hooks/)拿 commit-msg,
通过 commit-msg 生成 Change-Id, 可借助插件在 commit 时自动生成。
- You don't have permission to verify
为对应项目的 "refs/*" Reference 添加 Label Verified 相关权限,并赋权给相应的 Group
- replication Error
配置文件有误
- 格式不对;
- 目标仓库地址错误;
- 目标仓库地址鉴权信息(ssh/account)错误;
- ...