如果转载,还请注明我文章的链接,书写不易,互相珍重,期待技术交流
Gerrit简单说明:
其是基于Git的,采用web界面的代码审查工具,主要应用于开发与git仓库之间,来限制直接 提交代码到git公共仓库,用于代码的人工审核和ci任务触发的验证。
其实gerrit自身是有仓库功能的,但是大部分应用场景,都是使用其他的仓库,比如gitlab这类,然后用gerrit做个审核工具,当gerrit和gitlab集成后,尽量的不要直接提交代码到gitlab。
其实这个工具,很多企业应该都是用不到的,所以,,大家有需要就看,没需要就略过吧。不过这篇笔记会讲与gitlab的集成,有兴趣的话,可以看看。
系统环境:centos7.8
JAVA:JRE11
Gerrit:3.2.5
Yu
2020年12月
本节目录
一、环境准备
二、环境配置
三、安装gerrit
四、配置并集成gitweb
五、集成gitlab
六、gerrit的基本使用与管理
主机信息说明:
IP | 主机名 | 作用 | 备注 |
---|---|---|---|
192.168.80.151 | node1 | gitlab | 访问url:http://local.gitlab.com |
192.168.80.152 | node2 | sonarqube | 访问url:http://local.sonar.com |
192.168.80.153 | node3 | gerrit | 访问url:http://local.gerrit.com |
192.168.80.154 | node4 | email(后续jenkins也在这台) | email域:local.cicdmail.com |
一定要注意,这里的gerrit是在email服务搭建 (参见《番外篇之局域网邮件服务搭建》) 完成后开始的,因为gerrit要求邮箱验证,但是我不想使用真实的邮箱,所以采用了局域网搭建postfix的方式。
关闭firewalld,selinux,NetworkManager
修改IP,hostname 配置 /etc/hosts
修改好时间
具体步骤不再赘述
[root@node* ~]# vim /etc/hosts
192.168.80.151 node1
192.168.80.152 node2
192.168.80.153 node3
192.168.80.154 node4
192.168.80.151 local.gitlab.com
192.168.80.152 local.sonar.com
192.168.80.153 local.gerrit.com
192.168.80.154 local.cicdmail.com
根据官网说明,3.2.5.1版本(截止20年11月最新稳定版),最高支持java版本为13以下
To run the Gerrit service, the following requirement must be met on the host:
JRE, versions 1.8 or 11 Download
Gerrit is not yet compatible with Java 13 or newer at this time.
我这里采用官方推荐的版本两个版本之一,JRE 11
下载地址:
http://jdk.java.net/java-se-ri/11
下载地址:
https://www.gerritcodereview.com/
下载插件可以去https://gerrit-ci.gerritforge.com/view/Plugins-stable-3.2/
一个是系统源,另外需要配置一下epel源(等下装nginx, git-review等)
当然这一步做不做,怎么做,都随意。这里仅做演示
系统源保持默认,
配置一下epel源
[root@node3 ~]# vim /etc/yum.repos.d/epel.repo
[epel]
name=tuna_epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
enabled=1
gpgcheck=0
git-review 是facebook开源的,git-review为git新增了一个很方便的代码review途径,安装在这里的目的是借用git-review帮我们完成push代码到gerrit。
gitweb 提供了git版本库的图形化web浏览功能。
[root@node3 ~]# yum install -y gitweb git-review
[root@node3 ~]# git config --global user.name "ops01"
[root@node3 ~]# git config --global user.email "[email protected]"
[root@node3 ~]# git config --global color.ui true
查看配置
[root@node3 ~]# git config --list
user.name=ops01
user.email=[email protected]
color.ui=true
[root@node3 ~]#
还需要配置一下字符集,以解决Gerrit中文编码支持不好的问题
[root@node3 ~]# git config --global core.quotepath false
[root@node3 ~]# git config --global i18n.logoutputencoding utf8
[root@node3 ~]# git config --global i18n.commitencoding utf8
[root@node3 ~]# git config --list
user.name=ops01
user.email=[email protected]
color.ui=true
core.quotepath=false
i18n.logoutputencoding=utf8
i18n.commitencoding=utf8
将前面下载的jdk11上传至服务器
[root@node3 ~]# ls openjdk-11+28_linux-x64_bin.tar.gz
openjdk-11+28_linux-x64_bin.tar.gz
解压:
[root@node3 ~]# tar xf openjdk-11+28_linux-x64_bin.tar.gz -C /usr/local/
配置环境变量
[root@node3 jdk-11]# vi /etc/profile
# jre11的环境变量
export JAVA_HOME=/usr/local/jdk-11
export JRE_HOME=\$JAVA_HOME/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
生效环境变量
[root@node3 jdk-11]# source /etc/profile
验证版本
[root@node3 jdk-11]# java --version
openjdk 11 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
用于代理
[root@node3 ~]# yum -y install nginx
启动nginx
[root@node3 ~]# systemctl start nginx && systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@node3 ~]# ss -naltp|grep 80
LISTEN 0 128 *:80 *:* users:(("nginx",pid=66827,fd=6),("nginx",pid=66826,fd=6),("nginx",pid=66825,fd=6))
LISTEN 0 128 [::]:80 [::]:* users:(("nginx",pid=66827,fd=7),("nginx",pid=66826,fd=7),("nginx",pid=66825,fd=7))
该用户用于安装及启动Gerrit
[root@node3 ~]# useradd gerrit
[root@node3 ~]# passwd gerrit
Changing password for user gerrit.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@node3 ~]# ls /home/gerrit/
gerrit-3.2.5.1.war
先使用root用户创建安装目录
[root@node3 jdk-11]# mkdir /usr/local/gerrit
[root@node3 jdk-11]# chown gerrit. /usr/local/gerrit
切换至gerrit用户完成初始化
[root@node3 jdk-11]# su - gerrit
初始化
需要操作的项目较多,注意我这里写的解释
[gerrit@node3 ~]$ java -jar gerrit-3.2.5.1.war init -d /usr/local/gerrit
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.assistedinject.FactoryProvider2 (file:/home/gerrit/.gerritcodereview/tmp/gerrit_12210446950063492415_app/guice-assistedinject-4.2.3.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of com.google.inject.assistedinject.FactoryProvider2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2020-11-30 17:18:50,665] [main] INFO com.google.gerrit.server.config.GerritServerConfigProvider : No /usr/local/gerrit/etc/gerrit.config; assuming defaults
*** Gerrit Code Review 3.2.5.1
***
Create '/usr/local/gerrit' [Y/n]? y ## 是否创建该文件
*** Git Repositories
***
Location of Git repositories [git]: /usr/local/gerrit ## 指定git存储目录
*** Index
***
Type [lucene]: ## 默认
*** User Authentication
***
Authentication method [openid/?]: HTTP ##选择HTTP
Get username from custom HTTP header [y/N]? n ##是否从自定义HTTP头获取用户名,选否
SSO logout URL : ## 默认
Enable signed push support [y/N]? y ## 签名推送
*** Review Labels
***
Install Verified label [y/N]? ## 安装以验证标签
*** Email Delivery
***
SMTP server hostname [localhost]: local.cicdmail.com ## ## 自动发送邮件的smtp服务器
SMTP server port [(default)]: 25 ## ssl协议端口号 465/994,非ssl是25号端口
SMTP encryption [none/?]: ## 如果上面写了465/994端口号,这里就写 SSL,我们邮箱自己搭的,这里默认none就好
SMTP username [gerrit]: [email protected] ## 定义自动发送邮件的邮箱地址
[email protected]'s password : ## 授权码或者密码
confirm password : ## 二次输入
*** Container Process
***
Run as [gerrit]: ## 指定运行用户
Java runtime [/usr/local/jdk-11]: ## java路径,如果不对,自己写
Copy gerrit-3.2.5.1.war to /usr/local/gerrit/bin/gerrit.war [Y/n]? y ## 是否拷贝gerrit软件包
Copying gerrit-3.2.5.1.war to /usr/local/gerrit/bin/gerrit.war
*** SSH Daemon
***
Listen on address [*]: ## ssh监听地址
Listen on port [29418]: ## 监听端口
Generating SSH host key ... rsa... ed25519... ecdsa 256... ecdsa 384... ecdsa 521... done
*** HTTP Daemon
***
Behind reverse proxy [y/N]? y ## 使用反向代理
Proxy uses SSL (https://) [y/N]? n ## 不用ssl
Subdirectory on proxy server [/]: ## 代理服务器子目录
Listen on address [*]: local.gerrit.com ## gerrit的监听地址
Listen on port [8080]: ## 监听端口
Canonical URL [http://local.gerrit.com:8080/]: ## url
*** Cache
***
*** Plugins
***
Installing plugins.
Install plugin codemirror-editor version v3.2.5.1 [y/N]? y ## 下面的都是问装不装插件,全 y 就行了
Installed codemirror-editor v3.2.5.1
Install plugin commit-message-length-validator version v3.2.5.1 [y/N]? y
Installed commit-message-length-validator v3.2.5.1
Install plugin delete-project version v3.2.5.1 [y/N]? y
Installed delete-project v3.2.5.1
Install plugin download-commands version v3.2.5.1 [y/N]? y
Installed download-commands v3.2.5.1
Install plugin gitiles version v3.2.5.1 [y/N]? y
Installed gitiles v3.2.5.1
Install plugin hooks version v3.2.5.1 [y/N]? y
Installed hooks v3.2.5.1
Install plugin plugin-manager version v3.2.5.1 [y/N]? y
Installed plugin-manager v3.2.5.1
Install plugin replication version v3.2.5.1 [y/N]? y
Installed replication v3.2.5.1
Install plugin reviewnotes version v3.2.5.1 [y/N]? y
Installed reviewnotes v3.2.5.1
Install plugin singleusergroup version v3.2.5.1 [y/N]? y
Installed singleusergroup v3.2.5.1
Install plugin webhooks version v3.2.5.1 [y/N]? y
Installed webhooks v3.2.5.1
Initializing plugins.
.......
Starting Gerrit Code Review: WARNING: Could not adjust Gerrit's process for the kernel's out-of-memory killer.
This may be caused by /usr/local/gerrit/bin/gerrit.sh not being run as root.
Consider changing the OOM score adjustment manually for Gerrit's PID=70752 with e.g.:
echo '-1000' | sudo tee /proc/70752/oom_score_adj
OK
Waiting for server on local.gerrit.com:8080 ... OK
Opening http://local.gerrit.com:8080/#/admin/projects/ ...FAILED
Open Gerrit with a JavaScript capable browser:
http://local.gerrit.com:8080/#/admin/projects/
查看是否启动成功
[gerrit@node3 ~]$ ss -naltp | grep java
LISTEN 0 50 [::]:29418 [::]:* users:(("java",pid=70752,fd=221))
LISTEN 0 50 [::ffff:192.168.80.153]:8080 [::]:* users:(("java",pid=70752,fd=222))
配置一下环境变量
[root@node3 ~]# vim /etc/profile
# gerrit脚本的环境变量
GERRIT=/usr/local/gerrit/bin
export PATH=$PATH:$GERRIT
[root@node3 ~]# source /etc/profile
配置文件
配置文件位于安装位置下
/usr/local/gerrit/etc/gerrit.config
内容就是我们刚刚初始化时的配置
[gerrit@node3 ~]$ vim /usr/local/gerrit/etc/gerrit.config
[gerrit]
basePath = /usr/local/gerrit
canonicalWebUrl = http://local.gerrit.com:8080
serverId = 77388a5b-5f4f-4ebb-a916-dcb1ada9c910
[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/local/jdk-11
[index]
type = lucene
[auth]
type = HTTP
[receive]
enableSignedPush = true
[sendemail]
smtpServer = localhost
[sshd]
listenAddress = *:29418
[httpd]
listenUrl = proxy-http://local.gerrit.com:8080/
[cache]
directory = cache
服务命令
前提是前面配置了环境变量,,没配置就要用绝对路径
重启
[root@node3 ~]# gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
停止
[root@node3 ~]# gerrit.sh stop
启动
[root@node3 ~]# gerrit.sh start
查看状态
[root@node3 ~]# gerrit.sh status
Checking arguments to Gerrit Code Review:
GERRIT_SITE = /usr/local/gerrit
GERRIT_CONFIG = /usr/local/gerrit/etc/gerrit.config
GERRIT_PID = /usr/local/gerrit/logs/gerrit.pid
GERRIT_TMP = /usr/local/gerrit/tmp
GERRIT_WAR = /usr/local/gerrit/bin/gerrit.war
GERRIT_FDS = 1024
GERRIT_USER = gerrit
GERRIT_STARTUP_TIMEOUT = 90
JAVA = /usr/local/jdk-11/bin/java
JAVA_OPTIONS = -Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance -Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance
RUN_EXEC = /usr/bin/perl -e '$x=$ENV{JAVA};exec $x @ARGV;die $!' -- GerritCodeReview
RUN_ARGS = -Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance -Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance -jar /usr/local/gerrit/bin/gerrit.war daemon -d /usr/local/gerrit
Gerrit running pid=82006
创建密码文件
需要使用htpasswd命令用以生成加密字符,这个命令是httpd带的,所以需要安装下httpd,但是不要启动
[root@node3 ~]# yum -y install httpd
[root@node3 ~]# htpasswd -c /usr/local/gerrit/gerrit.password admin
New password:
Re-type new password:
Adding password for user admin
查看
[root@node3 ~]# cat /usr/local/gerrit/gerrit.password
admin:$apr1$IV.onT28$MtpVzzdPbpDVcqOwzjAca0
这样就生成了一个加密密码
如果再使用该命令生成其他用户的加密密码, 使用 htpasswd -m ,-c会覆盖原密码,切记
配置权限
需要注意,rpm包的nginx是采用nginx用户来运行(默认自动创建nginx用户),所以我们需要修改该加密文件的权限,使nginx可读
[root@node3 ~]# chown .nginx /usr/local/gerrit/gerrit.password
新创一个子配置(虚拟主机)文件即可,rpm包安装的Nginx配置中写了读取子目录
[root@node3 ~]# vim /etc/nginx/conf.d/gerrit.conf
server{
listen 80;
server_name local.gerrit.com;
allow all;
deny all;
auth_basic "welcom to gerrit";
auth_basic_user_file /usr/local/gerrit/gerrit.password;
location / {
proxy_pass http://local.gerrit.com:8080;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
}
}
重启nginx
[root@node3 ~]# systemctl restart nginx
重启gerrit
[root@node3 ~]# gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
配置下域名解析
C:\Windows\System32\drivers\etc\hosts
192.168.80.153 local.gerrit.com
访问成功
需要知道的是,我们httpasswd命令创建的用户名与密码,只是生成了加密的密码串,实际上并没有添加进 gerrit 中,当我们第一次采用这个账户登录gerrit的时候,才将该用户加到gerrit数据库中,但是因为该用户只有个密码信息,email等都是空的,所以第一次登录的时候会提示让填写信息,填写也行,直接close也行
如果前面close了,邮箱要设置中修改
点击邮箱里的这个链接即可了。
gitweb集成到gerrit后,可以实现在gerrit中直接查看代码信息
最前面已经安装过了,所以直接开始配置
查找配置文件位置
[root@node3 ~]# rpm -qc gitweb
/etc/gitweb.conf
/etc/httpd/conf.d/git.conf
修改
[root@node3 ~]# vi /etc/gitweb.conf
# 配置上前面安装gerrit时定义的git位置,忘记了可以去安装目录下 /etc/gerrit.config 查看
10 our $projectroot = "/usr/local/gerrit/git";
因为gitweb需要依靠http来工作,所以还需要配置一下另一个配置文件,/etc/httpd/conf.d/git.conf
[root@node3 gerrit]# vim /etc/httpd/conf.d/git.conf
Alias /gitweb /var/www/git
SetEnv GITWEB_CONFIG /etc/gitweb.conf
<Directory /var/www/git>
Options ExecCGI FollowSymLinks SymLinksIfOwnerMatch
AllowOverride All
order allow,deny
Allow from all
AddHandler cgi-script .cgi
DirectoryIndex gitweb.cgi
</Directory>
因为80端口已经被我们给gerrit映射占用了,所以把httpd的端口改一下
[root@node3 gerrit]# vim /etc/httpd/conf/httpd.conf
42 Listen 8888
启动httpd
[root@node3 ~]# systemctl start httpd
[root@node3 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
访问测试
访问格式为 http:// 域 名 / i p : {域名/ip}: 域名/ip:{端口}/gitweb
修改gerrit配置文件
[root@node3 ~]# vim /usr/local/gerrit/etc/gerrit.config
# 文末添加上gitweb.cgi的路径
[gitweb]
cgi = /var/www/git/gitweb.cgi
type = gitweb
进行git config配置
[root@node3 ~]# git config --file /usr/local/gerrit/etc/gerrit.config gitweb.cgi /var/www/git/gitweb.cgi
[root@node3 ~]# git config --file /usr/local/gerrit/etc/gerrit.config --unset gitweb.url
重启gerrit
[root@node3 ~]# gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
浏览器访问查看
配置访问权限
默认只有Gerrit管理员用户才有GieWeb的访问权限
测试下普通用户的访问
再创建一个用户文件 auto01
[root@node3 gerrit]# htpasswd -m /usr/local/gerrit/gerrit.password auto01
New password:
Re-type new password:
Adding password for user auto01
现在我们就有了一个新的文件,接下来前往页面登录
[root@node3 gerrit]# cat /usr/local/gerrit/gerrit.password
admin:$apr1$5eQamyZ3$ydsV.IpKr5IgtIxeibV6v0
auto01:$apr1$yv90SCm0$Y.kYCgrMApK4tOHBL0gnn0
这里大家可能会发现点击右上角的 sign out 无法退出,这是因为 basic http这种认证模式不支持sign out,所以就要点击 sign out 后,再关闭浏览器重新打开,才可以再次出现登录界面。
我们可以通过配置与gerrit公钥的方式,实现ssh命令行连接gerrit
生成秘钥对
切换至gerrit用户
[root@node3 ~]# su - gerrit
生成秘钥对
[gerrit@node3 ~]$ ssh-keygen -C "gerrit-admin"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/gerrit/.ssh/id_rsa):
Created directory '/home/gerrit/.ssh'.
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:GtqlDJP6BPxTYgBGywC10EutzF3DomX01w8BQ+zXhbQ gerrit-admin
The key's randomart image is:
+---[RSA 2048]----+
|B=.o.. o+..... |
|+o+.=.+ .o .... |
| *oB o.o. o.E. |
| .*... .. .o. |
| o * o S. . |
| = O = |
| . = = |
| o . |
| . |
+----[SHA256]----+
[gerrit@node3 ~]$
将公钥添加至gerrit页面
复制公钥
gerrit@node3 ~]$ cat .ssh/id_rsa.pub
...... gerrit-admin
测试连接
[gerrit@node3 ~]$ vim .ssh/config
Host gerrit-admin
HostName local.gerrit.com
User admin
Port 29418
IdentityFile ~/.ssh/id_rsa
修改下权限
[gerrit@node3 ~]$ chmod 600 .ssh/config
[gerrit@node3 ~]$ ssh gerrit-admin gerrit -h
gerrit [COMMAND] [ARG ...] [--] [--help (-h)]
-- : end of options (default: false)
--help (-h) : display this help text (default: true)
Available commands of gerrit are:
apropos Search in Gerrit documentation
ban-commit Ban a commit from a project's repository
close-connection Close the specified SSH connection
create-account Create a new batch/role account
create-branch Create a new branch
create-group Create a new account group
create-project Create a new project and associated Git repository
flush-caches Flush some/all server caches from memory
gc Run Git garbage collection
index
logging
ls-groups List groups visible to the caller
ls-members List the members of a given group
ls-projects List projects visible to the caller
ls-user-refs List refs visible to a specific user
plugin
query Query the change database
receive-pack Standard Git server side command for client side git push
reload-config Reloads the Gerrit configuration
rename-group Rename an account group
review Apply reviews to one or more patch sets
sequence
set-account Change an account's settings
set-head Change HEAD reference for a project
set-members Modify members of specific group or number of groups
set-project Change a project's settings
set-project-parent Change the project permissions are inherited from
set-reviewers Add or remove reviewers on a change
set-topic Set the topic for one or more changes
show-caches Display current cache statistics
show-connections Display active client SSH connections
show-queue Display the background work queues
stream-events Monitor events occurring in real time
test-submit
version Display gerrit version
See 'gerrit COMMAND --help' for more information.
比如查看版本
[gerrit@node3 ~]$ ssh gerrit-admin gerrit version
gerrit version 3.2.5.1
等下会用到 gerrit 的ssh 命令行连接
集成gitlab等工具,也就可以实现代码的人工审核再提交至仓库了
复制gerrit的公钥
[root@node3 gerrit]# su - gerrit
[gerrit@node3 ~]$ cat .ssh/id_rsa.pub
ssh-rsa xxxxxxx gerrit-admin # 复制该公钥
使用管理员账户登录gitlab
这里使用gitlab管理员用户做免密的目的是为了后期有多个项目的时候可以不再重复做ssh认证。
前面我在安装配置gitlab的时候是使用的root用户,其实建议是用专用的用户sudo权限,尽量不要用root,但是这里实验环境用的root安装配置的gitlab,所以这里配置公钥暂时也只能继续用root用户
前面已经生成过,直接在gitlab这台机器,复制其公钥
[root@node1 ~]# cat .ssh/id_rsa.pub
...... [email protected] # 复制该公钥
粘贴到gerrit服务器
修改gerrit配置
[gerrit@node3 ~]$ vi /usr/local/gerrit/etc/gerrit.config
# 文末追加
[plugins]
allowRemoteAdmin = true
添加这条配置主要就是为了实现gerrit与远端代码库之间的push同步,replication插件可以实现将gerrit的代码变动push到其他仓库,所以需要依赖replication插件,下面来安装下
根据自己安装的gerrit版本查找插件,然后下载上传或者直接拉取到gerrit安装目录下的plugins文件夹
插件下载地址:https://gerrit-ci.gerritforge.com/
[gerrit@node3 plugins]$ pwd
/usr/local/gerrit/plugins
[gerrit@node3 plugins]$ ls replication.jar
replication.jar
插件放置后,重启gerrit即可自动加载插件
切换为管理员并重启gerrit(或者去配置下sudo权限)
[root@node3 plugins]# gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
插件的状态及帮助信息等,我这里以replication为例
注意,自动同步是单向的,gerrit的数据会同步到gitlab,但是gitlab上发生变更不会自动同步到gerrit,所以集成完成后,尽量不要再gitlab上再操作,如果真的已经操作了,那只能手动的使用git命令同步下了
下文 “七、5、gitlab到gerrit的手动同步” 会说明手动同步的方法
因为我这里是以组创建库,所以,项目自动就添加了组内的成员,接下来我再添加个自述文件就好了
然后我们在gerrit上,创建一个同名的仓库
点击 create 创建后
点击完 create 创建后,会生成该项目的目录
[root@node3 ~]# cd /usr/local/gerrit/gerrit01.git/
[root@node3 gerrit01.git]# ll
total 8
drwxrwxr-x 2 gerrit gerrit 6 Dec 16 10:08 branches
-rw-rw-r-- 1 gerrit gerrit 91 Dec 16 10:08 config
-rw-rw-r-- 1 gerrit gerrit 23 Dec 16 10:08 HEAD
drwxrwxr-x 2 gerrit gerrit 6 Dec 16 10:08 hooks
drwxrwxr-x 3 gerrit gerrit 18 Dec 16 10:08 logs
drwxrwxr-x 9 gerrit gerrit 80 Dec 16 10:08 objects
drwxrwxr-x 5 gerrit gerrit 43 Dec 16 10:08 refs
我们将该目录删除,然后从gitlab上拉取一下
[root@node3 ~]# su gerrit
[gerrit@node3 gerrit]$ cd /usr/local/gerrit/
[gerrit@node3 gerrit]$ rm -rf test1.git/
[gerrit@node3 gerrit]$ git clone --bare [email protected]:ops/gerrit01.git
Cloning into bare repository 'gerrit01.git'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
在前面我们已经安装了 replication 插件,接下来我们要创建 replication 配置文件,放在 gerrit 安装目录的 etc 下
每创建一个新项目,都需要在 replication.config 配置文件中 添加 [remote 仓 库 名 {仓库名} 仓库名 的]配置,如下示例
[gerrit@node3 gerrit]$ cd /usr/local/gerrit/etc/
[gerrit@node3 etc]$ vi replication.config
[remote "gerrit01"]
projects = gerrit01
url = [email protected]:ops/gerrit01.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
#### 注意,+ 号,代表--force ,也就是如果gitlab有冲突,会覆盖。
配置的解释,就可以按照我前面安装replication时的方法,点击进入插件后,查看其手册
养成查看手册是好习惯,所以我这里不再解释配置的含义
重载插件配置
[gerrit@node3 etc]$ ssh gerrit-admin gerrit plugin reload replication
首先我们拉取gerrit上的代码到本地,然后修改后再提交看
我这里直接以node4这台机器上搭建邮件服务时的ops01用户目录来模拟,如果前面没有搭建邮件服务,也无所谓,用任意设备和用户(不是gerrit)都可
因为没有 dns,所以不论是哪台机器,记得做下 hosts解析
centos7默认git版本是1.8.3,太老,需要手动编译个新版本
1.8.3和新版本gerrit会出现各种莫名其妙的问题,
git源码包下载地址 : https://mirrors.edge.kernel.org/pub/software/scm/git/
安装git的依赖
[root@node4 ~]# yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
卸载rpm包安装的或者系统自带的git
[root@node4 ~]# rpm -e git --nodeps
拉取git软件包到本地
[root@node4 ~]# curl -O https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.29.1.tar.gz
解压
[root@node4 ~]# tar xf git-2.29.1.tar.gz
配置
[root@node4 ~]# cd git-2.29.1
[root@node4 git-2.29.1]# ./configure --prefix=/usr/local/git2.29
编译并安装
[root@node4 git-2.29.1]# make && make install
配置环境变量
[root@node4 ~]# vim /etc/profile
# 追加
# git 2.29.1 的环境变量
GIT_bin=/usr/local/git2.29
PATH=$PATH:$GIT_bin/bin
生效环境变量
[root@node4 ~]# source /etc/profile
[root@node4 ~]# git --version
git version 2.29.1
全局配置
切记以下两点:
本地git用户的配置,一定要和geerit一致,也就是要用gerrit上对应的用户做
要添加好对应的公钥
[root@node4 ~]# su - ops01
[ops01@node4 ~]$ git config --global user.name "admin"
[ops01@node4 ~]$ git config --global user.email "[email protected]"
[ops01@node4 ~]$ git config --list
user.name=admin
user.email=[email protected]
生成公钥
[ops01@node4 ~]$ ssh-keygen -t rsa -C [email protected]
....# 交互一路回车即可 #......
+---[RSA 2048]----+
|=++oo o.o |
|oo.+ * * |
|. . B = oE |
| .o.o.+. . |
| ...+...S. |
| ..o o |
|Boo. . |
|@*o+ |
|O++o. |
+----[SHA256]-----+
创建.ssh/config配置
[ops01@node4 ~]$ vi .ssh/config
KexAlgorithms +diffie-hellman-group1-sha1
[ops01@node4 ~]$ chmod 600 .ssh/config
**将ops01的公钥粘到 gerrit **
[ops01@node4 ~]$ cat .ssh/id_rsa.pub
ssh-rsa ...... [email protected] # 复制该公钥
复制代码到本地
打开项目网页,可见命令,直接复制即可
[ops01@node4 ~]$ git clone "ssh://[email protected]:29418/gerrit01" && scp -p -P 29418 [email protected]:hooks/commit-msg "gerrit01/.git/hooks/"
Cloning into 'gerrit01'...
remote: Counting objects: 3, done
remote: Finding sources: 100% (3/3)
remote: Total 3 (delta 0), reused 3 (delta 0)
Receiving objects: 100% (3/3), done.
commit-msg 100% 1792 51.3KB/s 00:00
本地修改代码并提交测试
[ops01@node4 ~]$ cd gerrit01/
[ops01@node4 gerrit01]$ ls
README.md
[ops01@node4 gerrit01]$ echo "gerrit&gitlab提交测试" >> gerrit.txt
[ops01@node4 gerrit01]$ git add gerrit.txt
[ops01@node4 gerrit01]$ git commit -m "gerrit&gitlab提交测试"
[master 1090075] gerrit&gitlab提交测试
1 file changed, 1 insertion(+)
create mode 100644 gerrit.txt
push命令换为了"git push -u origin HEAD:refs/for/分支"
这也就意味着,需要封禁掉gitlab中该项目除了特定用户外的提交权限,以避免直接提交到gitlab,并且要对开发人员的ide等工具集成的git进行一定修改,以使其提交命令变为 git push -u origin HEAD:refs/for/分支
其实这里直接push,还是可以成功的,并且gitlab会直接拉取成功,这样就失去了配置gerrit的价值,此前我在老版本上,直接push会报错为 “prohibited by Gerrit:ref update access denied” ,但是目前这个版本我没有找到导致这个问题的具体原因,这里有待解决,因为到目前网络上gerrit新版本的资料相对较少,如果大家有知道我这里是哪里存在问题的,万盼联系,我的邮箱是 [email protected],期待诸君交流指教。
[ops01@node4 gerrit01]$ git push -u origin HEAD:refs/for/master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 364 bytes | 364.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote: http://local.gerrit.com:8080/c/gerrit01/+/42 gerrit&gitlab提交测试 [NEW]
remote:
To ssh://local.gerrit.com:29418/gerrit01
* [new reference] HEAD -> refs/for/master
然后打开gerrit的dashboard
已经可以看到有一个待审核的任务,
然后我们在gitlab中查看有没有这个代码
可见,当前是没有直接push到gitlab去的
默认情况下gerrit只有项目的Owners和管理员组的用户有“Code-Review”+2的权限,Code-Review+2即可提交
默认情况下普通用户“Code-Review”只能选择+1,算作建议
比如我点击代码的文件名,就可以打开代码页面进行查看
具体的操作还算是比较直观的,这里就不多演示了,
我们来将此代码审核通过提交
Code-Review 加 2 后再点击 submit即可提交并触发push到gitlab的动作
查看
gerrit查看,借助gitweb即可,里面有代码信息,log,diff等
gitlab查看
在新版本中,已经可以实现项目在web页面上的删除了,可以直接操作
可以去服务器gerrit存储目录下查看,是已被删除的
[root@node3 ~]# cd /usr/local/gerrit/
[root@node3 gerrit]# ll gerrit*
-rw-r--r-- 1 gerrit nginx 89 Dec 11 09:40 gerrit.password
可见,gerrit01项目已经删除
而且删除是不会影响到gitlab的
但是需要注意的是,gerrit安装目录下 etc/replication.config 配置文件仍然是在的,这个按需删除
如果是较老的版本
gerrit一些老版本,不可以直接删除项目,需要手动的前往命令行来操作
[root@node3 gerrit]# pwd
/usr/local/gerrit # git的存放目录
[root@node3 gerrit]# rm -rf gerrit01.git
然后使用命令刷新
[root@node3 gerrit]# su - gerrit
[gerrit@node3 ~]$ ssh gerrit-admin gerrit flush-caches --all
gerrit是以组权限为基本权限控制,用户可以属于一个或者属于多个组,然后我们的权限是只能赋值给组,而不是直接赋值给用户的。
系统里默认已经存在多个组:
其中,gerrit默认就已经定义好的组为:
Administrators:管理员组,可以管理所有的项目和gerrit的配置
Non-Interactive Users:在gerrit上执行批处理的用户,一般用于和第三方系统做集成使用,该组和其他用户不共用线程池。
如下图
系统自带的组:
Anonymous Users:所有的用户,默认均属于该组,只有read权限
Project Owners:项目的属主拥有者,具备对应项目的所有权限
Change Owner:某个提交的拥有者,拥有对应变更的访问权限
Registered Users:所有登录gerrit成功的用户,都会在该组内,默认情况下,该组用户只具备对代码的 code-review +1的权限,即对项目的建议投票权。
然后也可以添加组的描述
创建项目时
创建项目后修改
其实前面已经用过一次
针对项目的权限就是在对应的项目里点进去,然后没有写的权限,就是跟从所有项目,如果是要单独设置,可以手动添加
日志位置位于gerrit安装目录下
[gerrit@node3 ~]$ cd /usr/local/gerrit/logs/
[gerrit@node3 logs]$ ls
delete_log gc_log
gerrit.pid sshd_log
error_log gerrit.run
pull_replication_log replication_log
日志默认就是有轮转规则的,会以 日志类型+日期.gz 格式保存
然后这些日志的命名也比较清晰,比如
delete_log,就是删除项目的日志
打开看下:
[2020-12-18 11:25:55,880 +0800] INFO 1000000 admin OK gerrit01 {"preserve":false,"force":true}
# 可以看到是哪个用户id,哪个用户,删除了哪个项目,删除状态,参数,时间等
再比如:
error_log ,就是错误日志,打开看下
....
[2020-12-17T18:11:13.099+0800] [HTTP POST /changes/gerrit01~42/revisions/1/submit (admin from 192.168.80.90)] WARN com.google.gerrit.server.plugincontext.PluginContext : Failure in class com.googlesource.gerrit.plugins.replication.pull.ReplicationQueue of plugin pull-replication [CONTEXT SUBMISSION_ID="42-1608199872849-b77330d2" project="gerrit01" ]
.....
比如这个报错,就是某个时间,pull复制gerrit01的时候出现了问题
有什么问题根据对应日志的名称来找即可了
因为刚才已经删除了gerrit01项目,记得按前面说过的流程,再创建一下
因为已经配置了同步,gerrit创建的分支,会自动同步到gitlab
注意,自动同步是单向的,gerrit的数据会同步到gitlab,但是gitlab上发生变更不会自动同步到gerrit,所以集成完成后,尽量不要再gitlab上再操作,如果真的已经操作了,那只能手动的使用git命令同步下了
下文 “七、5、gitlab到gerrit的手动同步” 会说明手动同步的方法
注意,删除分支,默认不会同步到gitlab
### gerrit 用户,进入到要被同步的项目目录下
[gerrit@node3 etc]$ cd /usr/local/gerrit/gerrit01.git/
### 执行以下命令完成同步
[gerrit@node3 gerrit01.git]$ git fetch origin +refs/heads/*:refs/heads/* +refs/heads/*:refs/heads/* --prune
From local.gitlab.com:ops/gerrit01
* [new branch] ops -> ops
* [new branch] ops01 -> ops01
* [new branch] ops03 -> ops03
gerrit界面就可以看到结果了,由上面同步命令的状态可知,我这里都是同步的分支,所以我查看下分支有没有同步成功
默认情况下,如果有两个开发者都修改提交了同一个文件,那么两个提交都不会入库,并且两个代码中后提交通过的change会有 conflicts with 提示或者Cannot Merge提示
如果是已经通过了一个提交入库了,那么第二个冲突代码应该也是无法提交入库的,会有 conflicts with 提示
如何解决:
方法有两个:
直接放弃这个提交
本地手动解决冲突,用 git rebase来解决冲突问题,这样就可以提交到同一个change commit中
直接放弃,有需要的时候再提交就不再赘述了,这里来简单说下第二种方法
首先我这里在 node4 机器上 再起一个开发环境,并且拉取代码到本地(不要和原gerrit01项目在同目录下)
流程上面都操作过了,就不再啰嗦
我们直接快进到,第一个开发提交了代码clash.txt,第二个开发又提交了这个clash.txt,并且内容不一致,
这里我将两份文件称为 dev01的文件(第一个开发已经提交了的),dev02就是第二个开发
可以看到冲突提醒
然后我先通过并提交dev02提交的这个,然后来解决冲突
此时再提交dev01的,就不会成功了
1)dev01 在本地执行git fetch命令更新最新的远端代码
[ops01@node4 gerrit01]$ pwd
/home/ops01/gerrit01
[ops01@node4 gerrit01]$ git fetch
remote: Counting objects: 4, done
remote: Finding sources: 100% (3/3)
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), 352 bytes | 352.00 KiB/s, done.
From ssh://local.gerrit.com:29418/gerrit01
+ 1140142...4d3cd9e master -> origin/master (forced update)
* [new branch] ops -> origin/ops
* [new branch] ops01 -> origin/ops01
* [new branch] ops03 -> origin/ops03
2)执行git rebase命令获取具体的冲突信息
### 查看是谁引起了冲突
[ops01@node4 gerrit01]$ git rebase
CONFLICT (add/add): Merge conflict in clash.txt ### 冲突(添加/添加):合并冲突在clash.txt
Auto-merging clash.txt ### 编码clash.txt
error: could not apply 1c89de4... dev01的提交 ### 错误:无法应用编号为 1c89de4… dev01的提交
Resolve all conflicts manually, mark them as resolved with
"git add/rm " , then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 1c89de4... dev01的提交
3)执行git mergetool命令手动解决冲突
[ops01@node4 gerrit01]$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
tortoisemerge emerge vimdiff nvimdiff
Merging:
clash.txt
Normal merge conflict for 'clash.txt':
{local}: created file
{remote}: created file
Hit return to start merge resolution tool (vimdiff): ### 直接回车
进行修改,直至满足需求解决冲突
4)执行git add指令重新添加修改的文件
[ops01@node4 gerrit01]$ git add clash.txt
5)执行git rebase --continue命令完成rebase过程
[ops01@node4 gerrit01]$ git rebase --continue
Successfully rebased and updated refs/heads/master.
6) 再次提交
[ops01@node4 gerrit01]$ git push -u origin HEAD:refs/for/master
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 2 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 722 bytes | 722.00 KiB/s, done.
Total 6 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1)
remote: Processing changes: refs: 1, new: 1, updated: 1, done
remote:
remote: SUCCESS
remote:
remote: http://local.gerrit.com:8080/c/gerrit01/+/63 测试 [NEW]
remote: http://local.gerrit.com:8080/c/gerrit01/+/62 dev01提交
remote:
To ssh://local.gerrit.com:29418/gerrit01
* [new reference] HEAD -> refs/for/master
7)再前往页面,就可以执行操作了
如果不设置默认,那要手动通知的话只能 # git push origin HEAD:refs/for/master%[email protected]
默认情况下,提交的时候都需要手动添加代码审核者,如果将某些用户设置为默认审核者,只要项目有代码提交,就会将这些用户设置为代码审核者,并且发送代码审核通知邮件。
这需要 reviewers插件来实现
https://gerrit-ci.gerritforge.com/ 插件下载地址
https://gerrit-ci.gerritforge.com/view/Plugins-stable-3.2/job/plugin-reviewers-bazel-stable-3.2/ 我们安装的版本对应的插件链接
[root@node3 gerrit]# cd /usr/local/gerrit/plugins/
[root@node3 plugins]# ls
codemirror-editor.jar download-commands.jar plugin-manager.jar reviewnotes.jar
commit-message-length-validator.jar gitiles.jar pull-replication.jar singleusergroup.jar
delete-project.jar hooks.jar replication.jar webhooks.jar
[root@node3 plugins]# curl -O https://gerrit-ci.gerritforge.com/view/Plugins-stable-3.2/job/plugin-reviewers-bazel-stable-3.2/lastSuccessfulBuild/artifact/bazel-bin/plugins/reviewers/reviewers.jar
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 38454 100 38454 0 0 4674 0 0:00:08 0:00:08 --:--:-- 8162
重启gerrit以启用插件
[root@node3 plugins]# gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
页面查看是否启用成功
我们提交个代码
[ops01@node4 gerrit01]$ echo "123" >> 1.txt
[ops01@node4 gerrit01]$ git add 1.txt
[ops01@node4 gerrit01]$ git commit
file is empty: .git/COMMIT_EDITMSG
[ops01@node4 gerrit01]$ git commit -m "测试邮件提醒"
[master 544df45] 测试邮件提醒
1 file changed, 1 insertion(+)
create mode 100644 1.txt
[ops01@node4 gerrit01]$ git push -u origin HEAD:refs/for/ops01
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 394 bytes | 394.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote: http://local.gerrit.com:8080/c/gerrit01/+/81 测试邮件提醒 [NEW]
remote:
To ssh://local.gerrit.com:29418/gerrit01
* [new reference] HEAD -> refs/for/ops01
邮件已发出
.jar gitiles.jar pull-replication.jar singleusergroup.jar
delete-project.jar hooks.jar replication.jar webhooks.jar
[root@node3 plugins]# curl -O https://gerrit-ci.gerritforge.com/view/Plugins-stable-3.2/job/plugin-reviewers-bazel-stable-3.2/lastSuccessfulBuild/artifact/bazel-bin/plugins/reviewers/reviewers.jar
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 38454 100 38454 0 0 4674 0 0:00:08 0:00:08 --:--:-- 8162
重启gerrit以启用插件
[root@node3 plugins]# gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
页面查看是否启用成功
我们提交个代码
[ops01@node4 gerrit01]$ echo "123" >> 1.txt
[ops01@node4 gerrit01]$ git add 1.txt
[ops01@node4 gerrit01]$ git commit
file is empty: .git/COMMIT_EDITMSG
[ops01@node4 gerrit01]$ git commit -m "测试邮件提醒"
[master 544df45] 测试邮件提醒
1 file changed, 1 insertion(+)
create mode 100644 1.txt
[ops01@node4 gerrit01]$ git push -u origin HEAD:refs/for/ops01
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 394 bytes | 394.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote: http://local.gerrit.com:8080/c/gerrit01/+/81 测试邮件提醒 [NEW]
remote:
To ssh://local.gerrit.com:29418/gerrit01
* [new reference] HEAD -> refs/for/ops01