linux : gerrit搭建配置服务器+git简单操作+apache代理配置+部分遇到的错误及处理

系统:ubuntu12.04

gerrit:2.8.5

参考链接:

1 http://blog.csdn.net/ganshuyu/article/details/8978614

2 http://fatalove.iteye.com/blog/1332881

3 http://blog.csdn.net/benkaoya/article/details/8680886

4 http://blog.chinaunix.net/uid-12076195-id-3487354.html

小小说明一下:

     本人也是初次搭建gerrit服务器,过程跟大家分享一下。文章中鉴于之前没有碰到错误的地方,我就直接复制了。

     中间涉及到的许多问题虽然都有解决,但还是有不少理解不到位的地方,欢迎有自己的独到理解。

第一步:搭建gerrit

1、建立专有帐户

      sudo adduser gerrit

      sudo passwd gerrit

      su gerrit

2、配置Java环境

  从官网下载对应平台的JDK并安装:

   http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

  安装:

           sudo tar zxvf ./jdk-7u45-linux-i586.tar.gz -C /opt

       完成后,配置相关环境变量

  $: vim ~/.bashrc

   添加如下环境变量:

export JAVA_HOME=/home/yaoshine/soft/jdk1.7.0_55
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

3、从官网下载gerrit

       http://code.google.com/p/gerrit/

4、安装gerrit

       java -jar gerrit-full-2.5.2.war init -d review_site

  一路按回车,先以默认方式安装,之后再手动修改配置文件。

PS:这里全部默认即可,我并没有遇到会影响后期gerrit运行的地方

5、配置gerrit

      $: vim review_site/etc/gerrit.config

[gerrit]
        basePath = git  #这里是存放工程目录的地方,采取默认即可。我之前因为更换目录导致logs/error_log报错说missing all-project.应该就是说的git目录下边的all-projecct.git
        canonicalWebUrl = http://192.168.1.101:8081/  #更改为你的服务器IP和端口号。8081可自定,但不能占用其他已用端口
[database]
        type = h2      #这里可以选择gerrit的数据库。默认是h2.用mysql的可以在这里更改
        database = db/ReviewDB
[auth]
        type = HTTP
[sendemail]
        smtpServer = smtp.163.com

        smtpUser = [email protected]  #这里就相当于服务器邮箱。每当有新用户注册,就会取这里的邮箱和密码给注册用户发邮件。必须密码和邮箱对应起来,要不注册不了用户.
        from = [email protected]

        smtppass = ************                            #密码用自己的,邮箱也用自己的


[container]
        user = gerrit                                             #linux用户
        javaHome = /home/yaoshine/soft/jdk1.7.0_55/jre  #修改自己的
[sshd]
        listenAddress = *:29418                    #默认即可 ,不要随便乱改。
[httpd]
        listenUrl = http://*:8081/                      #服务器监听的ip地址和端口,可以吧*换成ip
[cache]
        directory = cache

7、安装apache2服务器                    

  sudo apt-get install --reinstall apache2  apache2.2-common

8、配置apache2服务器

     8.1、开启代理功能、复写功能(以下模块链接到mods-available)
          cd /etc/apache2/mods-enabled
          ln -s ../mods-available/proxy.load
          ln -s ../mods-available/proxy.conf
          ln -s ../mods-available/proxy_http.load
          ln -s ../mods-available/proxy_balancer.conf
          ln -s ../mods-available/proxy_balancer.load
          ln -s ../mods-available/rewrite.load
          ln -s ../mods-available/ssl.conf
          ln -s ../mods-available/ssl.load

     8.2、配置apache2的监听端口

         $: vi /etc/apache2/ports.conf

         ……
     NameVirtualHost *:80
     NameVirtualHost *:8080   -->仿照80端口,加上对8080端口的监听。
     Listen 80
     Listen 8080
         ……

    8.3、配置反向代理

         $: sudo vi /etc/apache2/httpd.conf

