系统: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
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:完成之后大概是这个样子
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 的代码才真正到了远程库.而且中间经过了审核过程
ssh -p 29418 [email protected] gerrit create-project -n test_project
添加一个项目。
在webUI就可以看到此项目了
5.简便ssh
在~/.ssh/目录下新建文件config
加入内容如下
Host gerrit_short
User gerrit_fisrt_username
Port 29418
Hostname 127.0.0.1
IdentityFile ~/.ssh/id_rsa
以后执行
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也可以查看。
ssh gerrit_short gerrit ls-projects
将会输出2个项目名称
all_project
test_project
一个是内置的,一个是刚才建立的。(使用管理员账户才能看到内置的all_project项目)
下面客户机就可以检出项目了:
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的默认编辑器
vi ~/.gitconfig
加入如下内容;
[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中是会失败的。后面再说。
结果却显示错误
...
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的地址:
git config remote.origin.push refs/heads/*:refs/for/*
此命令实际是更改的是本地仓库test_project/.git/config文件。
再次push
git push origin
这次不要加master,
结果又出错
remote: ERROR: You have not registered any email addresses.
解决办法:
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
再次执行
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的内容
这样即完成了一次代码的共享过程。