搭建自己的git gitweb gerrit服务器
软硬件环境
物理机:Windows10 64位
VMware版本:VMware Workstation 12
Ubuntu版本:ubuntu-14.04-server-amd64.iso
安装Ubuntu
VMware下Ubuntu Server 14.04安装教程,参考:
https://www.jianshu.com/p/0f0ed7d8e06e
教程里已经教我们安装了ssh服务,与该教程不一样的点:
1. 我分配给虚拟机硬盘共100G
2. 创建的用户名是我这里是叫flinger
3. 分区的设置我选择了Manuel手动设置,参考:
https://blog.****.net/chang_ge/article/details/52653033
我的分区情况如下:
1GB for /boot partition ext4
4GB for swap partition swap
75GB for / partition ext4
The rest for /home partition ext4
安装完成后,用flinger账号登录,顺便给root用户设置下密码:
sudo passwd
设置root用户的密码即可
设置固定IP
作为server一般是要用静态IP的,把DNS地址也配置下,方法如下:
sudo vi /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.110
netmask 255.255.240.0
gateway 192.168.2.1
dns-nameservers 8.8.8.8 114.114.114.114 223.5.5.5
dns-search foo.org bar.com
保存退出,重启网卡(需根据你的实际情况配置)
sudo ifdown eth0
sudo ifup eth0
或者重启系统
sudo reboot
可以看到我这里IP固定设置为192.168.1.110
安装版本控制系统——git
安装git
sudo apt-get install git
git的基本操作,请参考:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
添加一个用户名为gerrit的用户,专门用来管理git仓库
sudo adduser gerrit
并将gerrit加入sudo权限,仿照root添加一行,用wq!保存退出
sudo vi /etc/sudoers
gerrit ALL=(ALL:ALL) ALL
在flinger家目录生成ssh公钥和私钥,一路敲回车默认即可
cd ~flinger
ssh-****** -t rsa -C "[email protected]"
注意,这个邮箱是要能用的邮箱,如qq邮箱、163邮箱等
把flinger用户的ssh公钥复制到git用户的authorized_keys文件
sudo cat /home/flinger/.ssh/id_rsa.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
初始化一个git仓库(仓库名一般都是.git结尾)
cd /srv
sudo mkdir -p repositories/sample.git
sudo git init --bare repositories/sample.git
把owner改为gerrit,gerrit要对该目录有读写权限才行
sudo chown -R gerrit:gerrit repositories
现在可以通过git clone命令克隆远程仓库
cd ~flinger
git clone [email protected]:/srv/repositories/sample.git
git配置一下(个人喜好,--global表示对当前用户有效)
git config --global alias.st status
git config --global alias.br branch
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global core.editor vim
git config --global user.email "[email protected]"
git config --global user.name "flinger"
注意,这里配置的邮箱要跟刚才生成rsa公钥私钥的那个邮箱一致
cd sample
touch hello.txt
vi hello.txt
随便编辑一下hello.txt的内容,保存退出
git add hello.txt
git commit
会启动vi编辑器,写一句注释:add a hello.txt file,保存退出
可以看一下git log
git lg
由于远程库是空的,所以首次push需要加上-u参数,之后就不用-u参数了
git push -u origin master
这时你可以创建别的用户,也同样来clone一下这个sample仓库,模拟多人协作
我创建了一个toby用户,git clone拉下来这个sample project后,更新了两笔commit,push到服务端
(注意:同样要把toby的ssh公钥添加到git用户的authorized_keys)
用toby用户也添加了一条修改并提交了
这时在finger用户这边用git pull来拉到最新就可以看到toby用户的提交了
这种方法适合团队很小的公司,把每个人的公钥收集起来放到服务器的/home/gerrit/.ssh/authorized_keys 文件里是可行的
安装最简单的网页版本管理系统——gitweb
参考:
https://blog.****.net/xl_name/article/details/79617652
安装gitweb和apache2
cd ~flinger
sudo apt-get install apache2 apache2-utils git-core gitweb
修改配置文件(因为gitweb在/etc/apache2/conf.d/下安装了配置文件,但这个目录是过时的)
sudo cp /etc/apache2/conf.d/gitweb /etc/apache2/conf-available/gitweb.conf
cd /etc/apache2/conf-enabled/
sudo ln -s ../conf-available/gitweb.conf gitweb.conf
修改gitweb.conf 如下:
sudo vi ../conf-available/gitweb.conf
在FollowSymLinks前面加上了"+"解决语法问题
使能cgi:
ubuntu中gitweb cgi脚本应该默认放在/usr/lib/cgi-bin/中,刚好和apache2默认的cgi-bin目录一致
sudo a2enmod cgi
sudo service apache2 restart
修改/etc/gitweb.conf,添加上项目信息:
sudo vi /etc/gitweb.conf
$projectroot = "/srv/repositories";
$projects_list = $projectroot;
再重启下apache2
sudo service apache2 restart
这时候可以在其他机器的浏览器访问了:http://192.168.1.110/gitweb
可以看到之前finger和toby的提交记录
安装代码审核服务器——gerrit
参考:
https://blog.****.net/sfr2017/article/details/82049375
https://blog.****.net/kanyueliang410/article/details/79182043
https://www.cnblogs.com/tesky0125/p/5877536.html
http://www.cnblogs.com/kevingrace/p/5624122.html
切到gerrit用户并跳到家目录
sudo su gerrit
cd ~gerrit
安装java,由于gerrit是基于java开发的,因此我们需要安装java
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
Java的安装目录是/usr/lib/jvm/java-1.8.0-openjdk-amd64
安装完Java后可以用java -version看一下当前版本是否正确
配置java环境变量,在profile最后添加这3行
sudo vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
重跑一下这个脚本
source /etc/profile
下载gerrit安装包
wget https://gerrit-releases.storage.googleapis.com/gerrit-2.13.6.war
当前目录下得到了这个文件
安装gerrit
java -jar gerrit-2.13.6.war init -d review_site
安装期间它会让你配置一些东西,注意:
1. review_site 会自动帮你创建的这个目录
2. gerrit->basePath修改成你自己的git仓库路径
3. Behind reverse proxy 要选 y
4. Install Verified label 要选 y
5. 邮箱设置要根据实际来填写,qq邮箱或163邮箱的密码不是用一般的登录密码,而是一个叫授权码的东西,需要在qq邮箱或163邮箱设置里面生成或设置
6. [sendmail]的密码会另保存到review_site/etc/secure.config文件里,一定要保证gerrit.config文件里的密码和secure.config里的密码一致!
7. gerrit->canonicalWebUrl修改成你的IP,端口号随便改成9999
8. httpd->listenUrl随意改成8888,为了不跟原来的8080端口冲突
Waiting for server on 192.168.1.110:9999 ...,按Ctrl+C关闭等待
qq邮箱可以找到相关信息
在gerrit里集成gitweb
查看gitweb相关配置文件安装路径
sudo dpkg -L gitweb
找到这行:/usr/lib/cgi-bin/gitweb.cgi
添加到gerrit.config中
cd ~gerrit
sudo vi ./review_site/etc/gerrit.config
[gitweb]
type = gitweb
cgi = /usr/lib/cgi-bin/gitweb.cgi
修改邮箱配置,[sendemail]这一段要这样子设置,邮箱号和密码(授权码)是你的
vi ./review_site/etc/gerrit.config
[sendemail]
enable = true
smtpServer = smtp.qq.com
smtpServerPort = 465
smtpEncryption = SSL
smtpUser = [email protected]
smtpPass = abcdefghijklmnop
sslVerify = false
from = [email protected]
我的配置截一下图
添加gerrit管理员账户,设置帐号密码(这里配的账号是gerrit,密码是123456)
touch ./review_site/etc/passwd
htpasswd -b ./review_site/etc/passwd gerrit 123456
修改配置,在Listen 80的下面追加Listen 9999
sudo vi /etc/apache2/ports.conf
Listen 80
Listen 9999
用HTTP需要配置反向代理
sudo touch /etc/apache2/sites-available/gerrit.conf
sudo vi /etc/apache2/sites-available/gerrit.conf
<VirtualHost *:9999>
ServerName 192.168.1.110
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
</Location>
AllowEncodedSlashes On
ProxyPass / http://192.168.1.110:8888/
</VirtualHost>
启用gerrit.conf文件配置,相当于在/etc/apache2/sites-enabled/创建了gerrit.conf的软连接,apache2.conf会去该目录下包含它
sudo a2ensite gerrit.conf
开启一些模块
sudo a2enmod proxy
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
重启gerrit和apache2服务
./review_site/bin/gerrit.sh restart
sudo /etc/init.d/apache2 restart
重启apache2可能遇到错误AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message。
解决办法:
sudo vi /etc/apache2/apache2.conf,最后追加一句:ServerName localhost:9999
再重启一下apache2
sudo /etc/init.d/apache2 restart
说明:./review_site/bin/gerrit.sh stop; ./review_site/bin/gerrit.sh run 这个run相当于start,但同时可以看到log,排错用
这时候可以在其他机器的浏览器访问了:http://192.168.1.110:9999/
第一个登录gerrit网页的用户默认就是gerrit管理员账户,这里用的账号是gerrit,密码是123456
注册管理员邮箱,这里我用163邮箱账号作为gerrit管理员的邮箱,此处的邮箱跟上面配置的qq邮箱不是同一个!注册后,上面配置的qq邮箱账号会发一封验证邮件给到这个163邮箱账号,点击跳转后即可验证完毕!
退出登录时,可以点页面右上角账号gerrit有个“Sign Out”
由于gerrit账号只负责管理gerrit,一般无需上传代码或者审核代码,建议不用输入SSH Public Keys
为flinger和toby用户添加访问gerrit的权限
htpasswd -b ./review_site/etc/passwd flinger 123456
htpasswd -b ./review_site/etc/passwd toby 123456
添加完成,gerrit和apache2服务不需要重启
注意:用htpasswd创建的用户,并没有往gerrit中添加账号,只有当该用户通过web登陆gerrit服务器时,该账号才会被添加进gerrit数据库中
为普通用户注册邮箱和添加公钥
如果在同一台电脑上操作,刚才已经用gerrit账户登录了浏览器,这时需要登出,否则下次再访问http://192.168.1.110:9999/会直接以之前的用户默认登录
在客户端浏览器用flinger这个账号登录http://192.168.1.110:9999/,新用户首次登录会提示要注册邮箱
如果后期想再注册邮箱的话,可以在gerrit网页右上角账号上,Settings->Contact Information->Register New Email ...,填入邮箱账号,点击Register后,登录你刚才注册的邮箱,**即可
点击验证链接之后,就可以看到Preferred Email有下拉菜单的选项了
添加/home/flinger/.ssh/id_rsa.pub到gerrit网页Settings->SSH Public Keys
登出flinger用户
同理,用toby账户登录http://192.168.1.110:9999/,也添加toby的邮箱账号和ssh公钥
测试SSH key是否提交成功,可以在客户端执行以下命令就可以知道
ssh -p 29418 [email protected]
ssh -p 29418 [email protected]
所以这里,共用到了4和邮箱了
gerrit.config 用了一个qq账号,用于发送验证链接到各个用户
gerrit管理员 用了一个163账号
flinger用户 用了一个我的企业邮箱账号
toby用户 用了另一个qq账号
创建用户组
注意:只有管理员组的用户才能创建group和Project
在gerrit网页上,People->Create New Group,输入自定义的组名(我这里叫Developers)
然后点击Developers,添加成员,我这里添加了flinger和toby进来这个组
添加完的效果如下
创建项目
在gerrit网页上,Projects->Create New Projects,如果不想创建新项目,可以点击List看看目前都有哪些已存在的project
可以看到我们之前在《安装git》章节创建的sample项目,此处再以sample为例
点击该项目,可以看到有 anonymous http|http|ssh 三种clone的方式,我这里选择ssh
flinger用户就可以使用该命令去下载这个sample project
git clone ssh://[email protected]:29418/sample
flinger用户可以用git lg(需要git配置别名)可以看到有两条记录了,这些都是之前在《安装git》章节添加的
同理,toby用户也可以使用git clone ssh://[email protected]:29418/sample去拉这个project下来
设置权限
只有gerrit管理员有权限为普通用户设置权限
在gerrit网页上,Projects->List->sample->Access,点击Edit即可为sample创建访问权限
点击Add Reference
Reference栏先默认不改,点击Add Permission
一路添加权限 (Rights Inherit From:权限默认继承自All-Projects)
最终效果如下图 (Exclusive打钩表示覆盖All-Projects的默认权限),最后点击Save Changes
默认情况下,只有gerrit的管理员才能查看gitweb,普通用户要想访问gitweb,需要添加/refs/meta/config这一栏
关于更多gerrit权限的问题,可以参考
http://www.cnblogs.com/kevingrace/p/5651447.html
https://blog.****.net/chenjh213/article/details/50571190
接下来用flinger账号添加一笔修改并push到服务器,命令如下
git push origin HEAD:refs/for/master
HEAD:refs/for/master表示将代码将本地的HEAD传到远端的master分支,固定格式就是这样
你会发现报错:missing Change-Id in commit message footer
该过程用来在commit-msg中自动加入change-id,gerrit流程必备!
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 [email protected]:hooks/commit-msg ${gitdir}/hooks/
git commit --amend
git push origin HEAD:refs/for/master
push成功
在gerrit网页上,gerrit管理员和普通用户flinger看到的页面如下
gerrit管理员用户这里,All->Open可以看到有一笔修改,点击进去
gerrit管理员用户有verify +1和code review +2的权限 (之前配置的)
flinger用户有Verify +1的权限 (之前配置的)
flinger用户可以选择Verify +1,然后gerrit管理员可以选择+2,最后flinger和gerrit都可以点Submit提交这笔修改到服务器
该过程的动作,flinger注册的邮箱,都会收到相关邮件的提醒,nice!
这时toby用户可以用git pull来拉取最新的修改到本地
当然,toby用户也可以提交自己的修改,然gerrit来code review +2,最后Submit提交
设置开机启动,添加下面两行:
sudo vi /etc/rc.local
/home/gerrit/review_site/bin/gerrit.sh start
sudo /etc/init.d/apache2 restart
exit 0
评审过程通常有三个人参与:代码提交,代码验证(Verify),代码审查(code Review)
通常由自动测试工具jenkins完成代码验证(Verify),此处有人工来进行Verify,因为没安装Jenkins
git gitweb gerrit的搭建,此处就先告一段落!
引用别人的一小段话:
code review的目的是团队成员在一起共同学习,而不是相互“挑错”。将code review称为代码回顾好一些,如果大家放弃“挑错”来共同学习,那么代码回顾中学习什么呢?
代码回顾的学习重点是团队成员共同识别模式,这里的模式是指程序员编写代码的习惯,包括“好模式”和“反模式”。
像富有表达力的命名,单一职责的方法,良好的格式缩进等,都是“好模式”。
团队成员通过阅读最近编写的测试代码和生产代码来识别“好模式”和“反模式”。
既是团队成员之间相互学习的过程,也是团队整体达成整洁代码共识的过程。
以下操作,希望对你有帮助:
打开数据库
cd ~gerrit
./review_site/bin/gerrit.sh stop
cd ./review_site/bin/
java -jar gerrit.war gsql -d ../
使用sql命令增删改查,如查询账户信息:
gerrit> select * from ACCOUNT_EXTERNAL_IDS;
可以修改数据库插入邮箱,可以不用在gerrit网页上注册了!慎用!
gerrit> insert into ACCOUNT_EXTERNAL_IDS values('1000000', '[email protected]', 'NULL', 'mailto: [email protected]');
gerrit> insert into ACCOUNT_EXTERNAL_IDS values('1000001', '[email protected]', 'NULL', 'mailto:[email protected]');
退出:
gerrit> \q
删除数据库:
gerrit> DROP ALL OBJECTS;
删除所有仓库和gerrit数据库、缓存
cd ~gerrit
rm -rf /srv/repositories/All-Projects.git/
rm -rf /srv/repositories/All-Users.git/
rm -rf ./review_site/db/*
rm -rf ./review_site/cache/*
重新安装一遍gerrit
java -jar gerrit-2.13.6.war init -d review_site
Install Verified label [y/N]? y
IBehind reverse proxy [y/N]? y
这时候去看 /srv/repositories 这目录已经又自动生成了两个git project了
All-Projects.git
All-Users.git