安装Gitosis并且实现web管理与自动化部署

###环境描述

  • 两台Macbook作为开发机(Work and Home)

  • Centos 作为服务器端

###一、Gitosis

1、安装 GitPython-setuptools 【服务器】

1
yum install git-core python-setuptools

2、安装 Gitosis (最好使用root操作,或使用sudo)【服务器】

1
git clone https://github.com/res0nat0r/gitosis.git && cd gitosis && python setup.py install

3、添加Git用户【服务器】

1
useradd -m git

4、生成公共密钥用来初始化Gitosis,我这里就选择在服务器端做初始化了。【服务器】

1
2
ssh-keygen -t rsa #不需要密码,一路回车就行
cp ~/.ssh/id_rsa.pub /tmp # 放到tmp是因为所有用户都对其有权限操作

5、初始化gitosis。【服务器】

1
2
3
su git # 切换到git用户下
gitosis-init < /tmp/id_rsa.pub # 第四步传过来的, **/tmp**为所有用户都有权限
rm /tmp/id_rsa.pub # id_rsa.pub已经无用,可删除.

6、获取并配置gitosis-admin,切换到root用户的家目录,也就是/root【服务器】

1
git clone git@xxx:gitosis-admin.git  #xxx替换成你的服务器的host

上一步成功后应该会在目录下生成一个 gitosis-admin 的文件夹,并且里面的目录结构应该是

1
2
- gitosis.conf
- keydir

7、添加所有开发机的公共密钥,也就是在每台开发机作如下操作:【开发机】

1
2
ssh-keygen -t rsa  # 一路回车
scp ~/.ssh/id_rsa.pub root@xxx:/tmp/此台开发机的标识.pub # 上传你的ssh public key到服务器

8、配置仓库 【服务器】

首先我们要把第七部上传的密钥copy到 /root/gitosis-admin/keydir/ 下面:

1
cp /tmp/开发机标识1.pub /tmp/开发机标识2.pub.... /root/gitosis-admin/keydir

我们打开 /root/gitosis-admin/gitosis.conf

1
vim gitosis-admin/gitosis.conf

我们会看到如下内容:(members @后面的内容会有所差异)

1
2
3
4
[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = root@root

然后在上面的代码下添加如下内容:

1
2
3
[group 组名]
writable = 项目名
members = 用户 # 这里的用户名字 要和 keydir下的文件名字相一致(不需要.pub扩展名),如果有多个请用 空格 分开

最后我们使用 wq 进行保存,然后在使用如下命令,把刚刚修改的配置上传到git:

1
2
3
4
cd /root/gitosis-admin/
git add --all
git commit -m '添加操作与对应权限...'
git push

至此我们服务器端的 Gitosis 就部署完毕了,上面在配置文件里面添加的库还没有创建,不过这不需要我们手动进行创建,我们继续进行下一步。

9、push 文件到版本库【开发机】

我们在任意位置创建一个文件夹用来放置版本库

1
2
3
4
5
6
7
mkdir /data/project
cd /data/project
git init
echo 'hello' > hello.txt
git add --all
git commit -m 'push通知服务端创建版本库'
git push git@xxx:project.git master

注意:如果上面没有 echo 'hello' > hello.txt 操作,并且你的文件夹下没有任何文件,在push的会提示error: src refspec master does not match any. error: failed to push some refs to ‘git@xxx:project.git’` 错误。

10、在另外一台开发机拉取版本库进行测试

1
2
3
cd 任意位置
git init
git clone git@xxx:project.git

如果能成功拉去则表示配置争取,如果提示没有权限,请验证7、8步骤是否操作正确。

###二、自动化部署

一般的开发环境如下:

Dev -> Test -> web

当我们在本地测试无误后,需要提交版本,这个时候我们就要去服务器手工进行 git pull 操作,刚用 git 的时候,天真的使用了 crontab 做了个定时拉取任务,但这样是极其不科学的,后来得知 git 也有钩子(hooks),可以在 git push 操作的时候自动部署。

1
2
3
4
5
6
 #hooks文件夹下存储了各种钩子的实例文件
#如果要添加post-update钩子,则将post-update.sample后面的.sample去掉即可,当用户提交后,git会自动在hooks目录下寻找名为post-update的文件,若找到则执行其中代码
cd /home/git/repositories/web.git/hooks
#创建post-update文件
touch post-update
vim post-update

然后我们编辑 post-update 文件:

1
2
3
4
DEPLOY_DIR=/var/www/html/
unset GIT_DIR #!important 如果不使用这句,是无法改变下面git pull的执行环境的
cd $DEPLOY_DIR
git pull origin master

这样当我们每次进行 git push的时候,git就会在 /var/www/html/ 下面自动进行 git pull origin master ,当然使用这条命令需要 git 用户,并且你要保证在 /var/www/html/ 目录下 git 用户是有操作权限的。

###三、Web可视化
我们或许并不想做成 Github,但有些时候需要更快捷方便的浏览代码,就需要配置web可视化了。

####一、Instaweb

1
2
yum install lighttpd
git instaweb

然后就可以使用 http://host:1234 浏览了。

###补充
以上内容来源于网络,因为在配置中遇到了许多的问题,所以自己整理了一下,留作日后查看备用。

参考如下: