Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1177006
  • 博文数量: 312
  • 博客积分: 12522
  • 博客等级: 上将
  • 技术积分: 3376
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 18:35
文章分类

全部博文(312)

文章存档

2016年(3)

2015年(1)

2013年(1)

2012年(28)

2011年(101)

2010年(72)

2009年(13)

2008年(93)

分类: LINUX

2012-03-08 15:01:22

参考资料:
Gerrit简易安装入门
http://m.oschina.net/blog/33017
 
 
 
 
Gerrit Code Review - Reverse Proxy



1.模块作用介绍。
    git是分布式版本控制工具。
    gerrit是代码审核工具,当然也包括了一套权限系统(google发明的?),git向远程仓库的refs/for/*分支提交代码时会先经过gerrit,审核通过后才会提交到ref/head/*分支。
    mysql为gerrit提供数据库支持。
    apache2在这里的主要是为了配合gerrit的账户认证,提供反向代理功能。

2.准备工作。
    安装git,安装apache2,安装mysql,下载gerrit包。(没有jdk的话也需要先安装和配置,网上资料很多)
    apt-get install git
    apt-get install apache2
    mysql本人是通过linux的updatamanger工具安装。版本是5.1.10。
    需要注意的是mysql默认安装以后所有字符集都是拉丁1,请不要更改此默认设置,本人的教训。。。改成utf8以后安装gerrit时跑数据库脚本出错,会导致使用过程中会出现一些莫名的错误。
    在googecode网站上下载gerrit2.x.x.war文件备用。貌似还可以通过wget命令下载,未尝试。
    安装过程没什么特殊设置。
    说明:apache2安装好以后默认的工作目录在/var/www/下。配置目录在/etc/apache2下。
         启动apache2:/etc/init.d/apache2 start
         停止apache2:/etc/init.d/apache2 stop
         启动mysql:/etc/init.d/mysql start
         停在mysql:/etc/init.d/mysql stop
         mysql安装好以后是默认开机启动的。

3.配置过程。
     1首先配置数据库。数据库类型是可选的,h2,postgre也是可以的
     执行mysql -uroot -p启动mysql控制台,执行如下脚本
Java代码  收藏代码
  1. CREATE USER 'git'@'localhost' IDENTIFIED BY 'git';  
  2. CREATE DATABASE reviewdb;  
  3. ALTER DATABASE reviewdb charset=latin1;  
  4. GRANT ALL ON reviewdb.* TO 'git'@'localhost';  
  5. FLUSH PRIVILEGES;  

这里的数据库用户git和数据库名称reviewdb可以随便取,后面会用到他们。关键是要设置charset=latin1,不要改成utf8了,本人一开始就是自做聪明该改成utf8,导致gerrit安装异常。

     2 安装gerrit。通过执行命令
Java代码  收藏代码
  1. java -jar /home/xx/gerrit-2.2.1.war init -d /home/xx/gerrt_sites  

进行安装。安装过程中会提示输入各种信息,包括数据库信息等,这些可以参考上面的链接。大部分都可以使用默认配置,关键是在选择认证的时候
Java代码  收藏代码
  1. *** User Authentication    
  2. ***     
  3.     
  4. Authentication method          [OPENID/?]: http  

请选择http方式,不要使用openid方式,选择http方式后可以配置apache进行认证,选择openid方式后认证需要外网链接,而且貌似有bug,在[url] working[/url]网站上有介绍。
安装完成以后通过执行/home/xx/gerrt_sites/bin/gerrit.sh start 启动gerrit。
接下来通过浏览器访问会进入错误提示页面,提示http请求未带授权头。你也许会奇怪这里的http服务器是哪里来的。这个其实就是打包在gerrit.war文件里的jetty服务器。

接下来配置好apache2就行了。测试apahce2安装成功可以通过浏览器访问显示it works 就是按好了。apahce2的默认端口是80.

首先要激活代理模块
Java代码  收藏代码
  1. ln -s /etc/apache2/mods-available/proxy.conf /etc/apache2/mods-enable/proxy.conf  
  2.   
  3. ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enable/proxy.load  
  4.   
  5. ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enable/proxy_http.load  


然后在/etc/apache2/httpd.conf中加入下面的内容(什么?httpd.conf是空的?不要觉得奇怪,原始的httpd.conf本来就是个空文件)
Java代码  收藏代码
  1.   
  2.   ServerName localhost  
  3.   ProxyRequests Off  
  4.   ProxyVia Off  
  5.   ProxyPreserveHost On  
  6.   
  7.     
  8.         Order deny,allow  
  9.         Allow from all  
  10.     
  11.    
  12.     
  13.      AuthType Basic  
  14.      AuthName "Gerrit Code Review"  
  15.      AuthBasicProvider file  
  16.      AuthUserFile /home/xx/gerrt_sites/etc/passwords  
  17.      Require valid-user  
  18.     
  19.   
  20.   ProxyPass / http://127.0.0.1:8080/  
  21.   


这里需要注意的是2个地方,一是AuthUserFile /home/xx/gerrt_sites/etc/passwords,这个路是指向的是个密码文件。此文件通过命令生成
Java代码  收藏代码
  1. htpasswd /home/xx/gerrt_sites/etc/passwords "gerrit_fisrt_username"  

这里的gerrit_fisrt_username就是以后用来登录gerrit的用户名。以后要为gerirt增加用户,也需要通过htpasswd命令在此passwords文件中添加用户

二是ProxyPass / ,这里的配置必须和/home/xx/gerrt_sites/etc/gerrit.config文件里面的
Java代码  收藏代码
  1. [httpd]  
  2.         listenUrl = proxy-http://127.0.0.1:8080/  

匹配。/home/xx/gerrt_sites/etc/gerrit.config文件里面保存的是在gerrit安装过中输入的信息,更改配置也可以直接编辑此文件。
本人的gerrit.config如下
Java代码  收藏代码
  1. [gerrit]  
  2.         basePath = git  
  3.         canonicalWebUrl = http://127.0.0.1:8080/  
  4. [database]  
  5.         type = MYSQL  
  6.         hostname = localhost  
  7.         database = reviewdb  
  8.         username = git  
  9. [auth]  
  10.         type = HTTP  
  11. [sendemail]  
  12.         smtpServer = localhost  
  13. [container]  
  14.         user = gerrit2  
  15.         javaHome = /usr/lib/jvm/java-6-openjdk/jre  
  16. [sshd]  
  17.         listenAddress = *:29418  
  18. [httpd]  
  19.         listenUrl = proxy-http://127.0.0.1:8080/  
  20. [cache]  
  21.         directory = cache  


这些都配置好以后重启apache2,通过浏览器访问,会提示输入用户名密码,输入 gerrit_fisrt_username和密码登录,就会自动跳转到,在此页面的右上方点击 settings,然后在左侧栏点击profile,可以看到当前登录的用户名为gerrit_fisrt_username,然后点击Contact Information,在fullname中随便输入名字保存即可。第一个登入的账户默认是管理员账户

正常情况下,在页面admin--》project下应该能在列表项中看到一个All-Projects项。
点击All-Projects可以设置各种权限。如果你看不到All-Projects就说明你的gerrit安装又异常,多半是我上面提到的数据库字符集导致的。


4.gerrit公钥配置
  在shell中执行命令
Java代码  收藏代码
  1. ssh -p 29418 gerrit_fisrt_username@127.0.0.1  

提示Permission denied (publickey).
缺少公钥配置。
参考
执行:
Java代码  收藏代码
  1. ssh-keygen -t rsa  

生成公钥,
查看:
Java代码  收藏代码
  1. cat ~/.ssh/id_rsa.pub  

将个公钥添加到gerrit中。
进入,点击右上角setting,点左侧栏SSH Public Keys
再点击又边的add key,将公钥复制到里面,点击add提交。
这里需要注意的是需要复制的字符串是包括cat ~/.ssh/id_rsa.pub命令打印出来的所有内容,即开头的ssh-sha和结尾的xx@xxx也要一起复制

再次执行
Java代码  收藏代码
  1. ssh -p 29418 gerrit_fisrt_username@127.0.0.1  

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

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

执行
Java代码  收藏代码
  1. ssh -p 29418 gerrit_fisrt_username@127.0.0.1 gerrit create-project -n test_project  

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

5.简便ssh
在~/.ssh/目录下新建文件config
加入内容如下
Java代码  收藏代码
  1. Host gerrit_short  
  2.           User gerrit_fisrt_username  
  3.           Port 29418  
  4.           Hostname 127.0.0.1  
  5.           IdentityFile ~/.ssh/id_rsa  

以后执行
Java代码  收藏代码
  1. ssh -p 29418 gerrit_fisrt_username@127.0.0.1  

这个命令就可以简单的写成
Java代码  收藏代码
  1. ssh gerrit_short  

再比如
ssh -p 29418 gerrit_fisrt_username@127.0.0.1 gerrit create-project -n test_project
就可以简写为
Java代码  收藏代码
  1. ssh gerrit_short gerrit create-project -n test_project  

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

6.检出项目

通过上面的命令创建项目以后,除了在http://127.0.0.1:8080/可以看见以外,通过ssh也可以查看。
Java代码  收藏代码
  1. ssh gerrit_short gerrit ls-projects  

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

下面客户机就可以检出项目了:
Java代码  收藏代码
  1. 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.
这是因为test项目本身就是个空项目,所以还不存在头指针。
git的版本控制方式就像c语言里面的链表模型。每一次提交会产生一个新的节点,而这个新的节点同时还有个指向原来节点的链接。每一个头指针代表一个分支。头指针指向的是链表的最后一个节点。具体的模型可在progit.pdf中找到。

扯远了,扯回来。
8.第一次提交。
在刚此检出的test目录下新建一个文件readme.txt
执行:
Java代码  收藏代码
  1. git add readme.txt  

或者执行
Java代码  收藏代码
  1. git stage readme.txt  

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

接下来将文件提交到本地仓库,先配置git的默认编辑器
Java代码  收藏代码
  1. vi ~/.gitconfig  

加入如下内容;
Java代码  收藏代码
  1. [user]  
  2.         name = some_one_  
  3.         email = xxx@xxx.com  
  4. [core]  
  5.         editor = vim  

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

在vim中加入log并保存推出,即完成一次提交,注意此次是提交到本地仓库,和服务器没有关系。

9.push到远程仓库
  参考
执行
Java代码  收藏代码
  1. 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中是会失败的。后面再说。

结果却显示错误:
Java代码  收藏代码
  1. ...  
  2. To ssh://gerrit_fisrt_username@127.0.0.1:29418/test_project.git  
  3.  ! [remote rejected] master -> master (prohibited by Gerrit)  
  4. 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的地址:
Java代码  收藏代码
  1. git config remote.origin.push refs/heads/*:refs/for/*  

此命令实际是更改的是本地仓库test_project/.git/config文件。
再次puh
Java代码  收藏代码
  1. git push origin  

这次不要加master,
结果又出错
Java代码  收藏代码
  1. remote: ERROR:  You have not registered any email addresses.  

解决办法:
Java代码  收藏代码
  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 = 'yourmail@xx.com' where account_id = your_acc_id  
  11. #这里的your_acc_id就是select查询出来的gerrit_fisrt_username账户对应的account_id列中的值  
  12. $ java -jar bin/gerrit.sh start  

再次执行
Java代码  收藏代码
  1. git push origin  


恭喜你,push成功。

10。审核,验证、提交。
push成功以后,进入开打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的内容
  这样即完成了一次代码的共享过程
阅读(3984) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~