[html] view plain copy print ?
  1. ServerName ganshuyu.pbi.com  
  2. <VirtualHost *:8080>        -->客户端访问:http:192.168.1.101:8080 会转到gerrit服务器的地址:http:192.168.1.101:8081上 
  3.     ProxyRequests Off 
  4.     ProxyVia Off 
  5.     ProxyPreserveHost On 
  6. <Proxy *> 
  7.           Order deny,allow 
  8.           Allow from all 
  9.     Proxy> 
  10.  
  11.     <Location /login/> 
  12.         AuthType Basic 
  13.         AuthName "Gerrit Code Review" 
  14.         Require valid-user 
  15.         AuthBasicProvider file 
  16.         AuthUserFile /home/gerrit/review_site/etc/passwd #你存放gerrit用户和密码的地方
  17.     Location> 
  18.  
  19.     ProxyPass / http://192.168.1.101:8081/ 
  20.  
  21. VirtualHost> 
 ServerName ganshuyu.pbi.com 
        -->客户端访问:http:10.10.90.160:8081 会转到gerrit服务器的地址:http://10.10.90.160:8080 上
    ProxyRequests Off
    ProxyVia Off
    ProxyPreserveHost On
    AllowEncodedSlashes On
    RewriteEngine On
    RewriteRule ^/(.*) http://10.10.90.160:8081/$1 [NE,P]

    
          Order deny,allow
          Allow from all
    

    
        AuthType Basic
        AuthName "Gerrit Code Review"
        Require valid-user
        AuthBasicProvider file
        AuthUserFile /home/gerrit/review_site/etc/passwd
    

    ProxyPass / http://10.10.90.160:8081/


    8.4、主配置文件中加入httpd.conf,使其生效

      $: sudo vi /etc/apache2/apache2.conf

          查看是否已包含:httpd.conf,如果没有,则加上如下这句话:

                        Include httpd.conf

9、设置第一个gerrit用户的帐号和密码
      $: touch ./review_site/etc/passwd
      $: htpasswd -b ./review_site/etc/passwd gerritUser1 123456789

      (后续再添加gerrit用户可使用: $: htpasswd -b ./review_site/etc/passwd UserName PassWord )

10、开启gerrit服务器
      $: ./review_site/bin/gerrit.sh start

        如果提示发生如下错误:
         ** ERROR: GERRIT_SITE not set
        则可按如下方法修改:
             $: vim gerrit.sh
                     在GERRIT_SITE变量被赋值之后加入下面这行,改变该变量的值。
                                  GERRIT_SITE=/home/gerrit/review_site

11、重启apache2服务器

       $: sudo /etc/init.d/apache2 restart

12、访问: http://192.168.1.101:8080/  ,用gerritUser1用户登录:

PS:如果在登陆之后出现ERROR信息,可以参考错误日志,自行网上搜索。日志在review_site/logs/error_log

第二步:注册gerrit用户。(直接原文复制,仅作PS)

注意,第一个注册的用户默认成了管理员,所以Gerrit安装完毕第一件事要做的就是注册或者登陆,以便初始化管理员账户。点击Become链接.

PS:我反正没找到become连接。直接点右上角一个地方会出来settings和sign out,点settings会看到相关信息。注意ID是10000的才是管理员。ssh的时候要用ID为10000的用户,即使10001这种可以用好像后期也会各种出错

 如果你首次登陆的话,是会自动显示注册信息之类。如果没有就自己点setting对应设置信息。效果一样


图2‑1 第一个注册的用户是管理员

◆     Full Name中输入全名,点击SaveChanges保存,Full Name设置完后还可以再修改。

◆     点击Register New Email设置邮箱,点击SaveChanges保存,邮箱设置完后可以修改。

◆     Username是gerrit的用户名,输入后用户名后,点击Select Username保存,注意Username设置后不可以再修改。

生成SSH密钥对,可以加上-C参数添加说明(如

◆     图2‑2所示),以便能一眼看出这是谁的密钥,否者默认的说明很杂乱。将公钥文件(注意是公钥)的内容添加注册页面的Add SSH Publi Key中,点击Add即可。

PS:注册新用户时需要秘钥。ssh-keygen -t rsa可以生成秘钥。会生成两个文件在.ssh/下面。id_dsa和id_dsa.pub两个文件 。一个私钥一个公钥(.pub)。注册时用vi打开id_dsa.pub文件

复制粘贴到空白处即可、要全复制,包括开头和结尾。

还有这里的邮件需要注册上,后期push的时候会用到。系统会发邮件到你的邮箱。确认即可。


图 2‑2 生成SSH密钥对

PS:完成之后大概是这个样子


linux : gerrit搭建配置服务器+git简单操作+apache代理配置+部分遇到的错误及处理_第1张图片2.3.6. 测试下gerrit的SSH连接

PS:ssh的用户为第一次注册的用户。也就是ID为10000的用户

图2‑3 gerrit用户的用户名Username

 

有了Gerrit账号,也为该账号正确配置了公钥,就可以访问Gerrit提供的SSH登录服务。需要注意的是ssh登陆的用户名必须是gerrit注册的账号,即如图2‑3所示Settings > Profile > Username中显示的Username。

$ ssh -p 29418 -i ~/.ssh/admin 192.168.1.101 -l admin

 

  ****    Welcome to Gerrit Code Review    ****

 

  Hi 管理员, you have successfully connected over SSH.

 

  Unfortunately, interactive shells are disabled.

  To clone a hosted Git repository, use:

 恭喜你,看到welcome就表示你已经配置完成

如果链接异常的话,可以删除~/.ssh/knows_host重试

执行

第三步 简单GIT操作,push clone操作

文章中大多为粘贴复制,可参考给出链接,略作整合

###############################################################################

这里首先做出自己git的操作步骤:

ssh gerrit_short gerrit create-project -n 工程名

git clone ssh://用户名@IP:29418/工程名                         #这个地方会报警告,正常

cd 工程名

touch readme.txt;git add readme.txt;git commit readme.txt -m "commit"

git push origin refs/heads/master refs/for/master        #这个地方回报缺少change-id。参考下文解决

#这里也可以在clone完进入工程目录后直接执行这句话,就不会报错了                                                                                                #scp -p -P 29418 [email protected]:hooks/commit-msg .git/hooks/  #name和IP用自己的

然后登陆web页面,在web上找到ALL->open->review->选+2选项(+2才可以submit,管理员+2,两个普通用户+1)->publish and submit

#这时候你push 的代码才真正到了远程库.而且中间经过了审核过程

###############################################################################
Java代码 
  1. ssh -p 29418 gerrit_fisrt_username@192.168.1.101 gerrit create-project -n test_project 
 ssh -p 29418 [email protected] gerrit create-project -n test_project

添加一个项目。
在webUI就可以看到此项目了

5.简便ssh
在~/.ssh/目录下新建文件config
加入内容如下

  1. Host gerrit_short 
  2.           User gerrit_fisrt_username 
  3.           Port 29418 
  4.           Hostname 192.168.1.101
  5.           IdentityFile ~/.ssh/id_rsa 
Host gerrit_short
          User gerrit_fisrt_username
          Port 29418
          Hostname 127.0.0.1
          IdentityFile ~/.ssh/id_rsa


以后执行

  1. ssh -p 29418 gerrit_fisrt_username@127.0.0.1 
    ssh -p 29418 [email protected]
    

这个命令就可以简单的写成

ssh gerrit_short

ssh gerrit_short

再比如
ssh -p 29418 [email protected] gerrit create-project -n test_project
就可以简写为

ssh gerrit_short gerrit create-project -n test_project 

ssh gerrit_short gerrit create-project -n test_project

这里的第2个参数gerrit是关键字

6.检出项目

通过上面的命令创建项目以后,除了在http://192.168.1.101:8080/可以看见以外,通过ssh也可以查看。

Java代码 
  1. ssh gerrit_short gerrit ls-projects 
ssh gerrit_short gerrit ls-projects


将会输出2个项目名称
all_project
test_project
一个是内置的,一个是刚才建立的。(使用管理员账户才能看到内置的all_project项目)

下面客户机就可以检出项目了:

Java代码 
  1. git clone ssh://[email protected]:29418/test_project.git 
git clone ssh://[email protected]:29418/test_project.git


当前目录下就会多出一个test目录,此目录即是你重服务器上检出的项目。
同时shell中会见看到如下提示
Cloning into test_project...
warning: remote HEAD refers to nonexistent ref, unable to checkout.

PS:执行clone的时候是将远程库里所有文件copy到本地可以理解,copy的时候是根据远程库的分支执行的,现在远程库是只有一个空的工程,不存在分支,所以给出警告信息。

下边是原作者注解:(commit 一次,就会创建一个新的指针)

//这是因为test项目本身就是个空项目,所以还不存在头指针。
//git的版本控制方式就像c语言里面的链表模型。每一次提交会产生一个新的节点,而这个新的节点同时还有个指向原来节点的链接。每一个头指针代表一个分支。头指针指向的是链表的最后一个节点。具体的模型可在progit.pdf中找到。

扯远了,扯回来。

8.第一次提交。
在刚此检出的test目录下新建一个文件readme.txt

cd test

touch readme.txt
执行:

git add readme.txt

git add readme.txt

或者执行
git stage readme.txt 

git stage readme.txt


这两个命令此处的效果相銅,之所以说“此处”,是因为add命令是个多个功能命令,还有其他含义,而这里的git stage 相当于svn add

接下来将文件提交到本地仓库,先配置git的默认编辑器

Java代码 
  1. vi ~/.gitconfig 
vi ~/.gitconfig


加入如下内容;

Java代码 
  1. [user] 
  2.         name = some_one_ 
  3.         email = xxx@xxx.com 
  4. [core] 
  5.         editor = vim 
[user]
        name = some_one_
        email = [email protected]
[core]
        editor = vim

并保存,以后每次提交的信息中对会带上以上提交人的描述信息,并且设置了编辑器为vim,方便编写log
执行:
git commit readme.txt 

git commit readme.txt

在vim中加入log并保存推出,即完成一次提交,注意此次是提交到本地仓库,和服务器没有关系。
PS:这是你执行查看分支命令 git branch -a 会发现经过commit之后。本地自动建立一个分支master。之前是没有的,也就是提交一次之后才会建立。但是这时候仍然不会有远程分支的信息。
9.push到远程仓库
  参考http://www.infoq.com/cn/articles/Gerrit-jenkins-hudson
执行

git push origin master

git push origin master

origin和master可不是什么关键字,他们只是默认的名称而已。是克隆的仓库的默认别名,通过git clone ssh://[email protected]:29418/test_project.git克隆以后,就会产生这个默认名称,简单点说就是origin=ssh://[email protected]:29418/test_project.git
而master是本地仓库的当前分支名称。通过git checkout branchname可以切换当前工作分支,这个后面再说。
git push origin master此命令即是将到当前分支同步到远程仓库中去。不过此命令在gerrit中是会失败的。后面再说。

结果却显示错误

  1. To ssh://[email protected]:29418/test_project.git 
  2. ! [remote rejected] master -> master (prohibited by Gerrit) 
  3. error: failed to push some refs to 'ssh://[email protected]:29418/test_project.git' 
...
To ssh://[email protected]:29418/test_project.git
 ! [remote rejected] master -> master (prohibited by Gerrit)
error: failed to push some refs to 'ssh://[email protected]:29418/test_project.git'



