Gerrit Setup - xapool/xapool.github.io GitHub Wiki

目录

Update

2018/06/29

使用 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

2018/06/27

使用了 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

切换 java 版本

除了使用

sudo update-alternatives --config javac
sudo update-alternatives --config java

还可以一步到位,切换所有 alternatives

sudo update-java-alternatives -l # 查看已安装好的 java
sudo update-java-alternatives -s <jname>

gerrit 安装

新建用户

一般为了方便管理,单独创建一个 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 仓库。

创建 postgresql 数据库

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 用户

安装 gerrit

java -jar gerrit.war init -d /home/gerrit/review_site # 安装到用户目录下的 review_site 目录

安装过程中需要对其进行配置,大部分默认即可。需要注意的几个配置地方

  1. Location of Git repositories,使用 /home/gerrit/repo 目录,这样 gerrit 会自动导入所有的 git 项目,否则就需要手动创建个仓库并 push
  2. Database server type,这里使用 postgresql 数据库
  3. Authentication method, 这里使用 http,因为是公司团队用的,需要使用公司邮箱。后面还需要给 Apache 配置反向代理
  4. Run as,建议 root
  5. canonicalWebUrl, 直接使用 IP 地址,不建议使用主机名
  6. 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

gerrit 配置

第一个登陆的用户直接是 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-RevicewSubmit 等权限。

同时为了解决 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 权限、添加删除分支权限?

添加项目

  1. 在服务器上通过 git init --bare,然后在本地 push 上去
  2. 通过 gerrit create-project 命令,如 gerrit create-project --empty-commit --name demo-project 创建一个空项目,gerrit create-project --name exist-project 建立一个已有项目,在 Web 界面的表现是是否勾选 Create initial empty commit
  3. 通过 Web 界面

删除项目

不能直接暴力的从服务器上直接删除仓库,数据库中依然还有记录。以后在建立同名的项目时会出错,除非手动操作 gerrit 的数据库,删除相关东西。建议使用 delete-projects 插件

  1. 自己编译或下载 delete-project.jar,不管自编译还是下载,注意匹配插件和 gerrit 的版本号
  2. 安装,将 jar 包放到 review_site/plugins 目录下;或者使用命令安装 gerrit plugin install -n delete-project.jar - < delete-project.jar。最后重启 gerrit
  3. 删除项目,可直接在 Web 界面上删除,也可以使用命令 delete-project delete <project-name>,确认过后直接 ssh -p 29418 admin@localhost delete-project delete --yes-really-delete <project-name>
  4. 刷新缓存 gerrit flush-caches

使用 gerrit 命令远程安装插件需要开启相关权限,修改 gerrit 配置文件:

[plugins]
    allowRemoteAdmin = true

其它方法,请参考 Delete-Project Plugin

gerrit 权限管理

gerrit 使用

拉取代码

repo init -u ssh://[email protected]:29418/uhomeos/manifest -b uhomeos_security --repo-url=http://192.168.40.164:8080/git-repo --repo-branch=stable

push

git push origin HEAD:refs/for/master,如果嫌麻烦可以在项目下 git config remote.origin.push refs/heads/*:refs/for/* 配置默认的 push。

QA

Missing Change-Id

针对单个仓库,在 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(可选)

安装 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 试试看。

⚠️ **GitHub.com Fallback** ⚠️