Gerrit快速安装手册

0 目录


1 在 Ubuntu 16.04 上安装Gerrit

本文展示如何在Ubuntu 16.04上机器上安装Gerrit

快速安装手册,可以参考Quick get started guide

详细的安装手册,可以参考Standalone Daemon Installation Guide.

其它参考文章:

(1) HowTo: Demo Gerrit server on AWS EC2 instance

1.1 准备工作

  1. 一台运行类Unix操作系统的服务器

  2. Java SE 实时运行环境,1.8及其以后的版本(如果没有,可以使用下面的方法安装)

    a. 安装依赖包:

     sudo apt-get install python-software-properties
    

    b. 添加仓库源:

     sudo add-apt-repository ppa:webupd8team/java
    

    c. 更新软件包列表:

     sudo apt-get update
    

    d. 安装java JDK:

     sudo apt-get install oracle-java-installer
    

    安装过程中需要接受协议:接受即可。

    e. 查看java版本,看看是否安装成功:

     java version "1.8.0_191"
    
  3. git

    gerrit用来操作git仓库。安装非常简单:

     sudo apt-get install git
    

    验证安装是否成功:

     git --version
    
  4. apache2

    gerrit反向代理时使用,安装:

     sudo apt-get install apache2
    

    验证:

     sudo /etc/init.d/apache2 start
    
  5. gerrit管理帐号(可选,使用独立账号配置gerrit)

    用来管理gerrit。

     sudo adduser gerrit
     sudo passwd gerrit
    

    并将gerrit加入sudo权限

     sudo vim /etc/sudoers
    

    添加下面一句:

     gerrit  ALL=(ALL:ALL) ALL
    

1.2 下载Gerrit

选择合适的Gerrit版本,进行下载。可用的Gerrit版本,可以参考Gerrit Code Review - Releases

本手册使用的版本是Gerrrit 2.15.2,下载命令是:

wget https://www.gerritcodereview.com/download/gerrit-2.14.2.war

如果想使用源代码进行安装,请参考Developer Setup

1.3 安装和初始化Gerrit

命令行输入:

java -jar gerrit*.war init --batch --dev -d ~/gerrittest

参数解释:

1. --batch

    这个参数

运行完成后,命令行会显示下面这些信息:

Generating SSH host key ... rsa(simple)... done
Initialized /home/gerrit/gerrittest
Executing /home/gerrit/gerrittest/bin/gerrit.sh start
Starting Gerrit Code Review: OK

Starting Gerrit Code Review: OK,这条信息告知我们Gerrit服务正在运行。

1.4 使用Gerrit

  1. 更新监听的URL

把Gerrit监听的URL,从* 改为localhost,阻止外界与本服务链接。

git config --file ~/gerrittest/etc/gerrit.config httpd.listenUrl 'http://localhost:8080'

git configgerrit的配置方法。

  1. 重启Gerrit服务

必须重新启动身份验证类型的Gerrit服务,监听URL的改变才能生效。

~/gerrittest/bin/gerrit.sh restart

~/gerrittest/就是安装时,指定的目录。

  1. 浏览Gerrit

到现在,已经完成了Gerrit的基本安装,可以通过打开浏览器,查看安装的结果:

http://localhost:8080

到目前为止,我们已经完成了一个本机上的简易Gerrit服务器。接下来,我们研究使用代理服务器,从远程服务器访问该Gerrit服务器。

2 反向代理

2.1 描述

Gerrit可以被配置在第3方web服务器下运行。这允许其它web服务器绑定到特权端口80(或用于SSL的443)。

2.2 Gerrit配置

确保'$site_path'/etc/gerrit.config有属性httpd.listenUrl,使用 'proxy-http://''proxy-https://' 和一个自由端口号进行配置。如果在安装的时候,也就是’init’的时候,代理支持被使能,这里应该已经配置了。

[httpd]
    listenUrl = proxy-http://10.48.100.182:8081/ # started by the proxy; gerrit server ip and port

我的配置,位于'$site_path'/etc/gerrit.config

[gerrit]
    basePath = git
    serverId = 45493128-5b74-44c5-a0ef-41e9b72fd239
    canonicalWebUrl = http://10.48.100.182:8081/  # gerrit server ip and port
[database]
    type = h2
    database = /home/gerrittest/gerrit/db/ReviewDB
[noteDb "changes"]
    disableReviewDb = true
    primaryStorage = note db
    read = true
    sequence = true
    write = true
[index]
    type = LUCENE
[auth]
    type = HTTP #DEVELOPMENT_BECOME_ANY_ACCOUNT # authenticated by http