原因是gerrit不允许直接将本地修改同步到远程仓库。客户机必须先push到远程仓库的refs/for/*分支上,等待审核。这也是为什么我们需要使用gerrit的原因。gerrit本身就是个代码审核工具。

接下来更该push的地址:

  1. git config remote.origin.push refs/heads/*:refs/for/* 
git config remote.origin.push refs/heads/*:refs/for/*

此命令实际是更改的是本地仓库test_project/.git/config文件。
再次push

git push origin 
git push origin

这次不要加master,
结果又出错

remote: ERROR:  You have not registered any email addresses. 
解决办法:

  1. $ git config --global user.name "yourname" 
  2. $ git config --global user.email yourmail@xx.com 
  3. #进入gerirt的安装目录 
  4. cd /home/xx/gerrt_sites 
  5. #执行 
  6. $ java -jar bin/gerrit.sh stop 
  7. $ java -jar bin/gerrit.war gsql 
  8. #在新的shell中执行(其实就是修改mysql数据库表的内容,添加邮件地址) 
  9. gerrit>  select * from account_external_ids; 
  10. gerrit> update account_external_ids set email_address = '[email protected]' where account_id = your_acc_id 
  11. #这里的your_acc_id就是select查询出来的gerrit_fisrt_username账户对应的account_id列中的值 
  12. $ java -jar bin/gerrit.sh start 

remote: ERROR:  You have not registered any email addresses.

PS:这里如果gerrit.config和注册用户的邮箱都有的话,应该是不会报错的。我的没有报错

但是我的在这里出现了Missing Change-ID的错误,

remote: ERROR: missing Change-Id in commit message footer
remote: Suggestion for commit message:
remote: 12.2 commit
remote:
remote: Change-Id: I05b315ecacd0f2177697e300e7ef75f825c30e62
remote:
remote: Hint: To automatically insert Change-Id, install the hook:
remote:   gitdir=$(git rev-parse --git-dir); scp -p -P 29418 [email protected]:hooks/commit-msg ${gitdir}/hooks/
remote:
remote:


这里可以有两个方法可以解决:

1:报错后执行git commit --amend会重新打开提交信息然胡将上文中Change-Id: I05b315ecacd0f2177697e300e7ef75f825c30e62

       复制到文件尾,重新执行git push origin

2:参考链接4,用钩子自动添加change-id信息。这样做的好处是,一个工程之需要添加一次钩子,以后就不用再管理了。

     执行命令如下: scp -p -P 29418 [email protected]:hooks/commit-msg .git/hooks/  #$name和IP用服务器ID 为100000的用户和服务器IP替换

    然后再次执行gerrti commit --amend,退出保存后再次执行git push origin就可


$ git config --global user.name "yourname"
$ git config --global user.email [email protected]
#进入gerirt的安装目录
cd /home/xx/gerrt_sites
#执行
$ java -jar bin/gerrit.sh stop
$ java -jar bin/gerrit.war gsql
#在新的shell中执行(其实就是修改mysql数据库表的内容,添加邮件地址)
gerrit>  select * from account_external_ids;
gerrit> update account_external_ids set email_address = '[email protected]' where account_id = your_acc_id
#这里的your_acc_id就是select查询出来的gerrit_fisrt_username账户对应的account_id列中的值
$ java -jar bin/gerrit.sh start


再次执行

  1. git push origin 
git push origin

恭喜你,push成功。


10。审核,验证、提交。
push成功以后,进入http://192.168.1.101:8080/开打web界面
点击左上的all,再点open,
会看到所有带审核的commit
即你在本地push之前执行了多少此commit,这里就会列出多少个commitid

首先需要为用户配置权限信息,在admin--》projects--》All-Projects--》access中点击
edit,然后设置权限,具体设置方法就不描述了,说来话长了。出要是要为refs/heads/*添加
Label Code-Review
Label Verified
Submit
+1和+2权限,并为每个权限添加用户组。
权限配置好以后,
点击某个commitid,在点击review,然后点击pulish或者submit
顺序是先审核,再验证,再提交。相信大家多琢磨琢磨就知道怎么操作了
提交以后,
刚才的git push origin才算真正的提交到了远程仓库中。


11.下载。
  其他客户机就可以通过git colne(重复上面的过程)或者git fetch来下载远程仓库,下载下来的内容就包含了刚才push上去内容。当然,前提是要为其他开发者创建账户并添加权限,这些就不说啦,可以参考git权威指南这本书,有介绍gerrit的内容
  这样即完成了一次代码的共享过程。

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(gerrit服务器搭建)