您的位置:首页 > 运维架构 > Apache

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

2014-10-30 21:43 1101 查看
系统: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
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 =
lwx1028732302@163.com  #这里就相当于服务器邮箱。每当有新用户注册,就会取这里的邮箱和密码给注册用户发邮件。必须密码和邮箱对应起来,要不注册不了用户.

        from =
lwx1028732302@163.com

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

[container]

        user = gerrit                                   
4000
          #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 plaincopyprint?

ServerName ganshuyu.pbi.com  
<VirtualHost *:8080>        -->客户端访问:http:192.168.1.101:8080 会转到gerrit服务器的地址:http:192.168.1.101:8081上 
    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 
        AuthBasicProvider file 
        AuthUserFile /home/gerrit/review_site/etc/passwd #你存放gerrit用户和密码的地方
    </Location> 
 
    ProxyPass / http://192.168.1.101:8081/   
</VirtualHost> 

ServerName ganshuyu.pbi.com
<VirtualHost *:8080>        -->客户端访问: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]

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

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

ProxyPass / http://10.10.90.160:8081/ 
</VirtualHost>

    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:完成之后大概是这个样子


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 $name@10.20.20.XX:hooks/commit-msg .git/hooks/ 
#name和IP用自己的

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

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

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

Java代码 

ssh -p 29418
gerrit_fisrt_username@192.168.1.101 gerrit create-project -n test_project 

ssh -p 29418 gerrit_fisrt_username@127.0.0.1 gerrit create-project -n test_project

添加一个项目。

在webUI就可以看到此项目了

5.简便ssh

在~/.ssh/目录下新建文件config

加入内容如下

Host gerrit_short 
          User gerrit_fisrt_username 
          Port 29418 
          Hostname 192.168.1.101
          IdentityFile ~/.ssh/id_rsa 

Host gerrit_short
User gerrit_fisrt_username
Port 29418
Hostname 127.0.0.1
IdentityFile ~/.ssh/id_rsa


以后执行

ssh -p 29418 gerrit_fisrt_username@127.0.0.1 
ssh -p 29418 gerrit_fisrt_username@127.0.0.1


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

ssh gerrit_short
ssh gerrit_short

再比如

ssh -p 29418 gerrit_fisrt_username@127.0.0.1 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代码 

ssh gerrit_short gerrit ls-projects 

ssh gerrit_short gerrit ls-projects


将会输出2个项目名称

all_project

test_project

一个是内置的,一个是刚才建立的。(使用管理员账户才能看到内置的all_project项目)

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

Java代码 

git clone ssh://gerrit2@127.0.0.1:29418/test_project.git 

git clone ssh://gerrit2@127.0.0.1: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代码 

vi ~/.gitconfig 

vi ~/.gitconfig


加入如下内容;

Java代码 

[user] 
        name = some_one_ 
        email = xxx@xxx.com 

[core] 
        editor = vim 

[user]
name = some_one_
email = xxx@xxx.com
[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://gerrit_fisrt_username@127.0.0.1:29418/test_project.git克隆以后,就会产生这个默认名称,简单点说就是origin=ssh://gerrit_fisrt_username@127.0.0.1:29418/test_project.git

而master是本地仓库的当前分支名称。通过git checkout branchname可以切换当前工作分支,这个后面再说。

git push origin master此命令即是将到当前分支同步到远程仓库中去。不过此命令在gerrit中是会失败的。后面再说。

结果却显示错误

To ssh://gerrit_fisrt_username@127.0.0.1:29418/test_project.git 
! [remote rejected] master -> master (prohibited by Gerrit) 
error: failed to push some refs to 'ssh://gerrit_fisrt_username@127.0.0.1:29418/test_project.git' 

...
To ssh://gerrit_fisrt_username@127.0.0.1:29418/test_project.git
! [remote rejected] master -> master (prohibited by Gerrit)
error: failed to push some refs to 'ssh://gerrit_fisrt_username@127.0.0.1:29418/test_project.git'


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

接下来更该push的地址:

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. 

解决办法:

$ git config --global user.name "yourname" 
$ git config --global user.email yourmail@xx.com 
#进入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 =
'yourmail@xx.com' where account_id = your_acc_id 
#这里的your_acc_id就是select查询出来的gerrit_fisrt_username账户对应的account_id列中的值 

$ 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 yaoshine@192.168.1.101: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 $name@10.20.20.XX: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 yourmail@xx.com
#进入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 = 'yourmail@xx.com' where account_id = your_acc_id
#这里的your_acc_id就是select查询出来的gerrit_fisrt_username账户对应的account_id列中的值
$ java -jar bin/gerrit.sh start


再次执行

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的内容

  这样即完成了一次代码的共享过程。

 
 
 
 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息