[receive]
    enableSignedPush = false
[sendemail]
    smtpServer = localhost
[container]
    user = gerrittest
    javaHome = /usr/lib/jvm/java-8-oracle/jre
[sshd]
    listenAddress = *:29418
[httpd]
    listenUrl = proxy-http://10.48.100.182:8081/ # started by the proxy
[cache]
    directory = cache
[plugins]
    allowRemoteAdmin = true

2.3 HTTP身份验证

参考文档:
Gerrit Code Review - 配置

使用HTTP身份验证时,Gerrit假定servlet容器前端Web服务器在将请求交给Gerrit之前已执行了所有用户身份验证。

基于这个假设,Gerrit可以假设所有请求都已经过身份验证。因此, loginlogout 不会显示在Web UI中。

使能HTTP身份验证:

git config --file $site_path/etc/gerrit.config auth.type HTTP
git config --file $site_path/etc/gerrit.config --unset auth.httpHeader
git config --file $site_path/etc/gerrit.config auth.emailFormat '{0}@example.com'
  • auth.type

    默认是OpenID,所以,这里需要根据所需进行设置。下面是一些常用的设置项:

    • HTTP

      Gerrit依赖于HTTP请求中提供的数据。这包括HTTP基本身份验证或某些类型的商业单点登录解决方案。 启用此设置后,身份验证必须在Web服务器或servlet容器中进行,而不是在Gerrit中进行。

    • HTTP_LDAP

      完全像上面的HTTP,但是还要根据从LDAP中用户的账户对象中获得的信息,预填充用户的全名和电子邮件地址。 用户的组成员关系也从LDAP中提取,使用户所属的任何LDAP组成为Gerrit的组。

    • LDAP

      Gerrit提示用户输入一个用户名密码,然后通过与配置的ldap.server进行简单的绑定来验证用户名和密码。 使用此配置,web服务器不会涉及到用户身份验证。

      LDAP简单绑定请求中使用的实际用户名是帐户的完整DN,通过首先使用匿名请求或配置的ldap.username标识查询目录来发现该用户名。 如果将ldap.authentication设置为GSSAPIGerrit也可以使用kerberos

    • LDAP_BIND

      Gerrit提示用户输入一个用户名密码,然后通过与配置的ldap.server进行简单的绑定来验证用户名和密码。 使用此配置,web服务器不会涉及到用户身份验证。

      LDAP不同的是,LDAP简单绑定请求中所使用的用户名就是用户在对话框中填入的真实字符串。不会使用ldap.username设置的标识中获取账户的信息。

    • DEVELOPMENT_BECOME_ANY_ACCOUNT

      不要使用!!!,仅在开发阶段的时候使用。不需要任何登录信息。

  • auth.httpHeader

    必须是unset。如果设置为任何值(包括Authorization),则Gerrit将无法正确遵循标准的Authorization HTTP标头。

  • auth.loginUrl

    在最终用户点击右上角的登录链接后,将浏览器重定向到的URL。 仅在auth.type设置为HTTP或HTTP_LDAP时使用。 使用企业单点登录解决方案的组织可能希望将浏览器重定向到SSO产品的登录页面,以完成登录过程并验证其凭据。

    如果设置,Gerrit允许匿名访问,直到最终用户执行登录并通过HTTP标头提供受信任的身份。 如果未设置,Gerrit需要具有受信任标识的HTTP标头,并返回错误页面“LoginRedirect.html”(如果此标头不存在)。

2.4 Apache2配置

需要使能必要的Apache2模块:

a2enmod proxy_http
a2dissite 000-default
a2enmod ssl          ; # 可选,HTTPS或SSL需要

使用上面的'http://'URL设置’ProxyPass’行。 保证ProxyPasshttpd.listenUrl 匹配,或者能够重定向到正确的地址。

我的设置,位于/etc/apache2/sites-available/gerrit.conf,在/etc/apache2/sites-enabled/目录下有其链接文件。

<VirtualHost *:8080>
    ServerName 10.48.100.182
    ProxyRequests Off
    ProxyVia Off
    ProxyPreserveHost On
    <Proxy *>
        Require all granted # >= apache2 2.6 required
    </Proxy>

    <Location "/">
        AuthType Basic
        AuthName "Gerrit Code Review"
        Require valid-user
    AuthBasicProvider file
        AuthUserFile /etc/apache2/passwords
    </Location>

    AllowEncodedSlashes On
    ProxyPass /  http://10.48.100.182:8081/ nocanon
    ProxyPassReverse / http://10.48.100.182:8081/ nocanon

    ErrorLog /var/log/apache2/gerrit.error.log
    CustomLog /var/log/apache2/gerrit.access.log combined
