Git是目前世界上最先进的分布式版本控制系统(没有之一)。开发者需要将提交到Git服务器上的代码进一步部署到Web服务器上。如果能够在提交代码到Git服务器的同时进行代码的自动部署则是最方便不过了。这篇文章中将会提供一个使用Git hooks进行自动部署的实例。
Git hooks
Git hooks是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为。Git 含有两种类型的钩子:客户端的和服务器端的。客户端的hooks由诸如提交和合并这样的操作所调用,而服务器端hooks作用于诸如接收被推送的提交这样的联网操作。Git服务器的搭建以及相关操作参照搭建Git服务器。
自动部署理论
首先要明确代码的分布情况,开发者电脑上的本地仓库、Git服务器上的远端仓库、web服务器上的另一个本地仓库(浏览器访问的就是这里的代码)。实现自动部署就是要当从开发者本地仓库提交代码到远端仓库的时候,自动把代码部署到web服务器的本地仓库,实现开发者本地仓库和web服务器的本地仓库的同步(即通过Git hooks中的post-receive脚本文件)。本文的Git服务器和Web服务器是同一台服务器。
原理与流程
- 用户在客户端执行git push操作
- 远程仓库发现有用户执行了push操作,就会执行一个脚本post-receive
- 在post-receive脚本中,将git仓库的代码拷贝到web站点目录下
创建Git仓库
在服务器端上创建Git仓库,有两种方式:
- Git普通仓库
git init /path/to/test.git
- Git裸仓库
git init --bare /path/to/test.git
两者区别:
普通git仓库的目录结构就和代码目录结构一致,只多了.git目录。.git目录中包含了git的一些配置等信息。裸仓库只保存了一些配置信息等,肉眼找不到上传的代码。
Git普通仓库和Git裸仓库的hooks所在位置不同。Git普通仓库hooks在.git/hooks/中,Git裸仓库hooks在hooks/中。hooks要做的事就是将代码从仓库中拷贝到web目录。
编写Git hooks脚本
在上述hooks目录中,创建post-receive文件,添加内容如下:
#!/bin/sh
DEPLOY_PATH=写Web站点目录
#将 master 以zip格式打包到指定文件(裸仓库中执行)
echo "git账号的密码" | sudo -S git archive --format zip --output file.zip master
#将打包好的剪切到web目录
echo "git账号的密码" | sudo -S mv file.zip $DEPLOY_PATH
unset GIT_DIR
cd $DEPLOY_PATH
echo "git账号的密码" | sudo -S unzip -o file.zip
echo "git账号的密码" | sudo -S rm -rf file.zip
echo "git账号的密码" | sudo -S chown www:www -R $DEPLOY_PATH
保存后赋予可执行权限:
sudo chmod +x /path/to/test.git/hooks/post-receive
sudo chown -R git:git /path/to/test.git
这里使用echo "git账号的密码" | sudo -S Command 是为了解决出现remote...Operation Not Permitted问题。
然后通过Git Bash在本地对远程仓库进行增加或删除修改操作,接着执行git push相关命令之后,便可完成代码的自动部署。关于Git Bash的相关内容可查看使用Hexo-Vexo搭建个人博客的安装git节。
拓展
在做项目的时候,Git服务器和Web服务器往往会分离,而且Web服务器往往不止一台。博客利用Git Hooks与rsync集群部署是一个使用Git hooks与rsync进行集群自动部署的实例。
参考链接
1.用 Git 钩子进行简单自动部署
2.使用 Git Hook 实现网站的自动部署
3.git hook实现代码自动部署