安装git和gitolite
首先,通过下面的命令安装git和gitolite
apt-get install git-core apt-get install gitolite
添加git用户组
adduser --system --group --shell /bin/bash --disabled-password git
配置密钥
接下来在本地机器生成ssh密钥,使用下面的命令
ssh-keygen -t rsa -C "[email protected]"
当然,如果你想为你的gitolite分配单独的密钥,可以使用下面的命令(生成名为git-admin的密钥)
ssh-keygen -C "[email protected]" -f ~/.ssh/git-admin
如果你使用了单独分配的密钥,你需要配置你的git在连接指定域名时使用不同的密钥,比如我们这里gitolite的管理域名是admin.xxx.com 。我们在刚才的.ssh文件夹新建config 文件(没有扩展名),内容如下
Host admin.xxx.com IdentityFile ~/.ssh/git-admin
这样就可以在连接admin.xxx.com的时候使用git-admin这组密钥了
初始化gitolite
下一步,将你的ssh公钥上传到服务器的某个位置,比如/tmp/git-admin.pub
然后切换到git用户,使用这个公钥初始化gitolite
su - git gl-setup /tmp/git-admin.pub
然后在持有私钥的机器管理gitolite即可,下面是clone命令,注意修改ip地址
git clone git@git_server_IP_address:gitolite-admin
关于gitolite的官方文档在这里:http://gitolite.com/gitolite/gitolite.html
自动部署
然后关于配置自动部署,首先我需要部署的网站目录权限为www-data:www-data
我把git用户添加到了www-data组中,通过后面权限设置为770保证网站和git都有足够的权限操作文件。使用下面的命令
usermod -a -G www-data git
然后网站目录,比如创建/home/nginx/xxx ,我们要把这个目录的用户组改成www-data并给予770权限,这样以后我们的git用户才能操作
然后我们切换到git用户,在/home/nginx/xxx 目录克隆本地库,使用下面的命令。注意clone后面最后有一个参数.
su - git git clone ~/repositories/xxx.git .
这样网站目录就初始化完成了,我们继续下面的操作(还是git用户的身份)
钩子文件创建在项目库的hooks文件夹~/repositories/xxx.git/hooks ,新建post-receive 文件,复制粘贴下面的内容,最后别忘了给予本脚本执行权限。就可以退出git用户身份了
#!/bin/bash while read oldrev newrev ref do branch=`echo $ref | cut -d/ -f3` echo "--- Current branch is : "$branch if [ "master" == "$branch" ]; then unset GIT_DIR NowPath=`pwd` echo "--- Now path is :"$NowPath DeployPath="/home/nginx/xxx" echo "--- Deploy path is :"$DeployPath cd $DeployPath echo "--- Go to deploy path" git add -A && git fetch origin && git reset --hard origin/master chmod -f -R 770 * chown -f -R git:www-data * echo "--- Deploy done" cd $NowPath echo "--- Fine" fi done exit 0
解释一下:
首先我们循环读取所有push的请求,当发现是push到master(也就是我们的部署分支)时,触发部署脚本,首先要清楚GIT_DIR环境变量,这样才能切换工作目录。然后我们切换到nginx的网站目录,使用git add -A && git fetch origin && git reset –hard origin/master 强制清除本地变化并更新到远程master分支。如果有网站自动生成的文件(比如用户上传的附件目录)不想被清空的,别忘了要写在.gitignore 文件里。当然网站生成的文件请确保权限在770以上,否则可能会导致git无权操作。在更新完远程master分支的代码后,更新文件权限为770,并将所有者改成www-data组(chmod使用末尾的*可以确保不会修改网站目录下.git这个隐藏目录内部的权限,同时-f用来屏蔽错误信息)
在编写本篇文章的时候感谢下面这位非常热心的博主解答我好多问题
https://argcv.com/articles/2078.c