Gerrit Setup - xapool/xapool.github.io GitHub Wiki
使用 HTTP 认证,用户并不能自己修改密码,修改密码或添加用户都得通过 htpasswd 命令来操作,比较麻烦。这里可以使用 htpasswd-editor,通过 Perl CGI 提供的 Web 界面来管理用户。
需要安装一个模块 https://metacpan.org/pod/distribution/Apache-Htpasswd/Htpasswd.pm。其中可以把脚本放到 apache 默认提供的 CGI 路径 /usr/lib/cgi-bin 中,并编辑完善 /etc/apache2/conf-available/serve-cgi-bin.conf 配置文件。若 CGI 模块没有启用的话,需启用该模块 sudo a2enmod cgi。
使用了 Postfix,在服务器上搭建了一个邮件发送服务器,gerrit 直接使用 localhost 做为 smtpServer 即可。
[sendemail]
smtpServer = localhost
from=CodeReview<gerrit@Server-CodeReview>
并且用户可以自己添加邮箱,无需管理员再通过命令行手动给用户添加。当然也可以使用腾讯企业邮箱、163 邮箱做为 smtpServer。
- Ubuntu 16.04 LTS
- jdk1.8 或 jdk1.7
- gerrit-2.14.5.war,此版本需要 jdk 1.8
- git
- apache 或 nginx,做反向代理使用,这里使用 apache2
除了使用
sudo update-alternatives --config javac
sudo update-alternatives --config java还可以一步到位,切换所有 alternatives
sudo update-java-alternatives -l # 查看已安装好的 java
sudo update-java-alternatives -s <jname>一般为了方便管理,单独创建一个 linux 用户
sudo adduser gerrit # 增加一个名为 gerrit 的用户,修改密码的话使用 sudo passwd gerrit
sudo visudo # 将 gerrit 用户加入到 root 权限组,添加 gerrit ALL=(ALL:ALL) ALL,编辑之前先将默认编辑器切换为 vim,sudo update-alternatives --config editor
sudo su - gerrit # 切换到该用户下下载 gerrit war 包,放到 /home/gerrit/ 目录下,并在该目录下新建一个 repo 目录,将镜像代码放到 /home/gerrit/repo/uhomeos 目录下,uhomeos 目录下就是各个 .git 仓库。
h2 数据库是 java 默认提供的一个数据库,若不想使用,可以使用 postgresql 数据库。
sudo apt-get install postgresql
sudo su postgres # 切换到 postgres 用户下
createuser --username=postgres -RDIElPS gerrit # 创建一个 gerrit 的角色,这个角色就是数据库的用户名
createdb --username=postgres -E UTF-8 -O gerrit reviewdb # 给 gerrit 创建一个名为 reviewdb 的数据库
# dropdb -U postgres reviewdb # 删除数据库 reviewdb
# dropuser gerrit # 删除 gerrit 用户java -jar gerrit.war init -d /home/gerrit/review_site # 安装到用户目录下的 review_site 目录安装过程中需要对其进行配置,大部分默认即可。需要注意的几个配置地方
-
Location of Git repositories,使用 /home/gerrit/repo 目录,这样 gerrit 会自动导入所有的 git 项目,否则就需要手动创建个仓库并 push -
Database server type,这里使用 postgresql 数据库 -
Authentication method, 这里使用 http,因为是公司团队用的,需要使用公司邮箱。后面还需要给 Apache 配置反向代理 -
Run as,建议 root -
canonicalWebUrl, 直接使用 IP 地址,不建议使用主机名 -
Installing plugins,选择要安装的插件,这先安装一个download-commands,否则在项目详情页面看不到下载地址。在安装一个hooks?
安装好后,gerrit 就默认启动了。可以通过 netstat -ltpn | grep -i gerrit 命令查看 gerrit 监听的端口。
配置文件在 ~/review_site/etc/gerrit.config,可以进行修改,如关闭邮件提醒,因为我们内网机器不联网,所以无法使用邮件提醒,若使用的话可以使用如 163 的 SMTP 服务。
修改后重启 gerrit,review_site/bin/gerrit.sh restart。
密码相关的配置文件在 etc/secure.config 。日志文件在 logs/error_log。
删除 gerrit,只需要停止或杀死 gerrit 进程,然后删除 review_site、.gerritcodereview 目录。
安装所需模块
sudo a2enmod proxy
sudo a2enmod proxy_http备份并编辑 /etc/apache2/sites-enabled/000-default.conf 文件
Listen 80
<VirtualHost *:80>
ServerName localhost
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 /etc/apache2/passwords
</Location>
ProxyPass / http://192.168.40.164:8080/
ProxyPass / http://127.0.0.1:8080/
</VirtualHost>注意这里 Apache 使用的是 80 端口,去反代理 gerrit 的 8080 端口。
配置 gerrit 账户密码
sudo htpasswd -c /etc/apache2/passwords admin # 添加管理员重启 apache 服务 sudo /etc/init.d/apache2 restart。
可以通过 gerrit 命令,直接在数据库中添加一个用户,并设定邮箱和添加 ssh public key,例:
cat id_rsa.pub | ssh -p 29418 [email protected] gerrit create-account --full-name newuserfullname --email [email protected] --ssh-key - newusername
但是,因为这里采用的是 http 认证,虽然添加的用户可以正常 pull push,但是无法登陆 Web,即使使用 htpasswd 添加了同样用户名的 http 认证,因为两者无法关联起来。
在这里只能先使用 sudo htpasswd -m /etc/apache2/passwords newuser,添加 http 认证,然后待用户登陆过一次后,也就是数据库中有记录后,再使用 ssh -p 29418 [email protected] gerrit set-account --add-email [email protected] newuser
因为这里使用的是 http 认证,而又没有开启邮件提醒,造成新用户无法自己添加邮箱,所以只能用户登陆过后再通过 gerrit set-account 命令的方式直接给用户添加一个邮箱。若可以使用邮件提醒,那么用户直接自己就可以添加,没必要这么麻烦了。当然还可以直接操作数据库 ssh -p 29418 [email protected] gerrit gsql,太过危险,谨慎操作。默认情况下 admin 是不具有修改数据库的权限,需要修改 All-Projects 的权限,在 Global Capabilties 中添加 Access Database 的权限,并赋予给 Administrators 组。
添加到开机启动项:
sudo ln -snf \
/home/gerrit/review_site/bin/gerrit.sh \
/etc/init.d/gerrit.sh
sudo ln -snf ../init.d/gerrit.sh /etc/rc2.d/S90gerrit
sudo ln -snf ../init.d/gerrit.sh /etc/rc3.d/S90gerrit创建 /etc/default/gerritcodereview 文件,添加内容
GERRIT_SITE=/home/gerrit/review_site
NO_START=0
第一个登陆的用户直接是 administrator,系统自动创建 ID 为 1000000 的账号,点击上图右上角 1000000 账号的三角号下拉菜单有一个 Setting 选项卡,点击开始账户设置。
设置 Contact Information,设置你的 Full Name 和 Email,并添加 SSH Public Keys。要保证你的 git config 的 email 和 gerrit 上的 email 地址一样。
可用 ssh -p 29418 [email protected] 验证是否添加成功。
创建一个新的 security-team 分组,并将成员都添加到该组。默认该分组的 Owners 为该分组,这样该分组的成员可以管理该分组。
新建一个 Android 项目,勾选 Only Serve As Parent For Other Projects,并设置权限,增加一个为 refs/* 的引用,并添加 Label Code-Revicew 和 Submit 等权限。
同时为了解决 gitweb 普通用户点击时显示 Not Found 的问题,在添加一个 refs/meta/config 引用,对所有注册用户增加 read 权限。
设置所有的项目的父项目是 Android,repo forall -c 'echo $REPO_PATH; ssh -p 29418 admin@localhost gerrit set-project-parent --parent Android android/$REPO_PATH;'。这样避免了对每个项目进行权限的配置,也避免了直接修改 All-Projects 的权限造成的影响过大。
要不要把 master 分支的 push 权限去掉,新开一个 devel 分支,只往这个分支 push?在新建一个 security-team-admin 分组,给 force push 权限、添加删除分支权限?
- 在服务器上通过
git init --bare,然后在本地 push 上去 - 通过
gerrit create-project命令,如gerrit create-project --empty-commit --name demo-project创建一个空项目,gerrit create-project --name exist-project建立一个已有项目,在 Web 界面的表现是是否勾选Create initial empty commit - 通过 Web 界面
不能直接暴力的从服务器上直接删除仓库,数据库中依然还有记录。以后在建立同名的项目时会出错,除非手动操作 gerrit 的数据库,删除相关东西。建议使用 delete-projects 插件
- 自己编译或下载 delete-project.jar,不管自编译还是下载,注意匹配插件和 gerrit 的版本号
- 安装,将 jar 包放到
review_site/plugins目录下;或者使用命令安装gerrit plugin install -n delete-project.jar - < delete-project.jar。最后重启 gerrit - 删除项目,可直接在 Web 界面上删除,也可以使用命令
delete-project delete <project-name>,确认过后直接ssh -p 29418 admin@localhost delete-project delete --yes-really-delete <project-name> - 刷新缓存
gerrit flush-caches
使用 gerrit 命令远程安装插件需要开启相关权限,修改 gerrit 配置文件:
[plugins]
allowRemoteAdmin = true
其它方法,请参考 Delete-Project Plugin
repo init -u ssh://[email protected]:29418/uhomeos/manifest -b uhomeos_security --repo-url=http://192.168.40.164:8080/git-repo --repo-branch=stablegit push origin HEAD:refs/for/master,如果嫌麻烦可以在项目下 git config remote.origin.push refs/heads/*:refs/for/* 配置默认的 push。
针对单个仓库,在 push 时,若出现 missing Change-Id in commit message footer 的错误,需要根据提示进行修复,增加 change-id。
也可以配置全局的 git Hook:
mkdir -p ~/.git_template/hooks
cp commit-msg ~/.git_template/hooks
git config --global init.templatedir ~/.git_template注意,设置之后,针对已经 pull 下来的仓库,也许需要重新 pull,或者其它的操作,才会增加这个 hook?或者单独把 commit-msg 拷过去。
但是使用 repo 管理的代码,如 android 代码,会自动添加 hook。
安装 gitweb,然后找到 find / -name gitweb.cgi,所在路径或 dpkg -L gitweb,然后编辑 gerrit.config,在最后添加
[gitweb]
type = gitweb
cgi = /usr/lib/cgi-bin/gitweb.cgi最后重启 gerrit。但是安装后默认只有管理员用户才能查看 gitweb 超链接,普通用打开链接后页面显示 Not Found。如果想给普通的用户查看 gitweb 超链接的权限,则必须对项目设置 refs/meta/config 的 read 权限。而这个权限在 All-Projects 的 ACL 里只对 Administrators 用户和 Project Owners 开放。
解决方法,为项目的用户组增加对 refs/meta/config 的 read 权限,即在 read 标签中加入注册的用户组即可
搞了这么多,终于大致搞明白,然后呢,为什么不用 Docker 试试看。