搭建Git服务器及web站点自动化部署
作为预备役码农,从半年前开始学习使用Github,之后一直将代码托管在线上仓库中.后来网站代码需要多人协同工作,而且项目不太适合放在Github中,便需要将实验室服务器搭建成私有的Git服务器.
Git的个人服务器搭建并不麻烦,但是实验室只有这一台服务器,需要在提交推送代码的同时,将网站同时也部署好,以达到边修改边查看页面效果的目的.
Git个人服务器的搭建及测试
Git的安装
1.在服务器端和开发机端都需要在shell中输入以下命令来安装Git
#ubuntu系统Git的安装
sudo apt-get install git-core
2.因为netbeans上对Git的支持很好,所有没有配置常用的ssh协议,这个协议的最直接好处就在于每次向Git提交推送都不需要输密码,由于没有尝试就不写步骤了,Github官方教程可以一看http://help.github.com/articles/generating-ssh-keys
Git服务器端配置
1.新建用户,作为Git服务器代码仓库的管理者.
sudo useradd -m github
#-m功能是Create the user's home directory if it does not exist(若用户home目录不存在,则创建)
sudo passwd github
2.建立Git仓库目录
#我的Git仓库目录在/home/github/website/中,因人而异
sudo mkdir /home/github/website
#↓将仓库目录权限设置为仅github用户可操作
sudo chown github:github /home/github/website
sudo chmod 700 /home/github/website
3.创建仓库文件夹
#切换到github用户
su github
#进入website目录
cd /home/github/website/
#创建仓库文件夹
mkdir repository
#初始化为bare仓库
git init --bare
git init和git init –bare的区别:
用git init初始化的版本库,其保存的都是原文件,但某些用户的push操作可能导致冲突.而git init –bare创建的是裸仓库,它不保存原文件而只保存git历史提交的版本信息,并不允许用户直接在上面进行git操作.
Git客户机(开发)操作
Git服务器配置好后就可以直接git remote并提交推送到远程仓库中了.
1.创建本地Git仓库目录
#创建目录并git初始化
cd /var/www/website/
git init
2.添加文件及提交测试
#创建index.php并将hello world写入
touch index.php | echo 'hello world' > index.php
#添加跟踪
git add index.php
#添加远程主机,username@yourserverip:address
git remote add origin github@192.168.1.100:/home/github/website/repository
#提交
git commit -am 'new page'
#推入
git push origin master
3.如果推入成功,那么在远程仓库已经能够得到最新的版本了.
Git自动部署
Git本身可以调用自定义的Hooks脚本,分为两类:客户端和服务器端.客户端Hooks用于客户端的操作,例如提交和合并.服务器端Hooks用于服务器端操作,比如接收推入的提交.在此处,我们自动部署的思路就是每当服务器接收到客户机(开发)的推入,就自动将更新pull到apache的DocumentRoot中去.
Git的hooks主要包括:
applypatch-msg
post-update
pre-rebase
commit-msg
pre-applypatch
update
post-commit
pre-commit
post-receive
prepare-commit-msg
此处我们用post-receive这个hook,即在post(push)请求之后执行.
1.在服务器端Git仓库目录的hooks中编辑post-receive
#切换用户获得权限
su github
cd /home/github/website/repository/hooks
#创建或编写post-receive文件
vim post-receive
2.在apache的DocumentRoot中clone仓库
cd /var/www
mkdir website
cd website
git clone /home/github/website/repository ./
写了很简单的部署代码,因为push后还需要其他验证,所以仍需要更新,此处仅做最简单的pull操作作为参考
#!/bin/sh
unset $(git rev-parse --local-env-vars)
wwwPath=/var/www/website
cd $wwwPath
git pull origin master
最后需要将脚本改为允许执行
chmod +x post-receive
刚编写的时候想当然认为推入后直接pull到目录即可,就没有写
unset $(git rev-parse --local-env-vars)
这一句.远程服务器一直不能pull到最新数据,以为是权限问题,但通过调试发现post-receive有执行,但终端有报错
remote :fatal: Not a git repository:'.';
网上搜了一下发现Git的hooks在要执行的时候会调用GIT_DIR这个环境变量,总之写入unset之后问题就解决了,也能pull到最新数据了.
注:git的自动部署需要权限,务必确认推入的用户拥有写入apache的DocumentRoot的权限.