</VirtualHost>

2选项'AllowEncodedSlashes On''ProxyPass .. nocanon'Gerrit 2.6及以后版本必须有。

使能配置的网站命令:

sudo a2ensite gerrit

注意: 要记得编辑文件/etc/apache2/ports.conf,将监听端口改为listen 8080

2.5 设置第一个 Gerrit 用户的帐号和密码

$ sudo touch /etc/apache2/passwords
$ sudo htpasswd -b /etc/apache2/passwords admin 123456 # administrator
$ sudo htpasswd -b /etc/apache2/passwords gerrit1 123456 # general usr

htpasswd命令是 apache2-utils软件包中的一个工具。如果系统中还没有安装的话,通过如下命令进行安装:

$ sudo apt-get install apache2-utils

后续再添加 Gerrit 用户可使用 htpasswd -b /etc/apache2/passwords UserName PassWord)。如果要创建一组授权用户, 则可以使用下面的命令:

for i in $(seq 1 30); do echo user$i | sudo htpasswd -i /etc/apache2/passwords user$i; done

对于 Gerrit 来说,第一个成功登录的用户具有特殊意义-它会直接被赋予管理员权限。对于第一个账户,需要特别注意一下。

2.6 启动gerrit&启动apache2

sudo ~/gerrittest/bin/gerrit.sh start
sudo /etc/init.d/apache2 start

3 SSH登录

3.1 生成SSH key

首先查看的目录下是否已经具有id_rsaid_rsa.pub两个文件。

生成SSH key:

ssh-keygen -t rsa

3.2 设置Gerrit服务端SSH Key

查看ssh key:

cat ~/.ssh/id_rsa.pub

结果:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmXV/aXLZ+orq37Yr+0rmw43xk2Cfd8qEhJ9dpdLM9vX/2BglvUH4DFNyevpvQHUmmZpXvtlhpjuJuD2tt5pzGY7ZtmDRwOXCvmkNwXG/nbREUoeWctHT1KUbArPCrxByEdW2VPNk3yrFk2ZTBio7GhHPl8Pzhi0kzJvBQulK0U77ywTZwpmaZz0SiDiwHCAoCv/VyDCVpLCzLB48yUnNpaxaujAhf19q7jrqWHWaV8UFAv9vD+eET/sB1EIVaNm3ymiRuQtSyranVm4aV2hXdFpDxvN4qQGI160cI9V+EeGXlz8zqgL2/KE6ykhnFzDQU6tFsClHGJ89AD7K5tEcj gerrittest@tupelo-VirtualBox

添加sshkey到gerrit服务器(gerrit 服务端)。此步骤与git流程类似,即将id_rsa.pub内容上传到git仓库,gerrit中帮我们管理git仓库

Gerrit_SSHKey_Paste_Setting

验证sshkey是否配置成功:

ssh gerrit1@[gerrit服务器的IP地址] -p 29418

如果不知道gerrit服务器的IP地址,可以使用下面的命令获取:

git config -f ~/gerrit_testsite/etc/gerrit.config gerrit.canonicalWebUrl

4 使用gerrit

4.1 添加项目

  1. 使用gerrit添加新项目:(适用于开启新项目并使用gerrit)

     ssh -p 29418 gerrit1@[服务器的IP地址] gerrit create-project --empty-commit --name demo-project
    

或者使用gerrit管理界面(推荐)

gerrit_create_new_project

  1. 使用gerrit添加已有项目:(适用于已有项目下移植到gerrit中)

     ssh -p 29418 gerrit1@[服务器的IP地址] gerrit create-project --name exist-project
    

或者使用gerrit管理界面(推荐)

gerrit_create_exist_project

然后将已有项目与gerrit上建立的exist-project关联,即将已有代码库代码pushgerrit中进行管理。

cd ~/gitcode/exist-project
git push ssh://gerrit1@[服务器的IP地址]:29418/exist-project *:*

4.2 修改并push到gerrit服务器

  1. pull代码及配置git hooks(git client)

     git clone ssh://gerrit1@[服务器的IP地址]:29418/demo-project
    
  2. 更新git hooks

     gitdir=$(git rev-parse --git-dir); scp -p -P 29418 gerrit1@[服务器的IP地址]:hooks/commit-msg ${gitdir}/hooks/
    

    该过程用来在commit-msg中加入change-id,gerrit流程必备。

  3. push 改动到远程服务器

     cd ~/demo-project
     date > testfile.txt
     git add testfile.txt
     git commit -m "My pretty test commit"
     git push origin HEAD:refs/for/master
    

    这里有可能报错:

     remote: Processing changes: refs: 1, done
     remote:
     remote: ERROR:  In commit 4732b67cac5f3e7d406c5ef5eeef63716c541b85
     remote: ERROR:  committer email address shenwanjiang2013@163.com
     remote: ERROR:  does not match your user account and you have no 'forge committer' permission.
     remote: ERROR:
     remote: ERROR:  You have not registered any email addresses.
     remote: ERROR:
     remote: ERROR:  To register an email address, please visit:
     remote: ERROR:  http://10.48.100.182:8081/#/settings/contact
     remote:
     remote:
     To ssh://gerrit1@10.48.100.182:29418/demo-project
      ! [remote rejected] HEAD -> refs/for/master (invalid committer)
     error: 无法推送一些引用到 'ssh://gerrit1@10.48.100.182:29418/demo-project'
    

    push代码时需要commit emailgerrit account email一致,否则无法push成功,可选择关闭email notify,并开启forge user权限,或者通过修改gerrit数据库account email信息

    修改Gerrit的配置文件gerrit.configsecure.config,内容分别如下:

    • gerrit.config

      [sendemail]
      enable = true
      smtpServer = smtp.163.com
      smtpServerPort = 465
      smtpEncryption = ssl
      smtpUser = 【你的邮箱账号】
      smtpPass = 【你的授权密码】
      sslVerify = false
      from = 【你的邮箱账号】

    • secure.config

      [auth]
      registerEmailPrivateKey = ZIbpTyD12K8ZspVMsgkw5Tt0DkDL9FOlHV0=
      [sendemail]
      smtpPass = 【你的授权密码】

  4. 提交成功的结果:

     gerrittest@tupelo-VirtualBox:~/demo-test/demo-project$ date > testfile.txt
     gerrittest@tupelo-VirtualBox:~/demo-test/demo-project$ git add testfile.txt
     gerrittest@tupelo-VirtualBox:~/demo-test/demo-project$ git commit -m "My pretty test commit"
     [master a3c1973] My pretty test commit
      1 file changed, 1 insertion(+)
      create mode 100644 testfile.txt
     gerrittest@tupelo-VirtualBox:~/demo-test/demo-project$ git push origin HEAD:refs/for/master
     Enter passphrase for key '/home/gerrittest/.ssh/id_rsa':
     对象计数中: 3, 完成.
     写入对象中: 100% (3/3), 338 bytes | 0 bytes/s, 完成.
     Total 3 (delta 0), reused 0 (delta 0)
     remote: Processing changes: new: 1, done
     remote:
     remote: New Changes:
     remote:   http://10.48.100.182:8081/#/c/demo-project/+/21 My pretty test commit
     remote:
     To ssh://gerrit1@10.48.100.182:29418/demo-project
      + [new branch]      HEAD -> refs/for/master
    

4.3 完成review并merge

使用gerrit website完成code review

a. 当完成push后,可在gerrit管理界面看到当前提交code review的change。

Gerrit_check_commit_result

b. 添加reviewers

gerrit_push_result_add_reviewer

c. 结果

gerrit_push_result_after_add_reviewer

d. 以下是Reviewer的账户,可以看到收到的Review请求:

gerrit_reviewer_check

e. 点击请求,进入其中,

gerrit_reviewer_do_review

f. 完成Review并提交代码:

gerrit_reviewer_complete_review

5 gerrit权限控制

在gerrit中权限控制是基于群组的. 每个用户有一个或者多个群组, 访问权限被赋予这些群组.访问权限不能赋予个人用户.

  1. System Groups

在Gerrit系统自带下面的群组

  • Anonymous Users
  • Change Owner
  • Project Owners
  • Registered Users
  1. Anonymous Users

所有用户都是匿名用户成员, 所有用户都能继承Anonymous Users所有访问权限.
当前只有Read access权限值得赋予给Anonymous Users群组, 因为其他权限都需要认证.

  1. Project Owners

Project Owners的访问权限在Project范围内有效

  1. Change Owner

Change Owner的访问权限在Change范围内有效

  1. Registered Users

所有在页面上登录成功的用户都会自动注册为gerrit用户,属于Registered Users群组
Registered Users群组通常被赋予Code-Review -1…+1权限, 允许给需要审查代码投票, 但不会引起审查被批准和拒绝

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值